Это много вопросов, позвольте мне попытаться ответить на некоторые из них.
... введение только логических переменных для каждой комбинации моей переменной (календарного поля) и работника, чтобы пометить, если работник назначен определенному календарному полю. Это лучший подход?
Обычно это делается, когда используется решатель MILP (Смешанное целочисленное линейное программирование), где понятия более высокого уровня (такие как alldifferent
и т. Д.) Должны быть выражены в виде линейных неравенств. Такие формулировки обычно требуют большого количества логических переменных. Ограничительное программирование здесь более гибкое и предлагает больше вариантов моделирования, но, к сожалению, простого ответа нет, это зависит от проблемы. Выбор переменных влияет как на то, как трудно выразить свои проблемы, так и на эффективность, которую они решают.
Таким образом, суммы в решении выглядят как [200,200,200 ... 200,160,140,80,50,0,]. Я был бы рад, если рабочие будут более или менее одинаково использованы. Есть ли какой-нибудь простой / эффективный способ, как этого добиться?
Вы уже упомянули идею минимизации различий, и именно так обычно выполняется такое требование балансировки. Это не должно быть сложным. Если изначально у нас есть это несбалансированное первое решение:
?- length(Xs,5), Xs#::0..9, sum(Xs)#=20, labeling(Xs).
Xs = [0, 0, 2, 9, 9]
тогда простое сведение к минимуму максимального числа элементов списка даст вам (в сочетании с суммированием) сбалансированное решение:
?- length(Xs,5), Xs#::0..9, sum(Xs)#=20, Cost#=max(Xs), minimize(labeling(Xs),Cost).
Xs = [4, 4, 4, 4, 4]
Cost = 4
Вы также можете минимизировать разницу между минимальным и максимальным:
?- length(Xs,5), Xs#::0..9, sum(Xs)#=20, Cost#=max(Xs)-min(Xs), minimize(labeling(Xs),Cost).
Xs = [4, 4, 4, 4, 4]
Cost = 0
или даже сумма квадратов.
[Извините, мои примеры приведены для ECLiPSe , а не для SWI / clpfd, но должны показать общую идею.]
Как мне заказать ограничения? Я думаю, что порядок ограничений имеет значение в отношении эффективности маркировки.
Не беспокойся об этом. Хотя это может иметь некоторое влияние, оно слишком непредсказуемо и слишком сильно зависит от деталей реализации, чтобы давать какие-либо общие рекомендации. Это действительно работа разработчика решателя.
Как отладить / оптимизировать производительность маркировки?
Для реалистичных задач вам часто потребуется (а) эвристика маркировки для конкретной проблемы и (б) некоторая разновидность неполного поиска.
Визуализация дерева поиска или хода поиска может помочь с настройкой эвристики. Вы можете найти некоторое обсуждение этих вопросов в главе 6 этого онлайн-курса .