====== GNU MathProg ====== Nota: Esta página es la traducción al español de [[http://lpsolve.sourceforge.net/5.5/MathProg.htm]] ---- ===== Introducción ===== GNU MathProg es un lenguaje de modelización para la descripción de modelos de programación matemática lineal. Un modelo escrito el lenguaje GNU MathProg consiste en un conjunto de instrucciones y bloques de datos construidos por el usuario. Véase [[http://gnuwin32.sourceforge.net/downlinks/glpk-doc-zip.php]] para una descripción completa de este lenguaje de modelado. GNU MathProg es parte de GLPK solver. Las páginas principales son [[http://www.gnu.org/software/glpk/glpk.html]] y [[http://gnuwin32.sourceforge.net/packages/glpk.htm]]. Obsérvese que MathProg es un subconjunto del lenguaje de modelización AMPL. Véase [[http://lpsolve.sourceforge.net/5.5/AMPL.htm|Using lpsolve from AMPL]]. El XLI usado por lp_solve para leer estos modelos está derivado de este código. lp_solve puede leer, escribir y resolver estos modelos MathProg directamente vía el driver xli_MathProg (véase [[http://lpsolve.sourceforge.net/5.5/XLI.htm|External Language Interfaces]]. Puede leer los modelos en el formato anterior y puede resolverlos. Por ejemplo: lp_solve -rxli xli_MathProg Diet1.mod Que da como resultado: Value of objective function: 88.2 Actual values of the variables: Buy[BEEF] 0 Buy[CHK] 0 Buy[FISH] 0 Buy[HAM] 0 Buy[MCH] 46.6667 Buy[MTL] 0 Buy[SPG] 0 Buy[TUR] 0 MathProg tiene también la posibilidad de tener el modelo y los datos en dos ficheros separados. lp_solve puede tratar esta situación. Por ejemplo: lp_solve -rxli xli_MathProg diet.mod -rxlidata diet.dat Que da como resultado: Value of objective function: 88.2 Actual values of the variables: Buy[BEEF] 0 Buy[CHK] 0 Buy[FISH] 0 Buy[HAM] 0 Buy[MCH] 46.6667 Buy[MTL] 0 Buy[SPG] 0 Buy[TUR] 0 ===== Generación de modelos MathProg ===== El XLI puede crear modelos MathProg, no obstante no usa las capacidades del lenguaje. Las restricciones se escriben línea a línea. Pero puede ser el comienzo. Por ejemplo: lp_solve model.lp -wxli xli_MathProg model.mod Resulta model.mod: /* Variable definitions */ var x >= 0; var y >= 0; /* Objective function */ maximize obj: +143*x +60*y; /* Constraints */ R1: +120*x +210*y <= 15000; R2: +110*x +30*y <= 4000; R3: +x +y <= 75; ===== API ===== Use la llamada a [[http://lpsolve.sourceforge.net/5.5/read_XLI.htm|read_XLI]] para leer un modelo y [[http://lpsolve.sourceforge.net/5.5/write_XLI.htm|write_XLI]] para escribirlo. Véase también [[http://lpsolve.sourceforge.net/5.5/XLI.htm|External Language Interfaces]]. El XLI puede ser usado desde el IDE. No obstante, algunas líneas deben ser añadidas en LpSolveIDE.ini (en la carpeta de instalación del IDE). En la sección [XLI] debe añadirse lo siguiente: lib1=xli_MathProg Además, debe añadirse una nueva sección para MathProg XLI: [xli_MathProg] extension=.mod language=MATHPROG Asegúrese de que xli_MathProg.dll está disponible para el IDE. Para ello ponga este dll en la carpeta del IDE o en la carpeta system32 de Windows. ===== Ejemplos ===== ==== Diet1.mod ==== set NUTR; set FOOD; param cost {FOOD} > 0; param f_min {FOOD} >= 0; param f_max {j in FOOD} >= f_min[j]; param n_min {NUTR} >= 0; param n_max {i in NUTR} >= n_min[i]; param amt {NUTR,FOOD} >= 0; var Buy {j in FOOD} >= f_min[j], <= f_max[j]; minimize total_cost: sum {j in FOOD} cost[j] * Buy[j]; subject to diet {i in NUTR}: n_min[i] <= sum {j in FOOD} amt[i,j] * Buy[j] <= n_max[i]; data; set NUTR := A B1 B2 C ; set FOOD := BEEF CHK FISH HAM MCH MTL SPG TUR ; param: cost f_min f_max := BEEF 3.19 0 100 CHK 2.59 0 100 FISH 2.29 0 100 HAM 2.89 0 100 MCH 1.89 0 100 MTL 1.99 0 100 SPG 1.99 0 100 TUR 2.49 0 100 ; param: n_min n_max := A 700 10000 C 700 10000 B1 700 10000 B2 700 10000 ; param amt (tr): A C B1 B2 := BEEF 60 20 10 15 CHK 8 0 20 20 FISH 8 10 15 10 HAM 40 40 35 10 MCH 15 35 15 15 MTL 70 30 15 15 SPG 25 50 25 15 TUR 60 20 15 10 ; end; ==== diet.mod ==== set NUTR; set FOOD; param cost {FOOD} > 0; param f_min {FOOD} >= 0; param f_max {j in FOOD} >= f_min[j]; param n_min {NUTR} >= 0; param n_max {i in NUTR} >= n_min[i]; param amt {NUTR,FOOD} >= 0; var Buy {j in FOOD} >= f_min[j], <= f_max[j]; minimize total_cost: sum {j in FOOD} cost[j] * Buy[j]; subject to diet {i in NUTR}: n_min[i] <= sum {j in FOOD} amt[i,j] * Buy[j] <= n_max[i]; ==== diet.dat ==== set NUTR := A B1 B2 C ; set FOOD := BEEF CHK FISH HAM MCH MTL SPG TUR ; param: cost f_min f_max := BEEF 3.19 0 100 CHK 2.59 0 100 FISH 2.29 0 100 HAM 2.89 0 100 MCH 1.89 0 100 MTL 1.99 0 100 SPG 1.99 0 100 TUR 2.49 0 100 ; param: n_min n_max := A 700 10000 C 700 10000 B1 700 10000 B2 700 10000 ; param amt (tr): A C B1 B2 := BEEF 60 20 10 15 CHK 8 0 20 20 FISH 8 10 15 10 HAM 40 40 35 10 MCH 15 35 15 15 MTL 70 30 15 15 SPG 25 50 25 15 TUR 60 20 15 10 ; ==== model.lp ==== /* model.lp */ max: 143 x + 60 y; 120 x + 210 y <= 15000; 110 x + 30 y <= 4000; x + y <= 75;