2016-03-28 4 views
1

Existe-t-il un moyen de placer un mouvement personnalisé dans une heuristique de construction? Je travaille sur un projet qui se rapproche du problème des listes d'infirmières dans optaplanner, mais en plus de simplement mettre l'employé à un poste de travail, je dois également affecter l'employé à de petites tâches. Donc, quand je mets l'employé dans un quart de travail, je dois mettre l'employé dans toutes les petites tâches sur lesquelles il peut travailler (a la compétence pour eux). Je ne veux pas que ce soit une deuxième entité de planification et l'employé étant la variable de planification, je veux juste quand j'assigne l'employé à un poste puis boucle toutes les petites affectations qui sont dans ce quart (sont entre le début et la fin les temps du quart) et soit l'assigner ou pas, donc s'il a la compétence il doit être assigné, autrement non. Je n'arrive pas à mettre ce mouvement personnalisé dans l'heuristique de construction. Y a-t-il un moyen? Sera-t-il bon de mettre une "étiquette de prix" sur chaque quart de travail, c'est-à-dire de parcourir une heuristique pré optaplanner (avant le début de la résolution) qui compte le nombre de petites assignations dans chaque quart de travail. Ensuite, utilisez plus tard cette information pour décider si un employé sera bon pour ce quart de travail ou non, disons qu'il peut être affecté à un quart donné s'il a les compétences pour rencontrer au moins 70% des petites affectations. Par exemple, nous avons le prochaines petites affectations (SA) qui surviennent dans le temps du quart: SA1 4 occurrences, SA2 4 occurrences, SA3 2 occurrences, et nous avons employee1 qui a des compétences pour SA1 et SA2 et employee2 qui n'a que la compétence pour SA1, puis employee1 peut être affecté au quart parce qu'il rencontre plus de 70% de petites affectations, mais que le salarié2 ne peut pas parce qu'il ne rencontre que 40%. Ensuite, après que le salarié soit dans le poste, il lui suffit de lui assigner toutes les tâches qu'il peut travailler (s'il a la compétence pour la petite tâche sur laquelle il travaillera, il n'y aura pas de contraintes pour les petites affectations avoir la compétence requise). Il n'y aura pas de décision selon laquelle l'employé doit effectuer une petite affectation, chaque employé sera le même, s'il a été affecté au quart de travail et possède les compétences nécessaires. Est-ce une bonne idée à faire?Custom Déplacer dans l'heuristique de construction

Et peut-il y avoir plusieurs valeurs de planification assignées à une seule instance de l'entité de planification? Dans ce cas, peut-il y avoir plusieurs employés assignés à une seule instance d'affectation de quart (je prends juste cela comme exemple, je ne prévois pas de faire comme ça)?

Répondre

1

Vérifiez la configuration avancée de Construction Heuristics dans les documents. La construction heuristique ne fonctionne qu'avec ChangeMove et ses combinaisons (cartésiennes, union, séquence). Par exemple, si vous avez 2 entités A et B (chacun avec 1 variables) avec 10 A instances et 7 B cas, il est possible:

  • avoir 2 CH de: le premier CH affecte tous les A et ensuite la seconde affecte tous les B. Il affecte donc dans cet ordre: A1, A2, A3, ..., A10, B1, B2, ..., B7 (et pour chacune il essaye chaque valeur de planification).
  • Pour avoir 1 CH qui assigne un mélange de A et B. Il affecte donc dans un ordre mélangé (défini par le trieur d'entité): A1, B1, B2, A2, B4, A3, ..., B7, A10 .
  • (S'il n'y a que 1 classe d'entité, mais 2 variables, il est possible de faire un produit cartésien ou une assignation séquentielle.)

Quoi qu'il en soit, si cela ne coupe pas, mettre en œuvre une CustomPhaseCommand pour la pleine liberté (voir les documents et exemples ayant une classe ...Initializer).

en plus juste de mettre l'employé à une affectation de décalage Je dois aussi mettre l'employé aux petites missions qui sont nécessaires dans un quart de travail

sons comme votre modèle pourrait être inefficace. Pensez à d'autres modèles pour avoir seulement 1 variables de planification:

class Employee {} 
class Shift {} 
@PlanningEntity class SmallAssignment { 
    Shift shift; 
    @PlanningVariable Employee employee; 
} 

Ou mieux définir ce qu'est un « changement » est: si 2 personnes travaillent en même temps, ils utilisent la même instance de changement? Comme la complexité de votre entreprise pourrait avoir besoin de ce modèle:

class Employee {} 
class ShiftWithDateTime {} 
@PlanningEntity lass ShiftWithDateTimeAndEmployee { 
    ShiftWithDateTime shiftWithDateTime; 
    @PlanningVariable Employee employee; 
} 
@PlanningEntity class SmallAssignment { 
    ShiftWithDateTime shiftWithDateTime; 
    @PlanningVariable Employee employee; 
} 

Mais dans ce cas, je peut vérifier si elle est refactorable comme celui-ci (qui est seulement possible si les petites tâches peuvent être parfaitement attribués greedly, de sorte que leurs contraintes Aren 't NP-dur):

class Employee {} 
@PlanningEntity class ShiftWithDateTime { // shadow entity 
    @InverseRelationShadow List<ShiftWithDateTimeAndEmployee> assignments; 
    boolean hasEnoughEmployeesToFulfillAllSmallAssignments() { ... } 
} 
@PlanningEntity lass ShiftWithDateTimeAndEmployee { 
    ShiftWithDateTime shiftWithDateTime; 
    @PlanningVariable Employee employee; 
} 
+0

Merci beaucoup, c'était très utile. J'ai mis une autre question sous forme de modification, qui s'ajoute à la même question. –