2015-10-14 37 views
0

首先,问题与时间表问题有关。我有要求说,在调度步骤之后,不管算法运行了多长时间,所有预定的课程都必须满足严格的约束条件。而一个问题是,我怎么能做到这一点?我的求解器的配置看起来像这样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)。有没有办法让求解器不能安排尽可能多的课程,而是要满足所有严格的约束条件?

+0

注释掉FAST_ASSERT以在一分钟内解决更快。 –

+0

对于禁忌搜索,已接受的计数限制为100。使用基准测试人员尝试使用禁忌搜索尝试更高的值,或尝试使用低值(通常为1)的延迟接受。如果不存在过度约束的规划,它可以解决这个问题并不会感到惊讶。 –

+0

另见终止,检查是否可行。了解AND和OR终止合成的区别。 –

回答

0

是的,它被称为过度约束规划。在文档中查找该关键字。医院病床计划示例启用了此功能。

0

好了,文件说:

1.Add a additional score level (usually a medium level between the hard and soft level) by switching ScoreDefinition. 
2.Make the planning variable nullable. 
3.Add a score constraint on the new level (so usually a medium constraint) to penalize the number of unassigned entities (or a weighted sum of them). 

所以我做了我的计划变量可为空

@PlanningVariable(valueRangeProviderRefs = {"workingDays"}, strengthWeightFactoryClass = DayLessonNumberStrengthWeightFactory.class, nullable = true) 
public DzienNrLekcji getDzienNrLekcji() { 
    return base.getDzienNrLekcji(); 
} 

@PlanningVariable(valueRangeProviderRefs = {"roomRange"}, strengthWeightFactoryClass = RoomStrengthWeightFactory.class, nullable = true) 
public Sala getSala() { 
    return base.getSala(); 
} 

在接下来的步骤,我添加的中约束FOT未分配经验

rule "scheduledLesson" 
    when 
     $lesson : Lesson(scheduled == false) 
    then 
     scoreHolder.addMediumConstraintMatch(kcontext, -$lesson.getBase().getDuration()); 
end 

和解算器配置与第一条评论保持一致。但变化并没有改善情况。尽管如此,我仍然有很大的限制。我能做什么错?顺便说一句,谢谢你目前的技巧,他们非常有帮助。

相关问题