首先,问题与时间表问题有关。我有要求说,在调度步骤之后,不管算法运行了多长时间,所有预定的课程都必须满足严格的约束条件。而一个问题是,我怎么能做到这一点?我的求解器的配置看起来像这样OptaPlanner算法对硬约束的影响
<?xml version="1.0" encoding="UTF-8"?>
<solver>
<solutionClass>com.krakfin.praca.mgr.cp.algorytm.solver.TimetableSolution</solutionClass>
<entityClass>com.krakfin.praca.mgr.cp.algorytm.domain.Lesson</entityClass>
<scoreDirectorFactory>
<scoreDefinitionType>HARD_MEDIUM_SOFT</scoreDefinitionType>
<scoreDrl>com/krakfin/praca/mgr/cp/algorytm/solver/algorytmScoreRules.drl</scoreDrl>
<initializingScoreTrend>ONLY_DOWN</initializingScoreTrend>
</scoreDirectorFactory>
<environmentMode>FAST_ASSERT</environmentMode>
<constructionHeuristic>
<constructionHeuristicType>FIRST_FIT_DECREASING</constructionHeuristicType>
</constructionHeuristic>
<localSearch>
<unionMoveSelector>
<changeMoveSelector>
<valueSelector>
<variableName>dzienNrLekcji</variableName>
</valueSelector>
</changeMoveSelector>
<changeMoveSelector>
<valueSelector>
<variableName>sala</variableName>
</valueSelector>
</changeMoveSelector>
</unionMoveSelector>
<termination>
<!--Default value if not set-->
<secondsSpentLimit>180</secondsSpentLimit>
<bestScoreLimit>0hard/0medium/0soft</bestScoreLimit>
</termination>
<acceptor>
<moveTabuSize>7</moveTabuSize>
</acceptor>
<forager>
<acceptedCountLimit>100</acceptedCountLimit>
</forager>
</localSearch>
</solver>
但举例来说,如果我1分分钟的结果运行算法看起来像(-6hard/-24medium/365soft)。有没有办法让求解器不能安排尽可能多的课程,而是要满足所有严格的约束条件?
注释掉FAST_ASSERT以在一分钟内解决更快。 –
对于禁忌搜索,已接受的计数限制为100。使用基准测试人员尝试使用禁忌搜索尝试更高的值,或尝试使用低值(通常为1)的延迟接受。如果不存在过度约束的规划,它可以解决这个问题并不会感到惊讶。 –
另见终止,检查是否可行。了解AND和OR终止合成的区别。 –