繁体   English   中英

如何在Optaplanner中使用最小冲突算法

[英]How to use min-conflict algorithm with optaplanner

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

如何将其用作邻域选择的一部分,例如:

  1. 定义构造邻居的自定义交换工厂,如下所示
  2. 获取每个变量的所有违规以进行优化,因此需要调用scoreDirector.calculateScore,然后解析/处理constraintMatches
  3. 按变量排序最低得分或最高违规
  4. 通过先交换那些变量来构造邻域

如果可行,是否有一种方法可以获取constraintMatches,而无需重新调用calculateScore以加快流程

OptaPlanner尚不支持此算法。 我将其称为“ 本地指导搜索” 但是添加自己并不难。 实际上,更改算法不是问题,而是更改实体选择器。

这样的事情应该起作用:

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

阅读有关高级swapMoveSelector配置实体选择器排序选择概率选择的信息

为概率选择或排序选择实现的回调类应优先考虑作为冲突一部分的实体。

我肯定会在实体选择器上使用排序或概率选择,而不是整个swapMoveSelector,因为那太过分了,CPU饿了,内存也饿了。

与排序选择相比,我更喜欢概率选择。 即使排序选择更好地反映了您的伪代码,但我相信(但尚未证明),考虑到元启发式算法的性质,概率选择会更好。 尝试两者,使用Benchmarker进行一些基准测试,然后让我们知道最有效的方法;)

不知道如何解决您的整体问题,但是对于最后一点:

您可以创建一个PhaseLifecycleListener并通过((DefaultSolver) solver).addPhaseLifecycleListener附加它。

然后在stepStarted或stepEnded(取决于您的需要)中,可以调用

stepScope.getScoreDirector().getConstraintMatchTotals()

得到约束总数。

希望这会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM