线性形式相乘不允许错误

问题描述

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

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仅限于线性问题。

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

this related answer中讨论了涉及二进制变量的乘积的线性化。