Это похоже на заказ звонков в колл-центр.Это становится более интересным, когда у вас есть покупатели золота и серебра.В любом случае:
У каждого автомобиля есть readyTime
(самое раннее время, которое можно помыть, поэтому время прибытия - которое может быть разным для каждого автомобиля) и dueTime
(в тот момент, когда клиент злится, поэтому3 часа после readyTime).
Затем используйте решатель ограничений (например, OptaPlanner ), чтобы определить порядок машин (*).Заказ автомобилей (который является подлинной переменной планирования) подразумевает startWashingTime
каждого автомобиля (который является теневой переменной), потому что в вашем примере, если клиент 1 заказан после клиента 2 и если мы начнем в 08:00, мы можем сделать вывод, что startWashingTime
клиента 1 равен 08: 03.
Тогда endWashingTime
равно startWashingTime + washingDuration
.
Тогда нужно просто добавить 2 ограничения и позволить решателюsolve()
it:
endWashingTime
должно быть меньше, чем dueTime
, это жесткое ограничение.Это не должно иметь злых клиентов. endWashingTime
должно быть меньше, чем startTime
плюс 15 минут, это мягкое ограничение.Это сделано для максимального удовлетворения клиентов.
(*) Эта проблема является NP-полной или NP-сложной, потому что вы можете решить ее как проблему с рюкзаком.На практике это означает: вы не можете написать алгоритм для него, который масштабируется и находит оптимальное решение в разумные сроки.Но решатель ограничений может приблизить вас.