0

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

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受限的。

什么是正确的方法?谢谢你。

4

1 回答 1

0

gplk仅限于线性问题。

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

在这个相关答案中讨论了涉及二进制变量的产品的线性化。

于 2020-09-10T09:57:24.280 回答