我的模型文件中存在以下问题:我希望CPLEX解算器首先在括号中执行操作然后成倍增加。和通常的数学一样.... 但是当我用这个约束运行我的模型文件时:
subject to c4a {e in E, k in K, o in O}:
f[k,o] = 0
==>
delta[e,k,o] - p[k,e] * (sum{l in K}(b[l,e]*(1-f[l,o]))) = 0
else
delta[e,k,o] = 0;
其中E,K,O是集合; delta,f是二元变量;和休息是参数。我之前用这个括号描述了问题:“(1-f [l,o])”。当我尝试解析示例数据文件时,我收到以下错误:
CPLEX 11.2.0: logical constraint _slogcon[1] is not an indicator constraint.
expand _slogcon[1];
subject to c4a['1_2',2,'o1']:f[2,'o1'] == 0 ==> delta['1_2',2,'o1'] - (3 - f[2,'o1'] - f[3,'o1'] -
f[4,'o1']) == 0 else delta['1_2',2,'o1'] == 0;
在这里,您可以看到CPLEX求解器在括号中的第一个乘法元素b [l,e],然后尝试添加它们。我的问题是:如何避免这种情况?
答案 0 :(得分:2)
AMPL中的expand
命令简化了约束表达式。特别是,它结合了like terms。例如:
var x;
var y;
subject to c: 2 * (x + y) + 3 * x = 0;
expand c;
打印
subject to c:
5*x + 2*y = 0;
在您的情况下,AMPL使用distributivity乘法加法/减法:a * (b - c) = a * b - a * c
。这是必要的,因为CPLEX和许多其他解算器只接受某种形式的约束表达式,例如线性表达式a1 * x1 + a2 * x2 + ... + an * xn
并且无法将任意表达式树传递给它(至少在CPLEX中使用C API)。