AMPL:集合的语法?
AMPL: Syntax for sets?
我正在为混合整数线性程序 (MILP) 开发高级语言。该语言是数学编程语言的建模语言 (AMPL)。
第 4 章,第 65 页,图 4-7 显示了以下语法:
set PROD := bands coils plate ;
但是,第 5 章第 74 页显示了以下语法:
set PROD = {"bands", "coils", "plate"};
谁能解释一下这种语法差异?
我将后者放入 *.dat 文件中,AMPL 抱怨 expected ; ( : or symbol
{
所在的位置。不知道是不是说明书写错了
谢谢。
第四章语法--
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];
setes MINREQ
和 MAXREQ
及其成员的显式定义取自下面的 *.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;
我正在为混合整数线性程序 (MILP) 开发高级语言。该语言是数学编程语言的建模语言 (AMPL)。
第 4 章,第 65 页,图 4-7 显示了以下语法:
set PROD := bands coils plate ;
但是,第 5 章第 74 页显示了以下语法:
set PROD = {"bands", "coils", "plate"};
谁能解释一下这种语法差异?
我将后者放入 *.dat 文件中,AMPL 抱怨 expected ; ( : or symbol
{
所在的位置。不知道是不是说明书写错了
谢谢。
第四章语法--
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];
setes MINREQ
和 MAXREQ
及其成员的显式定义取自下面的 *.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;