【发布时间】:2013-10-23 04:05:28
【问题描述】:
您好 OptaPlanner 专家,
我是 OptaPlanner 的新手,想请教一下。
据我从this thread得知,在OptaPlanner的CVRPTW示例(版本CR4)中,实体Vehicle(here)代表一辆车的行程(而不是一辆车),我想问一下如何管理实际情况,即车辆数量有限,不能重叠行程。
在提到的线程中,建议是用 VehicleTrip 替换实体 Vehicle,并创建一个新的 Vehicle 实体。 我想新的 Vehicle 有一个 VehicleTrip 对象的列表(因为一辆车一天可以做几次旅行——例如)。 但是如何配置规划器以最小化每辆车的 VehicleTrip 数量?
应该如何修改示例? (我不关心 Swing 部分,只关心模型和规划器的配置 - listeners/DRL/XML)
编辑
我如上所述修改了模型并在VrpTimeWindowedVehicleRoutingSolution类中创建了方法int getOverlappingTime(),它返回相同Vehicle的不同VehicleTrips的重叠时间数量。然后我创建了以下规则:
rule "vehicleTripsOverlapping"
when
$solution : VrpTimeWindowedVehicleRoutingSolution()
then
scoreHolder.addHardConstraintMatch(kcontext, - $solution.getOverlappingTime());
end
该方法工作正常(经过测试),但分数没有改变(似乎没有触发规则)。请问有谁可以帮帮我吗?
【问题讨论】:
-
解决方案本身 (
VrpTimeWindowedVehicleRoutingSolution) 没有插入 Drools 工作内存,所以这就是 EDIT 不起作用的原因。在任何情况下,solution.getOverlappingTime()都不是增量的(请参阅文档),因此它不可扩展,因此在向外扩展时非常慢。这基本上就是 optaplanner 不费心插入解决方案的原因(因为它是一种反模式)。
标签: java drools drools-planner optaplanner