1

我的模型文件中有以下问题:我想 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],然后尝试将它们相加。我的问题是:如何避免这种情况?

4

1 回答 1

2

expandAMPL 中的命令简化了约束表达式。特别是,它结合了相似的术语。例如:

var x;
var y;
subject to c: 2 * (x + y) + 3 * x = 0;
expand c;

印刷

subject to c:
    5*x + 2*y = 0;

在您的情况下,AMPL 使用加法/减法的乘法分布a * (b - c) = a * b - a * c: 。这是必要的,因为 CPLEX 和许多其他求解器仅接受某种形式的约束表达式,例如线性表达式a1 * x1 + a2 * x2 + ... + an * xn,并且无法将任意表达式树传递给它(至少使用 CPLEX 中的 C API)。

于 2013-06-04T16:05:31.557 回答