我有一套这种格式的数据
# 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;
我怎么能这样做?
答案 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节显示了如何为具有单个索引集的参数执行此操作,但是当您有两个索引集时,我不确定执行此操作的语法。 (如果有人知道,请加上它!)