Estos apuntes son libres y los puedes editar.

Algunas secciones están en inglés puedes colaborar traduciendo algunos párrafos.

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 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 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 read_XLI para leer un modelo y write_XLI para escribirlo. Véase también 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;

QR Code
QR Code gnu_mathprog (generated for current page)