1

GLPK を使用して問題を解決する必要があります。実際に必要なのは、2 つの配列内の要素の差を計算することですが、ドメイン外のエラーが表示されます。このエラーについてわからないので、修正していただければ幸いです。コードは次のとおりです。

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

ドメイン外エラーはsum{i in range}、2 つの制約のステートメントにあります。

パラメータp1{cols1}は次のように索引付けされます

p1[40]
p1[110]

rangesum ステートメントでは、どちら40でもないp1 にインデックスを付けます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 が既に述べたように、2 番目の制約は正しく見えず、問題を実行不可能にします。パラメータがequal 1制約を満たさないためです。

51 * 0.8 + 134 * 0.2 != 1
于 2015-03-10T15:40:24.163 に答える