1

我需要使用 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;
4

2 回答 2

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;

也没有参数p1p2的数据uf

于 2014-10-13T03:35:22.377 回答
0

域外错误位于您sum{i in range}对两个约束的陈述中。

参数p1{cols1}索引如下

p1[40]
p1[110]

在您的 sum 语句中,您索引 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
于 2015-03-10T15:40:24.163 回答