`alldifferent` метод в MiniZinc

Ниже приведено ограничение, которое я пытался реализовать в MiniZinc.

constraint forall (t in trucks) (all_different(c in customers where sequence[t,c] !=0) (sequence[t,c]));

то есть я хочу, чтобы каждый элемент строки был разным для sequence матрица, когда sequence значение не равно 0.

и получил ошибку

MiniZinc: type error: no function or predicate with this signature found: all_different(array[int] of var opt int)',

Как указано в некоторых других темах, которые я добавил include "alldifferent.mzn"; команда, по-прежнему показывая эту ошибку.

Это часть задания, извините за то, что не смог выложить здесь весь мой код, пожалуйста, дайте мне знать, если потребуется какая-либо дополнительная информация.

1 ответ

Решение

Чтобы четко понять, что вы делаете, вы можете написать свое выражение по-другому:

all_different([sequence[t,c] | c in customers where sequence[c,t] != 0])

Обратите внимание, что здесь используются массивы. Это здорово, чтобы выразить много вещей, но если sequence является массивом переменных, тогда число переменных в этом понимании неизвестно. Это большая проблема для многих решателей. И поэтому не поддерживается многими из них. Это по крайней мере невозможно с all_different сказуемое.

Однако ваша проблема хорошо известна, поэтому доступен другой предикат. Вы можете выразить то же ограничение следующим образом:

for(t in trucks) (
    alldifferent_except_0([sequence[c,t] | c in customers])
)
Другие вопросы по тегам