我正在使用OptaPlanner来优化与提供的示例非常相似的车辆路径问题。
我面临以下挑战,并会欣赏一些想法。
对客户的一些访问与其他访问有关系,例如:
挑战在于:如何允许移动访问而不会在移动其中一个时降低分数?
每次访问可能在不同的中心(分配给不同的车辆),因此所有提供的移动选择器很可能提供仅改变一次访问的移动。这种移动最有可能导致由于依赖性而得分较低,并且永远不会被选中。
相同的开始场景:任何改变一次访问开始时间的动作都会导致得分降低。 相同的车辆情况:任何改变一次访问不同车辆的动作都会导致分数降低。
目前我正在使用禁忌搜索,结果令人满意。 延迟接受可能是答案。
感谢。
答案 0 :(得分:1)
您所描述的是 score trap 的形式。虽然延迟接受可能比禁忌陷阱存在时产生更好的结果(并且它只会改变2行以切换到它),但它仍然会严重影响结果。
那些docs描述了摆脱分数陷阱的2个答案:
1)在这种情况下,改善分数函数粒度将不起作用。
2)课程粒度移动将适用于此案例。例如,您可以添加自定义移动工厂(但保留原始的moveSelectors - 或者更好的是使用和不使用原始moveSelectors进行基准测试)。让自定义移动工厂生成不太可能破坏这些约束的移动。例如:如果访问A和B需要相同的车辆,则在另一个车辆链中移动A,同时将B移动到同一车辆链中的其他地方(重用CompositeMove
)。
我的第三种方法很快就会记录下来(但我不认为这很容易适用于这种情况):
3)在某些情况下,可以将这种硬约束烘焙到模型的类图中(这使得它们构建了硬约束)。例如,在考试安排中,如果需要在同一时间段进行2次以上的考试,则只有1次考试是“领导者”并且具有时间段变量。其他考试是“牧群”,这意味着当领导者改变时,他们的时间段会被影子变量调整。