【问题标题】:Order of operation in AMPLAMPL 中的操作顺序
【发布时间】:2013-06-03 22:45:44
【问题描述】:

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

【问题讨论】:

    标签: optimization cplex ampl


    【解决方案1】:

    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)。

    【讨论】:

      猜你喜欢
      • 2016-02-15
      • 2015-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-07
      相关资源
      最近更新 更多