2013-03-27 3 views
0

Je n'ai pas beaucoup d'expérience en programmation, encore moins avec Drools, mais je fais un projet similaire à celui du routage de véhicules. Presque tout fonctionne bien, sauf pour certains mouvements, en fonction de la graine aléatoire.Drools Planner Move

Le problème est que, une fois la phase Heuristique se fait, parfois la phase de recherche locale fait quelques mouvements étranges, comme la suivante:

solution de phase Heuristique:

jour 1: 1 place -> place 2 -> place 3 -> place 4 -> place 5 -> place 6 jour 2: place 7 -> place 8 -> place 9 -> place 10

Recherche de déménagement: lieu 5 déménagement au jour 2 Solution:

jour 1: place 1 -> place 2 -> place 3 -> place 4 jour 2: place 5 -> place 6

Le reste des places est laissé sans jour (dans l'exemple ce serait le véhicule) et ils sont laissés comme une chaîne unanchored:

lieu 7 -> lieu 8 -> lieu 9 -> lieu 10 -> lieu 7 -> etc

Ainsi, lorsque le programme recherche le jour de tout d'entre eux, il entre dans une boucle infinie. Évidemment, le problème n'est pas comment sortir de cette boucle (je ne suis pas ce noob), c'est comment éviter ces mouvements.

J'utilise la même configuration de solveur que l'exemple (en changeant la classe de solveur etc.) donc je ne comprends pas pourquoi il fait ces mouvements. Je pense que je devrais coder ma propre classe Move, mais je ne trouve pas d'exemples de codage, ni de MoveFactory. Je laisse le solver.xml dans un bloc de code.

Des liens ou des astuces qui m'aideraient à coder une classe Move et une classe MoveFactory seraient utiles, ainsi que des conseils de configuration pour éviter cela (s'il y en a).

En tout cas, merci à tous pour votre temps et vos efforts.

<?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> 

Répondre

0

Mise à niveau vers 5.5.0.Final d'abord, vous pouvez simplement utiliser <changeMoveSelector/> au lieu de ces usines génériques. Suivez le txt de recette de mise à niveau.

Si le problème persiste, activez DEBUG pour détecter la corruption de partition (généralement provoquée par la méthode clone ou les règles de score hacky). OptaPlanner (= Drools Planner) 6.0 rendra plus facile l'écriture de règles de score et rendra beaucoup moins probable que vous fassiez face à une corruption de score.

+0

Merci beaucoup, je vais mettre à jour à 5.5.0.Final (actuellement en utilisant 5.4.0Final) et utiliser changeMoveSelector et vous dire si cela a fonctionné. – unugarte