Как смоделировать простую задачу планирования с помощью MS Solver Foundation?

StackOverflow https://stackoverflow.com/questions/1394886

Вопрос

У меня есть следующая простая проблема, с которой я хотел бы поэкспериментировать. Фонд 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

и, наконец, добавьте целевую функцию.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top