【问题标题】:How to solve this error when I use CP in Cplex在 Cplex 中使用 CP 时如何解决此错误
【发布时间】:2019-09-20 08:01:14
【问题描述】:

现在,我遇到了一个错误。

'此算法不支持 dvar float 类型的决策变量。'

这是我编写的代码。

我就简单写一下吧。

首先,我遇到了“'q1'不是凸的”错误。

所以,现在我正在尝试“使用 CP;”

Using CP;

int a = 2;
int e = 4;
int h = 3;
int t = 6;

range arange = 1..a;
range erange = 1..e;
range hrange = 1..h;
range trange = 1..t;

int nd[erange][hrange] = [[0.8, 0.2, 0.3]
                          [0.3, 0.1, 0.6]
                          [0.1, 0.7, 0.5]];

dvar boolean x[arange][erange][trange];
dvar float y[erange][hrange][trange];

maximize
sum(a in arange, e in erange, h in hrange, t in trange)
  y[e][h][t] * x[a][e][t];

subject to {

forall(a in arange, e in erange, t in trange, h in hrange)
   y[e][h][t] == nd[e][h];

}

我需要使用“浮点”类型作为决策变量。

但是'使用 CP;'不支持这种类型。

在这种情况下,我应该怎么做才能解决这个错误。

【问题讨论】:

  • 布尔变量乘以连续变量可以是 linearized 。通过这种重新表述,您可以使用 MIP 求解器。

标签: cplex nonlinear-optimization integer-programming mixed-integer-programming


【解决方案1】:

从示例 floatexpr.mod 中可以看出,您可以使用决策表达式来使用十进制值。在您的示例中:

using CP;

int a = 2;
int e = 4;
int h = 3;
int t = 6;

range arange = 1..a;
range erange = 1..e;
range hrange = 1..h;
range trange = 1..t;

float nd[erange][hrange] = [[0.8, 0.2, 0.3],
                          [0.3, 0.1, 0.6],
                          [0.1, 0.7, 0.5]];

int scale=10;                          

dvar boolean x[arange][erange][trange];
dvar int yscale[erange][hrange][trange] in 0..1000;

dexpr float y[a in erange][b in hrange][c in trange]=yscale[a][b][c]/scale;

maximize
sum(a in arange, e in erange, h in hrange, t in trange)
  y[e][h][t] * x[a][e][t];

subject to {

forall(a in arange, e in erange, t in trange, h in hrange)
   (y[e][h][t] - nd[e][h])<=0.01;

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 2021-08-03
    相关资源
    最近更新 更多