Проблема с маршрутизацией автомобиля: VRP с временным окном должен учитывать TimeWindowedDepot.getDueTime()
Я работаю с оконной проблемой маршрутизации транспортных средств.
Мои ограничения:
- У меня есть клиенты (100), у которых есть готовые и должные времена.
- И транспортные средства (10), которые также имеют готовые и своевременные сроки.
- Солвер работает в течение 150 секунд.
Результат уважает должное время клиентов, но не соблюдает должное время депо (или транспортного средства). Я пытался добавить жесткие ограничения для автомобиля из-за времени. Но это позволяет многим клиентам не инициализироваться, хотя у меня достаточно автомобиля. Вот жесткое ограничение, которое я использовал.
// TimeWindowedDept: extra hard constraints
rule "arrivalAfterDueTimeInDepot"
when
TimeWindowedCustomer($arrivalTime : arrivalTime, $vehicle : vehicle)
$customer : Customer(previousStandstill != null)
TimeWindowedDepot($vehicle != null && dueTime<($arrivalTime+$customer.getDistanceTo($vehicle)), $dueTime : dueTime)
then
scoreHolder.addHardConstraintMatch(kcontext, ($dueTime-($arrivalTime+$customer.getDistanceTo($vehicle))));
end
Пожалуйста, предложите, если я написал неправильное правило. Или есть другое решение для этой проблемы. Спросите любую необходимую деталь. Спасибо.
РЕДАКТИРОВАТЬ 1: Я немного изменил правило, но все тот же результат.
// TimeWindowedDepot: extra hard constraints
rule "arrivalAfterDueTimeInDepot"
when
TimeWindowedDepot($dueTime : dueTime)
TimeWindowedCustomer(vehicle != null && $dueTime < arrivalTime+ getDistanceTo(vehicle), $arrivalTime : arrivalTime, $distance : getDistanceTo(vehicle))
then
scoreHolder.addHardConstraintMatch(kcontext, ($dueTime-$arrivalTime+$distance));
end
1 ответ
Решение
После многих итераций, вот правило, которое решает мою проблему / вариант использования.
// TimeWindowedDepot: extra hard constraints
rule "arrivalAfterDueTimeInDepot"
when
TimeWindowedDepot($dueTime : dueTime)
TimeWindowedCustomer(vehicle != null && previousStandstill!=null && previousStandstill==vehicle && $dueTime < arrivalTime + serviceDuration + getDistanceTo(vehicle), $arrivalTime : arrivalTime, $distance : getDistanceTo(vehicle), $serviceDuration : serviceDuration)
then
scoreHolder.addHardConstraintMatch(kcontext, ($dueTime-$arrivalTime+$serviceDuration+$distance));
end
Я думаю, что это может помочь кому-то в будущем.