2017-04-04 79 views
0

我有一组数据以这种格式从项目获取长度设置

# 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

小心使用术语。在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和避免需要复制身份证号码。 AMPL Book的第9.2节展示了如何为具有单个索引集的参数执行此操作,但当您有两个索引集时,我不确定这样做的语法。 (如果有人知道,请加上!)