Pyschedule: тормозит между задачами, позволяя более длинные задачи - PullRequest
0 голосов
/ 25 октября 2018

У меня есть следующая проблема: я хотел бы запланировать некоторые встречи (задачи) с использованием библиотеки pyschedule и разрешить торможение между ними, когда в совокупности они занимают слишком много времени (более 4 временных интервалов).В то же время я хотел бы разрешить задачи, занимающие более 4 временных интервалов.Допустим, у меня есть 1 человек и 3 встречи:

person = scenario.Resource('person')
meeting1 = scenario.Task('meeting1', 1)
meeting2 = scenario.Task('meeting2', 2)
meeting3 = scenario.Task('meeting3', 5)

Тогда желаемое решение будет, например, [meeting1, meeting2, break, meeting3].Я пытался сделать ограничение:

MAX_CONSECUTIVE_SLOTS = 4
for slot in range(HORIZON):
    scenario += person[slot:slot + MAX_CONSECUTIVE_SLOTS + 1] <= MAX_CONSECUTIVE_SLOTS

, но это работает только тогда, когда все собрания не длиннее MAX_CONSECUTIVE_SLOTS.Я также попытался объединить это условие с количеством задач на интервал времени:

meeting1.count = 1
meeting2.count = 1
meeting3.count = 1

for slot in range(HORIZON):
    scenario += (person[slot:slot + MAX_CONSECUTIVE_SLOTS + 1] <= MAX_CONSECUTIVE_SLOTS) or \
        (person['count'][slot:slot + MAX_CONSECUTIVE_SLOTS + 1] <= 1)

Но person['count'][n:m], по-видимому, означает количество задач, завершенных в данном интервале времени, когда мне нужно количество задачперекрывая этот фрагмент.

Я использую mip.solve решатель.Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 06 ноября 2018

Вот решение, основанное на ответе Тимнона на Github .Он основан на параметре stress, который должен быть ограничен для любого человека.Каждое собрание увеличивает стресс человека на величину, равную продолжительности собрания в случае более коротких собраний, или на сумму, равную пределу напряжения для более длинных собраний.Каждый перерыв снижает стресс человека.

from pyschedule import Scenario, solvers


horizon = 20
stress_limit = 4

S = Scenario('test', horizon=horizon)

meeting1 = S.Task('meeting1', 1, stress=1)
meeting2 = S.Task('meeting2', 2, stress=2)
meeting3 = S.Task('meeting3', 5, stress=stress_limit)
breaks = S.Tasks('break', schedule_cost=0, num=3, stress=-stress_limit)

person = S.Resource('person')
meeting1 += person
meeting2 += person
meeting3 += person
breaks += person

for t in range(horizon + 1):
    S += person['stress'][:t] <= stress_limit
    S += person['stress'][:t] >= 0

S.clear_solution()
S.use_flowtime_objective()

if solvers.mip.solve(S, msg=0, kind='CBC'):
    print(S.solution())
else:
    print('no solution found')

Редактировать: это решение работает хорошо, но начинает работать очень медленно с большим количеством пользователей и собраний.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...