Как избежать конфликтов расписания из-за проблем с расписанием

Я пытаюсь создать график смен для каждого сотрудника с учетом доступности смены. У меня есть кортеж, который включает время начала смены, время окончания смены, максимальное количество людей в смене. Входные данные также включают список массивов для предпочтений смены сотрудников, например [[1 0 0 1 1], ...], который представляет, что сотрудник 1 доступен для смен 1, 4, 5, но не 2, 3. Обратите внимание, что время смены не исключает друг друга и может перекрываться.

У меня есть переменная решения x [i, j], которая равна 1, если сотрудник i работает на смене j, в противном случае - 0. После выполнения я ожидаю, что x [i, j] будет матрицей, указывающей для каждого сотрудника, к какой смене он назначен. У меня есть другие ограничения, включая количество смен. Но я застрял в том, как создать ограничение, чтобы гарантировать, что назначенные смены не перекрываются.

У меня есть одна идея - сравнить x [i, j] и x [i, k], где j = / = k, и посмотреть, проверяют ли они, если время начала i> время окончания j ИЛИ время начала j> время окончания из я. Но я не уверен, как это реализовать в OPL.


person John Lee    schedule 28.03.2019    source источник


Ответы (1)


Если я правильно понимаю, время начала и окончания каждой смены j - известные константы. Позвольте мне называть их start[j] и end[j]. Таким образом, вы должны иметь возможность использовать их, чтобы указать с помощью конструкции forall пары (j,k), чтобы сдвиги j и k не перекрывались.

Вы найдете примеры использования forall в примерах, установленных вместе с продуктом, в подкаталогах [InstallDir]/opl/examples/opl. В частности, модели, которые включают конструкции, на которые вы можете смотреть, это models/Staffing/staffing.mod, timetabling/timetabling.mod и teambuilding/teambuilding.mod.

person Xavier Nodet    schedule 28.03.2019