我在我的模型文件中有以下问题:我希望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是集合;δ,f是二进制变量;而rest是参数。我遇到了我之前用这个括号描述的问题:"(1-fl,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求解器将括号中第一个元素乘以bl,e,然后尝试将它们相加。我的问题是:如何避免这种情况?
发布于 2013-06-05 00:05:32
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 )。
https://stackoverflow.com/questions/16907067
复制相似问题