【问题标题】:Non linear optimization Minizinc and Cplex非线性优化 Minizinc 和 Cplex
【发布时间】:2020-06-12 08:37:32
【问题描述】:

我在 minizinc 中内置了一个简单的非线性代码,如下所示。

array[1..3] of var 1..10:x;
array[1..3] of var 10.0..20.0:y;
var float:z;
constraint sum(i in 1..3)(x[i]*y[i])=z;
solve minimize z;

如果我在 minizinc 后台使用 Cplex 求解器,我会遇到 Float_times 错误。

unable to create linear formulation for the `float_times` constraint. This model instance cannot be solved using a linear solver.

如果我将相同的代码转换为 OPL 并在 IBM ILOG Cplex IDE 中使用它们,它会提供答案。示例代码如下。

dvar int x[ 1..3]  in 1..10;
dvar float y[ 1..3]  in 10.0..20.0;
dvar float z;
minimize z;
subject to {
cons1:
sum(i in 1..3)x[i]*y[i]==z;
}

您能否解释一下为什么会发生这种情况,即使我在两个后端都使用了相同的求解器。

【问题讨论】:

  • 我可以从 minizinc IDE 处理上述 minizinc 代码的最佳求解器是什么。
  • 您可以尝试使用支持float_times的CP求解器,例如Gecode、JaCoP 或 OptiMathSAT。我不确定哪些 MIP 求解器支持 float_times。显然,CPLEX 没有。也许是古罗比?

标签: cplex minizinc


【解决方案1】:

您的约束不是线性的。 当您使用 OPL 求解时,presolve 完成了所有操作,但如果您删除 presolve,则需要更改最优目标:

execute
{
  cplex.preind=0;
  cplex.optimalitytarget=3;
}

dvar int x[ 1..3]  in 1..10;
dvar float y[ 1..3]  in 10.0..20.0;
dvar float z;
minimize z;
subject to {
cons1:
sum(i in 1..3)x[i]*y[i]==z;
}

工作正常

所以你可以通过 minizinc 设置“优化目标”

或者依赖逻辑约束/指标

execute
{
  cplex.preind=0;
  //cplex.optimalitytarget=3;
}

dvar int x[ 1..3]  in 1..10;
dvar float y[ 1..3]  in 10.0..20.0;
dvar float z;
dvar float xy[1..3];
minimize z;
subject to {
cons1:
sum(i in 1..3)xy[i]==z;

forall(i in 1..3) forall(j in 1..10) (x[i]==j) => xy[i]==y[i]*j;
}

也很好用

【讨论】:

    猜你喜欢
    • 2013-04-20
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多