2017-10-17 10 views
2

Ceci est dans le contexte d'un problème de planification de tâches où une chaîne de tâches (T1, T2, T3 etc.) est affectée à un employé (ancre), par exemple E1. Ainsi, le résultat prévu est généralement le suivant:Correction d'une tâche à un employé dans une variable de planification chaînée

E1 -> T1 -> T2 -> T3 

T1, T2 et T3 pourraient provenir de n'importe quelle liste de tâches. Maintenant, ce que je veux est quelque chose comme de la liste de T1, T2, T3, T4, T5, T6 .., T3 doit être affecté à E1. En termes simples, T3 doit être lié quelque part entre (peut-être pas le premier) la chaîne de l'ancre E1. Optaplanner n'a d'option que pour sélectionner entityOrAnchor dans une variable de planification chaînée et cela fonctionnera si je veux que la première tâche soit assignée à un employé mais je veux une tâche qui est supposée se produire plus tard dans la journée.

Solution Je peux penser à:
1. Conservez une variable supplémentaire 'assignEmployee'.
2. Maintenez une contrainte stricte afin que assignEmployee corresponde à l'ancre, c'est-à-dire l'employé. Cela fonctionnera dans les mêmes cas et je devrai garder une contrainte forte (pondérée) très forte mais le problème est que je ne veux pas le garder comme une contrainte car il est impossible d'assigner cette tâche à un autre employé et je voudrais le modéliser de sorte qu'une tâche spécifique soit assignée à un employé spécifique. Quelles autres options avons-nous?

Qu'est-ce que je veux cela? C'est parce qu'une tâche dans T3 ci-dessus est une sorte de pause spécifique à cet employé et la raison pour laquelle je garde break comme une tâche est parce que breakplace est aussi un emplacement et devrait être planifié en fonction des tâches à proximité pour éviter totalement temps de conduite distinct.

Répondre

0

est ici la solution qui a fonctionné pour moi:

Si T3 est la tâche dans la chaîne que vous souhaitez affecter un employé E1, puis avant de soumettre à Optaplanner, attribuer T3 à E1 en utilisant:

  • E1.setNextTask (T3) --InverseShadowVar
  • T3.prevTaskOrEmployee (E1) - véritable var
  • T3.setEmployee (E1) - Anchor ombre var
  • T3.setEmployeeLocked (true)

Ceci rend T3 déjà initialisé avec l'employé E1 afin que CH ne le change pas. Maintenant, filtrez tous vos mouvements LS (change/swap/chain) de telle sorte qu'ils n'essaient pas de déplacer la tâche avec l'employé verrouillé à un autre employé.