我需要使用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;
答案 0 :(得分:0)
约束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
也没有数据。
答案 1 :(得分:0)
Out of Domain Error位于您的两个约束的sum{i in range}
语句中。
参数p1{cols1}
被索引为以下
p1[40]
p1[110]
在您的汇总语句中,您使用range
索引p1,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