非线性优化Minizinc和Cplex

问题描述 投票:0回答:1

我有一个内置在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;
}

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

cplex minizinc
1个回答
2
投票

您的约束不是线性的。使用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;
}

也很好]

© www.soinside.com 2019 - 2024. All rights reserved.