optaplanner 中是否有最小冲突算法?或者怎么做?
将其用作邻域选择的一部分怎么样:
- 定义构建邻域的自定义交换工厂如下
- 获取每个变量的所有违规以进行优化,因此需要调用 scoreDirector.calculateScore 然后解析/处理 constraintMatches
- 按变量排序最低分或最高违规
- 首先通过交换这些变量来构建邻域
如果这是可行的,有没有办法获得约束匹配而无需重新调用 calculateScore 以加快进程
optaplanner 中是否有最小冲突算法?或者怎么做?
将其用作邻域选择的一部分怎么样:
如果这是可行的,有没有办法获得约束匹配而无需重新调用 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()
得到约束总计。
希望这会有所帮助。