【问题标题】:OptaPlanner CVRPTW - planner configuration to optimize vehicle tripsOptaPlanner CVRPTW - 优化车辆行程的规划器配置
【发布时间】:2013-10-23 04:05:28
【问题描述】:

您好 OptaPlanner 专家,

我是 OptaPlanner 的新手,想请教一下。

据我从this thread得知,在OptaPlanner的CVRPTW示例(版本CR4)中,实体Vehiclehere)代表一辆车的行程(而不是一辆车),我想问一下如何管理实际情况,即车辆数量有限,不能重叠行程

在提到的线程中,建议是用 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


【解决方案1】:

如何配置规划器以最小化 每辆车的 VehicleTrip 次数?

使用平方技巧:

when
  $v : Vehicle
  $count : Number() from accumulate (VehicleTrip(vehicle == $v), count())
then
  scoreHolder.addSoftConstraintMatch(kcontext, - $count * $count);
end

【讨论】:

  • 这条规则没有被触发。我迷路了。此外,我将规则更改为:rule "vehicleTripsPerVehicle" when $v : VrpVehicle() $count : Integer() from accumulate (VrpVehicleTrip(vehicle.equals($v)), count()) then scoreHolder.addSoftConstraintMatch(kcontext, - $count * $count); end,因为它在“accumulate from”周围产生语法错误。有什么提示吗?
  • 我认为我使用了错误的模型。规则未触发,因为类 Vehicle 需要是 PlanningEntity。有必要使用比这几个字符更多的空间来解释这个问题......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
  • 2014-04-12
  • 2020-08-04
  • 2013-05-28
  • 1970-01-01
相关资源
最近更新 更多