2016-03-28 13 views
1

Gibt es eine Möglichkeit, eine benutzerdefinierte Bewegung in eine Konstruktionsheuristik zu versetzen? Ich arbeite an einem Projekt, das dem Problem der Krankenschwesterplanung in optaplanner nahe steht, aber abgesehen davon, dass ich den Angestellten nur in einen Schichteinsatz versetzen muss, muss ich den Angestellten auch kleine Aufgaben stellen, die innerhalb einer Schicht benötigt werden. Also wenn ich den Angestellten in eine Schicht stelle, muss ich den Angestellten in alle kleinen Aufgaben setzen, an denen er arbeiten kann (hat die Fähigkeit für sie). Ich möchte nicht, dass dies eine zweite Planungseinheit ist und der Mitarbeiter die Planungsvariable ist. Ich möchte nur, wenn ich den Mitarbeiter einer Schicht zuordne, dann durch alle kleinen Zuordnungen, die innerhalb dieser Schicht liegen (zwischen Anfang und Ende) Zeiten der Schicht) und ihn entweder zuweisen oder nicht, also wenn er die Fähigkeit hat, muss er zugewiesen werden, andernfalls nicht. Ich habe Probleme, diese benutzerdefinierte Bewegung in der Konstruktionsheuristik zu setzen. Gibt es einen Weg?Benutzerdefinierte Bewegung in Konstruktionsheuristik

EDIT: Wird es gut sein, ein "Preisschild" auf jede Schicht zu setzen, bedeutet dies, durch eine Pre-Optaplanner-Heuristik zu laufen (bevor die Lösung beginnt), die die Anzahl der kleinen Aufträge in jeder Schicht zählt. Dann verwenden Sie diese Informationen später, um zu entscheiden, ob ein Mitarbeiter für diese Schicht gut ist oder nicht, sagen wir, er kann einer bestimmten Schicht zugeordnet werden, wenn er die Fähigkeit hat, mindestens 70% der kleinen Aufgaben zu erfüllen nächste kleine Zuordnungen (SA), die innerhalb der Schichtzeit auftreten: SA1 4 Vorkommnisse, SA2 4 Vorkommen, SA3 2 Vorkommnisse, und wir haben employee1 mit Fähigkeiten für SA1 und SA2 und employee2 mit nur der Fähigkeit für SA1, dann employee1 kann der Schicht zugeordnet werden, weil er mehr als 70% kleine Aufgaben erfüllt, aber Mitarbeiter2 kann nicht, weil er nur 40% erfüllt. Dann, nachdem der Mitarbeiter in die Schicht "hinein" gekommen ist, weisen Sie ihn allen Aufgaben zu, die er bearbeiten kann (wenn er die Fähigkeit für die kleine Aufgabe hat, wird er daran arbeiten, gibt es keine Beschränkungen für die kleinen Aufgaben außer dem Mitarbeiter) habe die erforderlichen Fähigkeiten). Es wird keine Entscheidung geben, welcher Mitarbeiter eine kleine Aufgabe übernehmen soll, jeder Mitarbeiter wird derselbe sein, wenn er der Schicht zugeordnet wird und die Fähigkeit hat. Ist das eine gute Idee?

Und können auch mehrere Planungswerte einer einzelnen Instanz der Planungseinheit zugeordnet werden? In diesem Fall können mehrere Mitarbeiter einer Schicht zugeordnet werden (ich nehme das nur als Beispiel, ich habe nicht vor, es so zu machen).

Antwort

1

Überprüfen Sie die erweiterte Konfiguration von Konstruktionsheuristiken in den Dokumenten. Konstruktion Heuristiken funktionieren nur mit ChangeMove's und Kombinationen (Cartesian, Union, Sequenz) davon. Zum Beispiel, wenn Sie zwei Einheiten A und B (jeweils mit 1 Variable) mit 10 A-Instanzen und 7 B Fälle ist es möglich:

  • 2 CH-Gruppen zu haben: die erste CH all die A zuordnet und anschließend die zweite weist alle B zu. Also ordnet er in dieser Reihenfolge zu: A1, A2, A3, ..., A10, B1, B2, ..., B7 (und für jeden versucht es jeden Planungswert).
  • Um 1 CHs zu haben, die eine Mischung aus A und B zuweisen. So weist es in einer gemischten Reihenfolge zu (definiert durch den Entity-Sortierer): A1, B1, B2, A2, B4, A3, ..., B7, A10 .
  • (Wenn es nur 1 Entity-Klasse, aber 2 Variablen ist, ist es möglich, ein kartesisches Produkt oder eine sequentielle Zuordnung zu tun.)

Wie auch immer, wenn das nicht schneiden, eine CustomPhaseCommand für die volle Freiheit implementieren (siehe Dokumente und Beispiele, die eine Klasse ...Initializer haben).

neben nur die Mitarbeiter zu einer Verschiebung Zuordnung setzen muss ich auch setzen die Mitarbeiter auf kleine Aufgaben, die innerhalb einer Schicht erforderlich sind

Klingt wie Ihr Modell ineffizient sein könnte. Betrachten Sie alternative Modelle nur 1 Planung Variable haben:

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

Oder besser definieren, was eine „Verschiebung“ ist: Wenn zwei Personen zur gleichen Zeit arbeiten, verwenden sie die gleiche Verschiebung Instanz? Wenn Ihr Unternehmen Komplexität könnte dieses Modell benötigen:

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

Aber in diesem Fall würde ich könnte prüfen, ob es so refactorable ist (was nur möglich ist, wenn die kleinen Aufgaben perfekt greedly zugeordnet werden, so dass ihre Zwänge aren 't NP-hart):

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

Danke das war wirklich hilfreich. Ich habe eine andere Frage als eine Bearbeitung gestellt, die eine Ergänzung zu derselben Frage darstellt. –