AMPL:集的语法?

时间:2019-06-10 19:20:13

标签: set ampl

我正在为混合整数线性程序(MILP)开发高级语言。该语言是用于数学编程语言(AMPL)的建模语言。

第65章第4页,图4-7显示了以下语法:

set PROD := bands coils plate ;

但是,第74页第5章显示了以下语法:

set PROD = {"bands", "coils", "plate"};

有人可以解释这种语法差异吗?

我将后者放入* .dat文件中,AMPL抱怨expected ; ( : or symbol{所在的位置。想知道这是否只是手册中的错误。

谢谢。

1 个答案:

答案 0 :(得分:1)

第4章中的语法-

set PROD := bands coils plate;

-用于数据文件,而第5章中的语法-

set PROD = {"bands", "coils", "plate"};

-用于模型文件。在模型和数据文件中,集合的语法不同,这有点怪异(IMO),但事实却是不同的。有关此差异的另一个示例,请参见this question and answer

由AMPL手册修改的完整工作示例代码

由问题的原始张贴者添加。

dietu.mod:

# dietu.mod
#----------
# set MINREQ;   # nutrients with minimum requirements
# set MAXREQ;   # nutrients with maximum requirements
set MINREQ = {"A", "B1", "B2", "C", "CAL"};
set MAXREQ = {"A", "NA", "CAL"};

set NUTR = MINREQ union MAXREQ;    # nutrients
set FOOD;                          # foods

param cost {FOOD} > 0;
param f_min {FOOD} >= 0;
param f_max {j in FOOD} >= f_min[j];

param n_min {MINREQ} >= 0;
param n_max {MAXREQ} >= 0;

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_Min {i in MINREQ}:
   sum {j in FOOD} amt[i,j] * Buy[j] >= n_min[i];

subject to Diet_Max {i in MAXREQ}:
   sum {j in FOOD} amt[i,j] * Buy[j] <= n_max[i];

集合MINREQMAXREQ及其成员的显式定义来自下面的* .dat文件(其中的定义已被注释掉)。 Matlab用户,请注意上述几点并当心您需要集合中成员之间的逗号。

dietu.dat:

# dietu.dat
#----------
data;

# set MINREQ := A B1 B2 C CAL ;
# set MAXREQ := A NA CAL ;
set FOOD := BEEF CHK FISH HAM MCH MTL SPG TUR ;

param:   cost  f_min  f_max :=
  BEEF   3.19    2     10 
  CHK    2.59    2     10 
  FISH   2.29    2     10 
  HAM    2.89    2     10 
  MCH    1.89    2     10 
  MTL    1.99    2     10 
  SPG    1.99    2     10 
  TUR    2.49    2     10  ;

param:   n_min  n_max :=
   A      700   20000
   C      700       .
   B1       0       .
   B2       0       .
   NA       .   50000
   CAL  16000   24000 ;

param amt (tr):   A    C   B1   B2    NA   CAL :=
          BEEF   60   20   10   15   938   295
          CHK     8    0   20   20  2180   770
          FISH    8   10   15   10   945   440
          HAM    40   40   35   10   278   430
          MCH    15   35   15   15  1182   315
          MTL    70   30   15   15   896   400
          SPG    25   50   25   15  1329   370
          TUR    60   20   15   10  1397   450 ;

在AMPL提示符下使用以下命令解决模型:

reset data;
reset;
model dietu.mod;
data dietu.dat;
solve;