从项目集

时间:2017-04-04 23:10:41

标签: ampl

我有一套这种格式的数据

# Input Data for items in the format (i,l,w,h) 
i for item, l for length , w for width, h for height
set itemData :=
271440  290 214 361
1504858 394 194 114
4003733 400 200 287
4012512 396 277 250
4013886 273 221 166; 

我正在尝试使用以下代码获取每个项目的长度

set IL = setof  {i in items, (i,l,w,h) in itemData} (i,l); #length of item i

此方法仅允许我访问单个项目长度。 我想做的是

显示IL [271440] = 290;

我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

注意术语。在AMPL术语中,该表不是“集合”。您有一个参数表。您的集合是该表的行和列索引:列的{“l”,“w”,“h”}和行的项ID号。

在AMPL中,它将被处理如下:

(.mod part)
set items;
set attributes := {"l","w","h"};
param itemData{items, attributes};
(.dat part)

set items := 
271440
1504858
4003733
4012512
4013886
;

param itemData: l w h :=
271440  290 214 361
1504858 394 194 114
4003733 400 200 287
4012512 396 277 250
4013886 273 221 166
;

然后你可以这样做:

ampl: display itemData[271440,"l"];
itemData[271440,'l'] = 290

我认为可以在itemData的同时定义set“items”,避免复制ID号。 AMPL Book的9.2节显示了如何为具有单个索引集的参数执行此操作,但是当您有两个索引集时,我不确定执行此操作的语法。 (如果有人知道,请加上它!)