2015-10-14 121 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 

和解算器配置與第一條評論保持一致。但變化並沒有改善情況。儘管如此,我仍然有很大的限制。我能做什麼錯?順便說一句,謝謝你目前的技巧,他們非常有幫助。