Ja, interessanter Ansatz. Im Prinzip muss das Programm einen Haufen verschiedener "Stellungen" (=schon zugeordnete Abteilungen / Azubis, noch nicht zugeordnete) durchrechnen, wie ein Schachprogramm, bis die Partie so oder so zu Ende ist und dabei immer bewerten, wie gut das erreichte Ergebnis ist.
Zum Thema Optimierung (und dies ist ein Optimierungsproblem) gibt es schon viele schlaue Algorithmen.
Im Zweifelsfall muss man brutforce Variablen für jeden Azubi für jede Woche einführen, die angibt, in welcher Abteilung er ist. Und dann gibt man dazu die ganzen Constraints an, etwa Abteilung x nicht vor Abteilung y, So und soviele Wochen in der und der Abteilung, dies nicht zu sehr gestückelt, nicht zu viele Azubis gleichzeitig etc.pp.
Das ganze wird noch dadurch verkompliziert, dass die Azubis in unterschiedlichen Wochen anfangen, aber ist machbar.
Dafür, das Leute krank werden können oder verkürzen / verlängern, muss man das System mit einem bis zu diesem Punkt schon ausgearbeiten Plan starten können und den best möglichen Plan unter den veränderten Bedingungen erzeugen.
EIne weitere Frage ist, wie lange im Vorraus weißt Du, welche / wie viele neue Azubis dazu kommen? Ich meine mich zu erinnern, dass das zum Glück nur einmal im Jahr der Fall war, aber das könnte auch Probleme machen.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;
use strict; use warnings; Link zu meiner Perlseite