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