Ответ немного зависит от деталей (это целые числа переменных, все значения в рассматриваемой области). Вот ссылка, которая может представлять интерес:
Уильямс, Х. Пол и Ян, Хонг (2001), Представления предиката 'all_different' удовлетворения ограничений в целочисленном программировании, Informs Journal on Computing , 13 (2). 96-103.
Определим проблему точнее. Скажем, у нас есть n
целые числа, x[i]
, которые принимают уникальные значения от 1,...,n
. Мы можем реализовать это как:
Мы можем ввести двоичные переменные
y[i,k] = 1 if x[i]=k
0 otherwise
С этим мы можем написать:
x[i] = sum(k, k*y[i,k]) (1)
sum(k, y[i,k]) = 1 ∀i (2)
sum(i, y[i,k]) = 1 ∀k (3)
y[i,k] ∈ {0,1}
где i ∈ {1,..,n}
и k ∈ {1,..,n}
.
Если у вас меньше переменных, чем n
, скажем i ∈ {1,..,m}
на m < n
, тогда нам нужно заменить (3) на:
sum(i, y[i,k]) ≤ 1 ∀k (3a)