2015-02-04 2 views
0

차량 라우팅과 유사한 체인 문제 인 설치 프로그램 예약 할당 문제를 해결하기 위해 Optaplanner를 사용하고 있습니다. 설치자 (차량)에는 여러 예약 (고객)이 할당되어있을 수 있습니다. 특정 주문에 대해 다른 예약과 관련하여 하나의 예약을 평가해야하기 때문에 체인을 구현해야합니다. 그래서 내 솔루션에서 Booking 및 Installer를 @PlanningEntityCollectionProperty로 선언했습니다. Booking와 Installer 모두 Standstill을 구현합니다. 그러나 예약에서 만 getPreviousStandstill() 메서드에 대해 @PlanningVariable을 선언했습니다.Optaplanner는 단일 체인 솔루션 만 생산합니다.

내 설정은 :

<solver> 
    <!--<environmentMode>FAST_ASSERT</environmentMode>--> 

    <!-- Domain model configuration --> 
    <solutionClass>InstallationSolution</solutionClass> 
    <entityClass>Standstill</entityClass> 
    <entityClass>Booking</entityClass> 



    <!-- Score configuration --> 
    <scoreDirectorFactory> 
    <scoreDefinitionType>HARD_SOFT</scoreDefinitionType> 
    <!--<easyScoreCalculatorClass>org.optaplanner.examples.cloudbalancing.solver.score.CloudBalancingEasyScoreCalculator</easyScoreCalculatorClass>--> 
    <!--<easyScoreCalculatorClass>org.optaplanner.examples.cloudbalancing.solver.score.CloudBalancingMapBasedEasyScoreCalculator</easyScoreCalculatorClass>--> 
    <!--<incrementalScoreCalculatorClass>org.optaplanner.examples.cloudbalancing.solver.score.CloudBalancingIncrementalScoreCalculator</incrementalScoreCalculatorClass>--> 
    <!--<scoreDrl>com/tmrnd/pejal/opta/solver/fulfillmentScoreRules.drl</scoreDrl>--> 
    <initializingScoreTrend>ONLY_DOWN</initializingScoreTrend> 
    <!--<assertionScoreDirectorFactory>--> 
     <!--<easyScoreCalculatorClass>org.optaplanner.examples.cloudbalancing.solver.score.CloudBalancingMapBasedEasyScoreCalculator</easyScoreCalculatorClass>--> 
    <!--</assertionScoreDirectorFactory>--> 
    </scoreDirectorFactory> 

    <!-- Optimization algorithms configuration --> 
    <termination> 
    <!-- <secondsSpentLimit>20</secondsSpentLimit>--> 
    <unimprovedSecondsSpentLimit>15</unimprovedSecondsSpentLimit> 
    </termination> 
    <constructionHeuristic> 
    <constructionHeuristicType>FIRST_FIT_DECREASING</constructionHeuristicType> 

    </constructionHeuristic> 
    <localSearch> 
    <unionMoveSelector> 
     <changeMoveSelector/> 
     <swapMoveSelector/> 
     <subChainChangeMoveSelector> 
     <selectReversingMoveToo>true</selectReversingMoveToo> 
     </subChainChangeMoveSelector> 
     <subChainSwapMoveSelector> 
     <selectReversingMoveToo>true</selectReversingMoveToo> 
     </subChainSwapMoveSelector> 
    </unionMoveSelector> 
    <acceptor> 
     <entityTabuSize>20</entityTabuSize> 

    </acceptor> 
    <forager> 
     <acceptedCountLimit>1000</acceptedCountLimit> 
    </forager> 
    </localSearch> 
</solver> 

내가) (해결하려고

, 나는 그에게 asssigned 모든 예약 하나 개의 설치를 얻었다. 상황을 개선하기 위해해야 ​​할 일은 무엇입니까?

답변

1

OptaPlanner에 알려진 앵커는 1 명 (설치자 1 명)입니다. 솔루션 목록의 크기가 1보다 큰지 확인하십시오. 그런 다음 getter에 @ValueRangeProvider이 있는지 확인하고 해당 ValueRangeProvider의 ID가 @PlanningEntity의 valueRangeProviderRefs에 추가되는지 확인합니다.

또한 여기에 적용될 수있는 공통적 인 함정 (값 범위 공급자를 올바르게 사용하는 경우)은 list.addAll(list) 대신 list.add(list)이어야합니다.

+0

사실 facts.addAll()을 getProblemFacts()에서 facts.add()로 변경했지만 여전히 동일한 문제가 있습니다. 주석 처리를 해제하거나 내 '@ PlanningVariable'을 CHAINED로 바꾼 후에도 다음과 같은 예외가 발생합니다. 발생 원인 : java.lang.IllegalStateException : 로컬 검색 단계가 초기화되지 않은 솔루션으로 시작되었습니다. 먼저 솔루션을 초기화하십시오. 예를 들어, 먼저 건설 휴리스틱 단계를 실행하십시오. 그러나 예외 전에 프로그램에서 기록한 내용은 다음과 같습니다. 건설 휴리스틱 단계 (0) : 단계 합계 (1456), 소요 시간 (15875), 최고 점수 (-2761hard/-195507soft). –

+0

사실 .addAll()이 올바른 방법입니다. –

+0

나는 무작위로 변경하는 대신 문서를 읽는 것으로 돌아갈 때가되었다고 생각합니다. 특히 체인 된 변수에 대한 계획 구성 장을 읽으십시오. –