1

考虑以下最小化问题:

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

有人知道为什么违反了该约束吗?

4

1 回答 1

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

This way it will be defined for every element of A. Previously ct2 was only implemented on the last element of range A.

于 2019-01-05T19:07:24.197 回答