我基本上想创建一个规则来帮助我以某种方式解决VRP(我优化了距离):
我希望它有时间窗口,这些规则可以正常工作:
// TIME WINDOW &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
rule "arrivalAfterDueTime"
salience -1
when
$customer: TimeWindowedCustomer(dueTime < arrivalTime,
$dueTime : dueTime,
$arrivalTime : arrivalTime)
then
scoreHolder.addHardConstraintMatch(kcontext,
(int)(10*($dueTime - $arrivalTime.intValue())) );
end
// ******************
rule "Delivery in time window"
salience -2
when
$customer:TimeWindowedCustomer(nextCustomer != null,
$arrivalTimeCustomer: arrivalTime)
$actual: TimeWindowedCustomer( previousStandstill == $customer,
$arrivalTimeCustomer>arrivalTime,
$arrival:arrivalTime )
then
scoreHolder.addHardConstraintMatch(kcontext,
(int)(10*($arrival-$arrivalTimeCustomer)) );
end
但是我希望这些车辆能够选择一天中的多个选项。示例:时间窗口是周一到周四上午8:00到下午2:00,因此如果在周一下午3:00发布解决方案,我希望规则考虑周二上午8:00而不是#39;是一个更好的选择,并且在不离开时间窗口的情况下相应地在天和车之间切换路线顺序,但仍然使得有序的交付有效(让OP&#39;选择&#39;在优化距离的同时交付的最佳方式)。
我希望我能很好地解释自己,我不知道问题是否得到了正确解决,如果没有,请告诉我,以便我能解决。
非常感谢!
答案 0 :(得分:0)
您的规则以设定的顺序奖励准时(早期)交付和交付。我没有看到任何关于上午8点到下午2点的间隔或者可能来自星期几的地方。
如果你必须在早上8点到下午2点之间交付所有东西:是否可以在不考虑上午8点到下午2点间隔的情况下查看问题,好像一天的绝对时间根本不重要?这应该构建一条大路线,然后简单地“切割”成6小时的间隔。当然,您无视从本垒到当天的第一位客户以及从最后一位客户到基地的距离。
如果有一点余地,可能会在第二次优化中进行“剪切”,例如,继续比下午2点稍长一点甚至更早停止。