MathProg вне домена

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

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;

2 ответа

Ошибка Out of Domain находится в вашем 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 уже упоминал, ваше ограничение звука не выглядит правильно и сделает вашу проблему по-прежнему невыполнимой. Потому что ваши параметры не будут удовлетворять equal 1 ограничение.

51 * 0.8 + 134 * 0.2 != 1

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

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

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

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

Также нет данных по параметрам p1, p2 а также uf,

Другие вопросы по тегам