2014-09-23 97 views
1

我需要使用GLPK來解決問題,而實際上我需要的是計算兩個陣列中元素之間的差異 但是,我收到域錯誤 我希望您可以修復它,已經對這個錯誤 不知道這裏的代碼MathProg out of domain

set cols1; 
set cols2; 
set w; 
set range:=1..2; 
#set Groups; 
#set Items{Groups} ; 
param p1{cols1}>=0; 
param p2{cols2}>=0; 
param uf{w}>=0; 
var x>=0; 
maximize regret: x; 
s.t. a: sum { i in range } (p1[i] -p2[i]) * uf[i]>=x; 
s.t. b: sum { i in range } p2[i] * uf[i] =1; 
data; 
set cols1:=40 110; 
set cols2:=51 134; 
set w:= 0.8 0.2; 
#set Groups := {cols1, cols2, w}; 
end; 
+1

什麼是錯誤?你期待什麼輸出? – arco444 2014-09-23 14:43:52

回答

0

約束b不包含變量,只有參數:

s.t. b: sum { i in range } p2[i] * uf[i] =1; 

也許正是這個原因導致了域的ER ror in glpk。這是更好地重寫它作爲檢查的語句:

check: sum { i in range } p2[i] * uf[i] =1; 

人們也爲參數p1p2uf沒有數據。

0

超出域錯誤位於您的兩個約束條件的sum{i in range}聲明中。

參數p1{cols1}被索引如下

p1[40] 
p1[110] 
在你的總和聲明

您指數P1與range既不是40也不110

在這個gmpl例子中還有一些其他的東西。一個正確的索引將如下所示:

set range:={1,2}; 
param p1{range}>=0; 
param p2{range}>=0; 
param uf{range}>=0; 
var x>=0; 
maximize regret: x; 
s.t. a: sum { i in range } (p1[i] -p2[i]) * uf[i]>=x; 
s.t. b: sum { i in range } p2[i] * uf[i] =1; 
data; 
param p1:=1 40 2 110; 
param p2:=1 51 2 134; 
param uf:= 1 0.8 2 0.2; 
end; 

但是,然後仍然存在技術問題較少的問題。像vitaut已經提到你的secound約束看起來不正確,並會使你的問題仍然不可行。因爲您的參數不會滿足equal 1約束條件。

51 * 0.8 + 134 * 0.2 != 1