2014-09-23 6 views
1

Мне нужно решить проблему с помощью GLPK и что на самом деле мне нужно рассчитать разницу между элементами в двух массивах , но я получаю ошибку из домена Я надеюсь, что вы можете исправить это, не в ни малейшего представления об этой ошибке вот кодMathProg вне домена

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

ответ

0

ограничения b не содержит переменные, только параметры:

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

Возможно, это является причиной отказа от домена эр ror в glpk. Лучше переписать его в качестве проверки заявления:

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

Также нет данных для параметров p1, p2 и uf.

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; 

Но тогда есть еще меньше проблем с проблемой. Подобно тому, как уже упоминалось, ваше ограничение привязки не выглядит правильным и превратит вашу проблему еще неосуществимой. Поскольку ваши параметры не будут удовлетворять ограничению equal 1.

51 * 0.8 + 134 * 0.2 != 1