`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])
)