2014-10-10 24 views
1

我打算進行優化,但我得到一個我找不到原因的錯誤。編譯器抱怨服務時間,startlimit和endlimit不是無效的。特別是編譯器在約束TimeConstraint中抱怨servicetime ['ORIGINS']沒有值。AMPL:無效的下標

約束的問題是:

subject to TimeConstraint {k in H}: sum{i in UNI, j in UNI} servicetime[i]*x[i,j,k] <= 1440; 

其中:

set ORIGINS; 
set DESTINATIONS; 
set UNI; 
param servicetime{UNI} integer > 0; 
var x{UNI,UNI, H} binary; 
param startlimit{UNI}; 
param endlimit{UNI}; 

的.dat文件是:

set ORIGINS := 1 2 3 4 5 6 7; 
set DESTINATIONS := 8 9 10 11 12 13 14; 
set UNI = ORIGINS union DESTINATIONS; 


param: startlimit endlimit servicetime:= 
1 0 1440 360 
2 0 1440 360 
3 0 1440 360 
4 0 1440 360 
5 0 1440 360 
6 0 1440 120 
7 0 1440 120 
8 0 1440 360 
9 0 1440 360 
10 0 1440 360 
11 0 1440 360 
12 0 1440 360 
13 0 1440 120 
14 0 1440 120; 

我看不出這是行不通的。對我來說這看起來很準確。希望有人能對此有所瞭解! 問候,

+1

startlimit和endlimit是如何定義的? – vitaut 2014-10-10 18:46:56

+1

感謝您的回覆!我一直有一些互聯網問題,所以我一直無法登錄到檢查論壇。我編輯了我的原始文章以包含定義。 – Cenderze 2014-10-14 08:35:17

回答

1

AMPL數據格式不允許表達式,因此ORIGINSunionDESTINATIONS字面上解釋爲字符串,而不是在數據聲明一組表達ORIGINS union DESTINATIONS

set UNI = ORIGINS union DESTINATIONS; 

您可以通過初始化解決這個問題在模型文件的聲明中設置:

set ORIGINS; 
set DESTINATIONS; 
set UNI = ORIGINS union DESTINATIONS; 
param servicetime{UNI} integer > 0; 
... 
+1

非常感謝!這解決了我的問題!從我讀過的文檔來看,應該寫哪些文件語句並不總是很明顯。 – Cenderze 2014-10-14 17:04:05