如何在optaplanner中使用min-conflict算法

时间:2015-04-21 15:36:11

标签: optimization optaplanner rostering

optaplanner中是否存在最小冲突算法?或者怎么做?

如何使用它作为邻里选择的一部分,如:

  1. 定义构建邻域的自定义交换工厂,如下所示
  2. 获取每个变量的所有违规以进行优化,因此需要调用scoreDirector.calculateScore然后解析/处理constraintMatches
  3. 按变量排序最低分或最高违规行为
  4. 首先通过交换这些变量构建邻域
  5. 如果可行,是否有办法获得constraintMatches而无需重新调用calculateScore以加快流程

2 个答案:

答案 0 :(得分:1)

OptaPlanner尚不支持此算法。我称之为引导本地搜索。但添加自己并不难。实际上,这不是改变算法的问题,而是改变实体选择器。

这样的事情应该有效:

<swapMoveSelector>
  <entitySelector>
    <cacheType>STEP</cacheType>
    <probabilityWeightFactoryClass>...MyProbabilityWeightFactory</probabilityWeightFactoryClass>
  </entitySelector>
</swapMoveSelector>

了解the advanced swapMoveSelector configurationentity selectorsorted selectionprobability selection

为概率选择或排序选择实现的回调类应优先考虑属于冲突的实体。

我肯定会在实体选择器上使用已排序或概率选择,而不是整个swapMoveSelector,因为这是过度杀伤,cpu饥饿和内存耗尽。

我更倾向于对排序选择进行概率选择。尽管排序选择更能反映您的伪代码,但我相信(但尚未证明)鉴于Metaheuristics的本质,概率选择会做得更好。尝试两者,与Benchmarker一起运行一些基准,让我们知道最有效的方法;)

答案 1 :(得分:0)

不确定如何解决整体问题,但最后一点:

您可以创建PhaseLifecycleListener并通过((DefaultSolver) solver).addPhaseLifecycleListener

附加它

在stepStarted或stepEnded中(根据您的需要),您可以调用

stepScope.getScoreDirector().getConstraintMatchTotals()

获取约束总数。

希望这有点帮助。