【问题标题】:AMPL CPLEX: is not an indicator constraint messageAMPL CPLEX:不是指示符约束消息
【发布时间】:2021-12-27 17:34:57
【问题描述】:

我有这个 AMPL 模型

model;

param n >= 1 integer;

set V = 1..n;
set T = 1..n;
set R = {(i, j) in {V, V}: i <> j};

param capacity >= 0;

var m{V} binary;
var path{T, R} binary;
var u{T} binary;

minimize obj:
    sum{t in T} u[t]
;

subject to max_capacity{t in T}:
    u[t] = 1 ==>
        sum{(i, j) in R} m[j] * path[t, i, j] <= capacity
;

但是当我尝试使用 cplex 解决它时,它会返回此消息:

CPLEX 20.1.0.0:逻辑约束 _slogcon[1] 不是指示符约束。

这条消息是什么意思?有没有简单的方法来解决这个问题?

【问题讨论】:

  • 谷歌指向this相关答案。

标签: mathematical-optimization cplex ampl


【解决方案1】:

在 AMPL 中,就像在 OPL 中一样,您可以使用 CP。

using CP;

int n=10;

range V = 1..n;
range T = 1..n;

tuple t
{
  int i;
  int j;
}
{t} R={<i,j> | i,j in V:i!=j};

int capacity=4;

dvar boolean m[V];
dvar boolean path[T,R];
dvar boolean u[T];

minimize 
    sum(t in T) u[t]
;

subject to 
{
  forall(t in T)

    (u[t] == 1) =>
        (sum(<i,j>  in R) m[j] * path[t, <i, j>] <= capacity);
      }        
;

工作正常并依赖于 CPOptimizer

如果你更喜欢使用 MIP,你可以用 bigM 重写你的逻辑约束

int n=10;

range V = 1..n;
range T = 1..n;

tuple t
{
  int i;
  int j;
}
{t} R={<i,j> | i,j in V:i!=j};

int capacity=4;

float bigM=100;

dvar boolean m[V];
dvar boolean path[T,R];
dvar boolean u[T];

minimize 
    sum(t in T) u[t]
;

subject to 
{
  forall(t in T)

    //(u[t] == 1) =>
        (sum(<i,j>  in R) m[j] * path[t, <i, j>] <= capacity*u[t]+bigM*(1-u[t]));
      }        
;

注意:

我使用 OPL 是因为 I love OPL 但您可以使用 AMPL 做同样的事情

【讨论】:

    【解决方案2】:

    委婉地说,这不是一个非常直观的错误消息。开发人员低估了错误信息的重要性。一条好消息会阻止这个帖子。

    我怀疑这是因为约束不是线性的(而是二次的)。 Cplex(与其他求解器一样)仅允许线性指标约束。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-21
      • 1970-01-01
      相关资源
      最近更新 更多