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
我有这个 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