我有一个内置在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;
}
即使我在两个后端都使用了相同的求解器,您也可以解释一下为什么会发生这种情况。
您的约束不是线性的。使用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;
}
也很好]