【问题标题】:OptaPlanner vehicle routing and relations between customer visitsOptaPlanner 车辆路线和客户访问之间的关系
【发布时间】:2013-10-21 17:58:28
【问题描述】:

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

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

对客户的某些访问与其他访问有关系,例如:

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

挑战是:如何在移动访问时允许移动访问而不导致分数降低?

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

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

目前我正在使用禁忌搜索,结果令人满意。 迟到可能是答案。

谢谢。

【问题讨论】:

  • 嗨。你最后是怎么处理的?我有一个类似的问题,我们需要两个资源来提供服务。尽管有其他可用资源,但该解决方案正在打破硬约束。

标签: java drools-planner optaplanner


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 正是我所担心的,这会增加实现的复杂性并导致移动膨胀。您认为所有访问移动选择器和依赖访问移动选择器的笛卡尔产品移动选择器会起作用吗?
  • @Shatz 从技术上讲,我认为您目前会遇到几堵墙来让 cartesianProductMoveSelector 为您做到这一点,因为您希望 2 个实体相关联(仅模拟不起作用)和价值观。 We 're thinking about supporting this in the future though, see this jira.。同时,编写自己的MoveListFactory 更简单(请参阅文档)。
  • 使用MoveListFactory 生成移动可能适用于相同的车辆依赖性。但是,当涉及到时间相关性时,例如相同的开始或完成后的开始,在引导访问之前或从属访问之前的任何访问的任何移动都将导致得分陷阱。我将使用cartesianProductMoveSelector 进行基准测试并更新。
  • 阅读文档中的“模仿”,更好地理解cartesianProductMoveSelector。时间依赖性安全路线粒度移动可以通过单独的MoveListFactory 来完成。然后将所有这些工厂和changeMoveSelector 混合在一起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 2020-08-04
  • 2020-07-25
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
相关资源
最近更新 更多