首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >AMPL:集合的语法?

AMPL:集合的语法?
EN

Stack Overflow用户
提问于 2019-06-11 03:20:14
回答 1查看 73关注 0票数 1

我正在研究混合整数线性规划(MILP)的高级语言。该语言是一种数学编程语言(AMPL)的建模语言。

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

代码语言:javascript
复制
set PROD := bands coils plate ;

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

代码语言:javascript
复制
set PROD = {"bands", "coils", "plate"};

有人能解释一下这种语法上的差异吗?

我将后者放到一个*.dat文件中,AMPL报告expected ; ( : or symbol {在哪里。想知道这是不是手册上的一个错误。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-11 06:34:01

第4章中的语法--

代码语言:javascript
复制
set PROD := bands coils plate;

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

代码语言:javascript
复制
set PROD = {"bands", "coils", "plate"};

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

从AMPL手册修改而来的完整工作示例代码

由问题的原始海报添加。

dietu.mod:

代码语言:javascript
复制
# 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、MINREQMAXREQ及其成员的显式定义取自下面的*.dat文件(其中它们的定义已被注释掉)。Matlab用户,请注意以上内容,注意集合中的成员之间需要使用逗号。

dietu.dat:

代码语言:javascript
复制
# 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提示下使用以下命令求解模型:

代码语言:javascript
复制
reset data;
reset;
model dietu.mod;
data dietu.dat;
solve;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56532350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档