Как смоделировать простую задачу планирования с помощью MS Solver Foundation?
-
21-09-2019 - |
Вопрос
У меня есть следующая простая проблема, с которой я хотел бы поэкспериментировать. Фонд MS Solver:
У меня есть график, по которому мне нужно иметь 2 рабочих в день в течение 30 дней.Мне нужно соблюдать следующие ограничения:
- Ни один человек не должен работать два дня подряд.
- Если не применяется специальное исключение, люди должны работать только один раз в неделю.
- Некоторые люди могут работать только по выходным.
- Некоторые люди могут работать только в будние дни.
Я планирую использовать C# для заполнения модели, но мне нужна помощь, чтобы начать моделирование.Я не уверен, как настроить решения, параметры и ограничения для решения такого типа проблем.
Обновлять: Хотя у ire-and-curses хорошее начало, я должен представить, что существует более декларативный способ выразить эти ограничения с помощью фреймворка, вместо того, чтобы программировать их индивидуально для каждого человека.Кто-нибудь, более знакомый с MSF, может помочь с этим строительством?
Решение
Если у вас есть n
люди, вам придется определить 30n
двоичные целочисленные параметры, каждый из которых указывает, работает ли человек в определенный день или нет.
P<xx>D<yy> == 1 => Person <xx> works on day <yy>
P<xx>D<yy> == 0 => Person <xx> does not work on day <yy>
Тогда вам нужны ограничения, чтобы не работать два дня подряд.Это будет 29n
ограничения.
P<xx>D<yy> + P<xx>D<yy+1> <= 1
Тогда вам нужно, чтобы ограничения работали только один раз в неделю.Это будет следующее в течение первой недели и аналогичное в течение следующих трех недель.
P<xx>D00 + P<xx>D01 + P<xx>D02 + P<xx>D03 + P<xx>D04 + P<xx>D05 + P<xx>D06 <= 1
Последняя неделя будет следующей.
P<xx>D28 + P<xx>D29 <= 1
Это даст еще один 5n
ограничения.Затем добавьте ограничения только для будних дней.
P<xx>D05 + P<xx>D06 == 0
P<xx>D12 + P<xx>D13 == 0
P<xx>D19 + P<xx>D20 == 0
P<xx>D26 + P<xx>D27 == 0
и только выходные
P<xx>D00 + P<xx>D01 + P<xx>D02 + P<xx>D03 + P<xx>D04 == 0
P<xx>D07 + P<xx>D08 + P<xx>D09 + P<xx>D10 + P<xx>D11 == 0
P<xx>D14 + P<xx>D15 + P<xx>D16 + P<xx>D17 + P<xx>D18 == 0
P<xx>D21 + P<xx>D22 + P<xx>D23 + P<xx>D24 + P<xx>D25 == 0
P<xx>D28 + P<xx>D29 == 0
и, наконец, добавьте целевую функцию.