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

时间:2013-10-21 17:58:29

标签: java drools-planner optaplanner

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

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

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

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

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

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

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

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

感谢。

1 个答案:

答案 0 :(得分:1)

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

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

1)在这种情况下,改善分数函数粒度将不起作用。

2)课程粒度移动将适用于此案例。例如,您可以添加自定义移动工厂(但保留原始的moveSelectors - 或者更好的是使用和不使用原始moveSelectors进行基准测试)。让自定义移动工厂生成不太可能破坏这些约束的移动。例如:如果访问A和B需要相同的车辆,则在另一个车辆链中移动A,同时将B移动到同一车辆链中的其他地方(重用CompositeMove)。

我的第三种方法很快就会记录下来(但我不认为这很容易适用于这种情况):

3)在某些情况下,可以将这种硬约束烘焙到模型的类图中(这使得它们构建了硬约束)。例如,在考试安排中,如果需要在同一时间段进行2次以上的考试,则只有1次考试是“领导者”并且具有时间段变量。其他考试是“牧群”,这意味着当领导者改变时,他们的时间段会被影子变量调整。