线性形式的乘法不允许错误

Multiplication of linear forms not allowed error

我正在尝试解决设施位置问题。这是我的代码:

set S;
param prod{i in S};
param distri{i in S};
param fixed{i in S};
param cap{i in S};
param demand{i in S};

var x{i in S, j in S}, >= 0;
var y{i in S}, binary;

minimize obj :
  sum{i in S} fixed[i]*y[i] + 
  sum{i in S, j in S} x[i,j]*(prod[i] + distri[i])*y[i];


s.t. c1{i in S}:
    sum{j in S} x[i,j]*y[i] <= cap[i];
  

s.t. c2{i in S}:
    sum{j in S} x[j,i]*y[j] = demand[i];

display S;

solve;

printf '\n  Solution: \nMinimum Cost = %.2f\n', obj;

display x;
display y;

data;

set S := 0 1 2 3;

param prod :=
  0 20
  1 30
  2 40
  3 50;

param distri :=
  0 60
  1 70
  2 80
  3 90;

param fixed :=
  0 10
  1 15
  2 10
  3 15;

param cap :=
  0 100
  1 110
  2 120
  3 130;

param demand :=
  0 120
  1 60
  2 70
  3 100;

end;

当我 运行 这个 .mod 文件时,我得到以下错误:

example.mod:13: multiplication of linear forms not allowed
Context:  S } x [ i , j ] * ( prod [ i ] + distri [ i ] ) * y [ i ] ;
MathProg model processing error

这里的 x 是设施 'i' 为客户 'j' 提供的部分需求。

我从提到的行中删除了 y[i],错误消失了。但是如果我这样做,我会得到相同的乘法错误,但这次是在 c1 约束中。

正确的做法是什么?谢谢。

gplk 仅限于线性问题。

允许参数和变量相乘。但是变量的乘积是non-linear。您要么必须重写模型,要么使用 non-linear 求解器。

涉及二元变量的乘积线性化在 中讨论。