AMPL CPLEX:不是指示器约束消息

AMPL CPLEX: is not an indicator constraint message

我有这个 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 解决它时 returns 此消息:

CPLEX 20.1.0.0: logical constraint _slogcon[1] is not an indicator constraint.

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

委婉地说,这不是一个非常直观的错误消息。开发人员低估了信息性错误消息的重要性。一条好消息可以避免这种情况 post.

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

在 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);
      }        
;

工作正常并依赖于 COPtimizer

如果你更喜欢使用 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