Verteilungs- (Entscheidungs-) Algorithmus
Verfasst: Montag 5. November 2012, 10:19
Guten Morgen miteinander
Ich beschäftige mich gerade mit einem relativ komplizierten Problem: Ich habe eine Menge von Personen gegeben, die in einer Datei ihre erste und ihre zweite Präferenz angegeben haben, wann sie am liebsten arbeiten wollen. Ich als fiktiver Arbeitgeber speichere alle Wochentage und die Anzahl der an diesem Tag nötigen Arbeitskräfte. Ich sollte die Tage so verteilen, dass so viele wie möglich zufrieden sind. (normalerweise werden weniger Tage angeboten als mögliche Arbeitskräfte vorhanden sind).
Ich habe bereits eine Funktion geschrieben, die pro Person und Präferenz je 2 Punkte gibt, falls es sich dabei um die erste Präferenz handelt, 1 Punkt falls es sich um die 2.Präferenz handelt und 0 Punkt für alle nicht gewählten Tage.
Ich erhalte dann also beispielsweise sowas als "Zwischenergebnis":
Nun frage ich mich: Wie kann eine mögliche Implementation aussehen, wenn ich zB am Sonntag 2 Leute, am Montag 1, am Dienstag 1 und am Donnerstag 2 Leute brauche? (Achtung: das "Zwischenergebnis" oben beinhaltet die Summe der Gewichte, nicht der Anzahl Personen, die dann arbeiten wollen) Dies sollte dann irgendwie mit der jeweiligen Präferenz der Personen verglichen werden und eben, es sollte geschaut werden, dass die Personen "glücklich" sind .
Zwischenzeitlich habe ich auch noch das probiert:
Die erste Zeile würde dann heissen: "Bob arbeitet am Sonntag, Tim am Samstag". Wenn Bob's erste Präferenz der Sonntag und Tim's zweite Präferenz der Samstag war (und wir sonst keine Präferenz einer anderen Person getroffen hätten), ergäbe diese Zeile eine Summe der Gewichte von 3 Punkten.
ABER: So kanns nicht funktionieren, weil ich je nach dem auch mehrere Leute pro Tag "brauche". Und mit dem obigen System ist jeweils nur eine Person pro Tag möglich.
Ja, wie ihr seht, wäre ich sehr dankbar für brauchbare Inputs
Evtl. habe ich mich auch völlig verfahren mit diesem Lösungsweg - wenns einen einfacheren / anderen Weg gibt, der aber ganz unterschiedlich zu dem hier ist: egal, ich bin einfach an einer sauberen, brauchbaren Lösung interessiert
Vielen Dank.
Ich beschäftige mich gerade mit einem relativ komplizierten Problem: Ich habe eine Menge von Personen gegeben, die in einer Datei ihre erste und ihre zweite Präferenz angegeben haben, wann sie am liebsten arbeiten wollen. Ich als fiktiver Arbeitgeber speichere alle Wochentage und die Anzahl der an diesem Tag nötigen Arbeitskräfte. Ich sollte die Tage so verteilen, dass so viele wie möglich zufrieden sind. (normalerweise werden weniger Tage angeboten als mögliche Arbeitskräfte vorhanden sind).
Ich habe bereits eine Funktion geschrieben, die pro Person und Präferenz je 2 Punkte gibt, falls es sich dabei um die erste Präferenz handelt, 1 Punkt falls es sich um die 2.Präferenz handelt und 0 Punkt für alle nicht gewählten Tage.
Ich erhalte dann also beispielsweise sowas als "Zwischenergebnis":
Code: Alles auswählen
{'samstag': 5, 'sonntag': 7, 'montag': 8, 'donnerstag': 7}
Zwischenzeitlich habe ich auch noch das probiert:
Code: Alles auswählen
>>> import itertools
>>> for schedule in itertools.permutations('Bob Sue Jim Tony Alice Zane Tim'.split()):
... print(schedule)
...
('Bob', 'Sue', 'Jim', 'Tony', 'Alice', 'Zane', 'Tim')
('Bob', 'Sue', 'Jim', 'Tony', 'Alice', 'Tim', 'Zane')
('Bob', 'Sue', 'Jim', 'Tony', 'Zane', 'Alice', 'Tim')
('Bob', 'Sue', 'Jim', 'Tony', 'Zane', 'Tim', 'Alice')
('Bob', 'Sue', 'Jim', 'Tony', 'Tim', 'Alice', 'Zane')
('Bob', 'Sue', 'Jim', 'Tony', 'Tim', 'Zane', 'Alice')
('Bob', 'Sue', 'Jim', 'Alice', 'Tony', 'Zane', 'Tim')ABER: So kanns nicht funktionieren, weil ich je nach dem auch mehrere Leute pro Tag "brauche". Und mit dem obigen System ist jeweils nur eine Person pro Tag möglich.
Ja, wie ihr seht, wäre ich sehr dankbar für brauchbare Inputs
Evtl. habe ich mich auch völlig verfahren mit diesem Lösungsweg - wenns einen einfacheren / anderen Weg gibt, der aber ganz unterschiedlich zu dem hier ist: egal, ich bin einfach an einer sauberen, brauchbaren Lösung interessiert
Vielen Dank.