![](/img/trans.png)
[英]OPTAPLANNER: How to apply GroupBy to MultiConstraintStream
[英]How to use min-conflict algorithm with optaplanner
optaplanner中是否存在最小冲突算法? 或怎么做?
如何将其用作邻域选择的一部分,例如:
如果可行,是否有一种方法可以获取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.