java - OptaPlanner 车辆路线和客户拜访之间的关系

标签 java drools-planner optaplanner

我正在使用 OptaPlanner 来优化与提供的示例非常相似的车辆路径问题。

我面临以下挑战,并且会欣赏一些想法。

某些对客户的访问与其他访问存在关联,例如:

  • 一次访问必须与另一次访问同时开始。
  • 一次访问必须在另一次访问结束后 2 小时开始。
  • 一次访问必须分配给分配给另一次访问的同一辆车。

挑战是:如何允许访问移动,而在移动其中一个访问时不会导致分数降低?

每次访问可能在不同的机器上(分配给不同的车辆),因此所有提供的移动选择器很可能提供仅改变一次访问的移动。由于依赖性,此类移动很可能会导致分数较低,并且永远不会被选择。

相同的开始场景:任何改变单次访问开始时间的举动都会导致分数降低。 相同车辆场景:任何将一次访问更改为不同车辆的移动都会导致较低的分数。

目前我正在使用 Tabu Search,结果令人满意。 延迟接受可能是答案。

谢谢。

最佳答案

您所描述的是 score trap 的一种形式。虽然当分数陷阱存在时,延迟接受可能会比禁忌搜索产生更好的结果(并且只需更改 2 行即可切换到它),但它仍然会严重影响结果。

那些docs描述摆脱分数陷阱的 2 个答案:

1) 提高评分函数粒度在这种情况下不起作用。

2) 在这种情况下,粗粒度移动将发挥作用。例如,您可以添加自定义移动工厂(但也保留原始 moveSelectors - 或者更好的是在使用和不使用原始 moveSelectors 的情况下进行基准测试)。让自定义移动工厂生成不太可能打破这些限制的移动。例如:如果访问 A 和 B 需要相同的车辆,则将 A 移动到另一个车辆链中,同时将 B 移动到同一车辆链中的其他位置(重用 CompositeMove)。

我很快就会记录第三种方法(但我认为它不容易应用于此案例):

3)在某些情况下,可以将此类硬约束烘焙到模型的类图中(这使它们成为内置硬约束)。例如,在考试安排中,如果需要在同一时间段进行 2 个或更多考试,则只有 1 个考试是“领导者”并且具有时间段变量。其他考试是“群体”考试,这意味着当领导者发生变化时,它们的时间段会通过影子变量进行调整。

关于java - OptaPlanner 车辆路线和客户拜访之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19501486/

相关文章:

java - Drools Planner 考试示例只有一个主题

java - Drools Planner 构造启发式 java.lang.ClassCastException

optaplanner - 如何使用 OptaPlanner 基准蓝图指定 simulatedAnnealingStartingTemperature

optaplanner - 在 optaplanner 中实现自定义移动

java - Retrofit 所有 api 的可重用方法

java - Java 程序星期几

java - Java中Hibernate Session、JSP/Servlet Session和事务管理的Session有什么区别

java - Google BigQuery 的 JDBC 驱动程序?

java - 如何使用 Drools Planner?

使用 optaplanner 和 drools 的 Grails 依赖项