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

Java OptaPlanner车辆路线和客户访问之间的关系,java,drools-planner,optaplanner,Java,Drools Planner,Optaplanner,我正在使用OptaPlanner优化车辆路径问题,与提供的示例非常相似 我面临以下挑战,希望能有一些想法 对客户的一些访问与其他访问有关,例如: 一次访问必须与另一次访问同时开始 一次就诊必须在另一次就诊结束后2小时开始 必须将一次就诊分配给分配给另一次就诊的同一辆车 面临的挑战是:如何允许访问的移动,而不会在移动其中一个访问时导致较低的分数 每次访问可能在不同的中文上(分配给不同的车辆),因此所有提供的移动选择器很可能只提供改变一次访问的移动。由于依赖性,这样的移动很可能导致较低的分数,并

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

我面临以下挑战,希望能有一些想法

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

  • 一次访问必须与另一次访问同时开始
  • 一次就诊必须在另一次就诊结束后2小时开始
  • 必须将一次就诊分配给分配给另一次就诊的同一辆车
面临的挑战是:如何允许访问的移动,而不会在移动其中一个访问时导致较低的分数

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

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

目前,我使用禁忌搜索与满意的结果。 延迟接受或许是答案


谢谢。

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

这些描述了摆脱分数陷阱的两个答案:

1) 在这种情况下,改进score函数粒度是行不通的

2) 课程粒度移动在这种情况下有效。例如,您可以添加一个自定义移动工厂(但也保留原始移动选择器,或者更好的是在有或没有原始移动选择器的情况下进行基准测试)。让自定义移动工厂生成不太可能破坏这些约束的移动。例如:如果访问A和B需要同一辆车,请将A移动到另一辆车的链条中,同时将B移动到同一辆车链条中的其他位置(重用
CompositeMove

还有第三种方式我将很快记录下来(但我不认为它很容易适用于这个案例):


3) 在某些情况下,可以将这些硬约束烘焙到模型的类图中(这使得它们构建在硬约束中)。例如,在考试安排中,如果两个或更多的考试需要在同一时间段,则只有一个考试是“领导者”,并且有一个时间段变量。其他的考试是“从众考试”,这意味着他们的时间段在领导者改变时会被影子变量调整。

正是我所担心的,这会增加实施的复杂性,并导致通货膨胀。你认为所有访问的cartesianProductMoveSelector和依赖访问的MoveSelector会起作用吗?@Shatz从技术上讲,我认为你目前会遇到一些障碍,让cartesianProductMoveSelector为你做这件事,因为你希望这两个实体相互关联(仅模拟无法实现这一点)和值。同时,只编写自己的
MoveListFactory
(参见文档)更简单。使用
MoveListFactory
生成移动可能适用于相同的车辆依赖性。但当涉及到时间依赖性时,如相同的开始或完成后开始,在潜在客户访问之前或依赖访问之前,任何访问的移动都将导致得分陷阱。我将使用
cartesianProductMoveSelector
进行基准测试并进行更新。阅读文档中的“模拟”,以便更好地理解
cartesianProductMoveSelector
。可以使用单独的
MoveListFactory
完成时间依赖性安全过程粒度移动。然后加入所有的工厂和一个
changeMoveSelector
。嗨。你最终是怎么做到的?我有一个类似的问题,我们需要两个资源来提供服务。尽管有其他可用资源,但解决方案正在打破硬约束。