2013-03-27 1 views
0

Drools와 함께 많은 경험 프로그래밍이 없지만 차량 라우팅과 비슷한 프로젝트를 진행하고 있습니다. 무작위 종자에 따라 약간의 움직임을 제외하고 거의 모든 것이 잘 작동합니다.Drools Planner Move

문제는 휴리스틱 단계가 완료되면, 때로는 로컬 검색 단계가 같은 이상한 움직임을 만드는 점이다 다음 하나

휴리스틱 단계 솔루션 :

일 1 : 장소 1 -> 장소 2 -> 장소 3 -> 장소 4 -> 장소 5 -> 장소 6 하루 2 : 장소 7 -> 장소 8 -> 장소 9 -> 장소 10

로컬 검색 이동 : 장소 5가 2 일로 이동 솔루션 :

일 1 : 장소 1 -> 장소 2 -> 장소 3 -> 장소 4 하루 2 : 장소 5 -> 장소 6

나머지 날은 아무 날도 남지 않습니다 (이 예에서는 차량 일 것입니다) 그리고 그들은는 비 고정 체인으로 남아 있습니다 :

곳 (7) -> 장소 8 -> 장소 9 -> 장소 10 -> 장소 7 -> 등

그래서, 프로그램이 어떤 날을 찾습니다 때 그 중 무한 루프가됩니다. 분명히, 그 문제는 그 고리에서 벗어나는 방법이 아닙니다. (나는 그 멍청한 놈이 아닙니다.) 그 움직임을 피하는 방법입니다.

저는 솔버 클래스를 변경하는 것과 같은 솔버 구성을 사용하므로 그 이동을 왜하는지 이해하지 못합니다. 내 자신의 Move 클래스를 코딩해야한다고 생각하지만 코드 작성법이나 MoveFactory 예제를 찾을 수 없습니다. 코드 블록에 solver.xml을 남깁니다.

Move 및 MoveFactory 클래스를 코딩하는 방법을 배우는 데 도움이되는 링크 나 팁이 있으면 도움이 될 것입니다.

어쨌든 시간과 노력에 감사드립니다. 5.5.0.Final에

<?xml version="1.0" encoding="UTF-8"?> 
<solver> 
    <!--<environmentMode>DEBUG</environmentMode>--> 
    <environmentMode>PRODUCTION</environmentMode> 
    <solutionClass>org.tourgune.planificador.bean.Turista</solutionClass> 
    <planningEntityClass>org.tourgune.planificador.bean.PuntoInteres</planningEntityClass> 

    <scoreDirectorFactory> 
    <scoreDefinitionType>HARD_AND_SOFT</scoreDefinitionType> 
    <scoreDrl>/org/tourgune/planificador/core/planificadorScoreRules.drl</scoreDrl> 

    </scoreDirectorFactory> 

    <termination> 
    <maximumMinutesSpend>4</maximumMinutesSpend> 
    </termination> 
    <constructionHeuristic> 
    <constructionHeuristicType>FIRST_FIT</constructionHeuristicType> 
    </constructionHeuristic> 
    <localSearch> 
    <selector> 
     <selector> 
      <moveFactoryClass>org.drools.planner.core.move.generic.GenericChainedChangeMoveFactory</moveFactoryClass> 
     </selector> 
     <selector> 
     <moveFactoryClass>org.drools.planner.core.move.generic.GenericChainedChangePartMoveFactory</moveFactoryClass> 
     </selector> 
     <!-- TODO needs a GenericChainedSwapMoveFactory and probably even a GenericChainedSwapPartMoveFactory --> 
    </selector> 
    <acceptor> 
     <planningEntityTabuSize>10</planningEntityTabuSize> 
    </acceptor> 
    <forager> 
     <minimalAcceptedSelection>0</minimalAcceptedSelection> 
    </forager> 

    </localSearch> 
    <!--<localSearch>--> 
    <!--<selector>--> 
     <!--<selector>--> 
     <!--<moveFactoryClass>org.drools.planner.core.move.generic.GenericChainedChangeMoveFactory</moveFactoryClass>--> 
     <!--</selector>--> 
     <!--<selector>--> 
     <!--<moveFactoryClass>org.drools.planner.core.move.generic.GenericChainedChangePartMoveFactory</moveFactoryClass>--> 
     <!--</selector>--> 
    <!--</selector>--> 
    <!--<acceptor>--> 
     <!--<simulatedAnnealingStartingTemperature>10</simulatedAnnealingStartingTemperature>--> 
    <!--</acceptor>--> 
    <!--<forager>--> 
     <!--<minimalAcceptedSelection>4</minimalAcceptedSelection>--> 
    <!--</forager>--> 
    <!--</localSearch>--> 
</solver> 

답변

0

업그레이드 첫째, 그래서 당신은 단지 대신 그 일반적인 공장의 <changeMoveSelector/>를 사용할 수 있습니다. 업그레이드 레시피 txt를 따릅니다.

그래도 문제가 계속되면 DEBUG를 사용하여 스코어 손상을 감지하십시오 (일반적으로 클론 방법 또는 해킹 점수 규칙으로 인해 발생 함). OptaPlanner (= Drools Planner) 6.0을 사용하면 스코어 규칙을 작성하기가 쉬워지고 스코어 손상에 직면 할 가능성이 줄어 듭니다.

+0

대단히 감사합니다. 5.5.0.Final (현재 5.4.0Final 사용)으로 업데이트하고 changeMoveSelector를 사용하여 작동하는지 알려 드리겠습니다. – unugarte