Fico Xpress / Mosel: ограничение не выполняется в оптимальном решении - PullRequest
0 голосов
/ 05 января 2019

Рассмотрим следующую проблему минимизации:

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)

Трехмерный массив переменных решения должен быть ограничен таким образом, чтобы для каждого индекса в первом измерении A ограничение ct2 утверждало, что только один x(1,b,c), только один x(2,b,c) и т. Д. Равняется 1.

Однако Xpress возвращает оптимальное решение, при котором нарушается ct2, так что x(1,2,3) = 1 и x(1,4,6) = 1.

Кто-то видит, почему это ограничение нарушается?

1 Ответ

0 голосов
/ 05 января 2019

В этом фрагменте кода есть несколько проблем.

Во-первых, чтобы сделать x (a, b, c) двоичным, вам не нужно ограничение. Вы можете сделать это:

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

Во-вторых, поскольку вы хотите написать ct2 для каждого элемента A, вы должны определить его на множестве 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.

...