Fico Xpress / Mosel:在最佳解决方案中不满足约束条件

时间:2019-01-04 22:03:01

标签: linear-programming mosel

考虑以下最小化问题:

declarations
A,B,C: range
Objective:linctr 
ct1: array(a,b,c) of  linctr
ct2: linctr
z: array (a,b,c) of real
x: array (a,b,c) of mpvar
end-declarations

initializations
    ...
end-initializations

forall(a in A, b in B, c in C) create(x(a,b,c))

Objective := sum(a in A, b in B, c in C) z(a,b,c) * x(a,b,c)

forall(a in A, b in B, c in C) ct1(a,b,c):= (a,b,c) is_binary
forall(a in A) ct2:= sum(b in B, c in C) x(a,b,c) = 1

minimize(Objective)

应该对决策变量的3维数组进行约束,以便对于第一维A上的每个索引,约束ct2断言只有一个x(1,b,c),只有一个x(2,b,c) ,等等等于1

但是,Xpress返回最佳解决方案,其中违反ct2使得x(1,2,3) = 1x(1,4,6) = 1冲突。

有人看到为什么违反了该约束?

1 个答案:

答案 0 :(得分:0)

这段代码中存在多个问题。

首先,要使x(a,b,c)成为二进制,不需要约束。您可以这样做:

forall(a in A, b in B, c in C) x(a,b,c) is_binary

第二,由于要为A的每个元素编写ct2,因此应在A的集合上定义它,如下所示:

ct2: array(A) of linctr

然后按如下所示定义约束:

forall(a in A) ct2(a):= sum(b in B, c in C) x(a,b,c) = 1

这样,它将为A的每个元素定义。以前ct2仅在范围A的最后一个元素上实现。