2014-07-13 24 views
1

我正在學習AMPL,以便稍後在我的程序中使用它。儘管我還沒有找到答案,但我還是有一個小問題。AMPL可變大小集迭代

假設我有一個設置,這設置將包含一些子集,這些子集可以在它們的尺寸不同。例如:

set x:= (a,b,c) (a,c) (d,t,r,e,s); 

等..

現在我想寫一個約束,將不得不面對每個子集中的所有元素(類似於一個循環,將一個之間循環, bc在第一個子集中,ac在第二個等中)。問題是,我們不知道每個的大小,所以我們不能使用以下內容:

set x dimen 3; 
subject to constraint {(i,j,k) in x}: "some constraint"; 
data; 
set x:= (a,b,c) (a,c) (d,t,r,e,s); 

有沒有辦法做到這一點?如果是,請給我提供一些示例代碼或鏈接以供學習? 在此先感謝。您的幫助表示讚賞:d

回答

1

您可以在AMPL索引集這是一種「集合的集合」,但它的所有元素應該有相同的尺寸:

set S; 
set T{S} dimen 3; # indexed set with all elements of dimension 3 (triples). 

但是,您可以實現與參數相同的效果:

set V ordered; 
param values{V} symbolic; 

# Indices in values where each subset starts. 
set Indices ordered; 

data; 
param: 
V: values := 
1 a 
2 b 
3 c 
4 a 
5 c 
6 d 
7 t 
8 r 
9 e 
10 s; 

set Indices := 1 4 6 11; 

print {i in Indices: i != last(Indices)}: {j in i .. next(i) - 1} values[j]; 

運行這段代碼將打印

a b c 
a c 
d t r e s 
+0

感謝,但對我來說,將一星號工作?我的意思是,如果我已經知道最長的子集將具有維5,我可以使用(a,b,c,*,*)而不是(a,b,c)嗎?它會有相同的含義嗎?如果否,是否有任何方法來填補子集成爲維5? – user3787524

+0

Asterisk用於不同的目的 - 作爲一個佔位符來指定數據中下一項的位置,但可以指定其他值,如0表示「無數據」,並將所有子集填充到5。 。 – vitaut

+1

謝謝,它完美的工作:D – user3787524