Schichtplanung · Verständlich erklärt

Schichtplanung verständlich erklärt

Ein Laden braucht zu manchen Stunden mehr Personal als zu anderen. Die Schichten sollen jede Stunde abdecken und möglichst wenig kosten. Diese Seite zeigt zuerst ohne Formeln, wann sich der günstigste Plan leicht finden lässt und wann man dafür richtig optimieren muss, und danach für Fachleute mit Modell, Formeln, Messwerten und Grenzen.

Zuletzt aktualisiert:

Teil 1 · Für Einsteiger

Ein Wort unbekannt? Das Begriffsverzeichnis erklärt es in wenigen Sätzen.

Wie viele Leute braucht der Laden wann?

Stellen Sie sich einen Laden vor, der den ganzen Tag geöffnet ist. Morgens kommen wenige Kundinnen und Kunden, mittags und am frühen Abend viele. Für jede Stunde steht fest, wie viele Beschäftigte mindestens da sein müssen. Besetzt wird mit Schichten, das sind feste Arbeitsblöcke ohne Unterbrechung, etwa kurze Teilzeitblöcke oder lange Vollzeitblöcke. Gesucht ist die Auswahl an Schichten, die jede Stunde abdeckt und möglichst wenig kostet.

Drei Wege zum Plan

Die Faustregel (in der Demo „Greedy-Heuristik“, gierig, weil sie stets den nächstbesten Schritt nimmt): Man nimmt immer die Schicht, die für ihr Geld am meisten von dem abdeckt, was noch fehlt, und wiederholt das, bis alles gedeckt ist. Das geht schnell und liefert immer einen gültigen Plan. Aber nichts garantiert, dass es der günstigste Plan ist.

Die Bestlösung (in der Demo „exaktes ILP“, eine Optimierung, die nur ganze Schichten zulässt): Sie liefert nachweislich den günstigsten Plan. Dafür braucht es ein Rechenprogramm. Bei sehr großen Aufgaben kann es im ungünstigen Fall sehr lange rechnen; bei der Größe der Aufgaben in der Demo ist das kein Problem.

Die Halbschicht-Rechnung (in der Demo „LP-Relaxierung“, eine Optimierung mit gelockerten Bedingungen): Sie erlaubt für einen Augenblick halbe Schichten, also etwa eine halbe Person. Auch dafür braucht es ein Rechenprogramm, aber ein einfacheres. Sie liefert eine Untergrenze: Billiger als diese Zahl kann kein echter Plan sein.

Wann die Halbschicht-Rechnung schon die Bestlösung ist

Nun der überraschende Punkt. Sind alle Schichten lückenlose Blöcke innerhalb eines Tages und gibt es keine Fixkosten, dann kommen bei der Halbschicht-Rechnung in der Demo von selbst nur ganze Schichten heraus. Fixkosten sind einmalige Kosten, sobald ein Schichttyp überhaupt eingesetzt wird, etwa für Einrichtung oder Schulung. Dann ist die Halbschicht-Rechnung bereits die Bestlösung, und die aufwendige Suche nach ganzen Schichten entfällt. Anschaulich: Man zeichnet den Tag als gerade Linie von Tagesanfang bis Tagesende, und jede Schicht ist ein Streifen auf dieser Linie.

Läuft eine Schicht über Mitternacht, schließt sich die Linie zum Kreis, und die Zusicherung entfällt, dass die Halbschicht-Rechnung ganze Schichten liefert. Das kleinste Beispiel: drei Zeitabschnitte im Kreis, jeder muss einmal besetzt sein, jede Schicht deckt zwei benachbarte ab und kostet gleich viel. Die Halbschicht-Rechnung kommt auf anderthalb Schichten, tatsächlich braucht man zwei. Auch Fixkosten können die Zusicherung aufheben, unabhängig von Mitternacht. In diesen Fällen kann eine solche Lücke entstehen, sie entsteht aber nicht immer; ob sie in einem echten Fall auftritt, zeigt erst die Rechnung, und die Demo prüft es für jede Einstellung nach.

Brauche ich dafür überhaupt Optimierung?

Ohne Rechenprogramm bleibt nur die Faustregel. Sie liefert einen gültigen Plan, aber ohne Garantie, dass er der günstigste ist, und die Demo zeigt für jede Einstellung, wie weit er von der Bestlösung entfernt liegt. Wer den günstigsten Plan sicher haben will, braucht also ein Rechenprogramm. Welches, hängt von der Aufgabe ab: Bei lückenlosen Blöcken ohne Fixkosten genügt die einfachere Halbschicht-Rechnung. Laufen Schichten über Mitternacht oder fallen Fixkosten an, kann sie zu niedrig liegen, und dann ist die Bestlösung der sichere Weg.

Die Demo hat noch einen zweiten Abschnitt zur Woche: Jede Person hat freie Tage, und wie diese liegen dürfen, ändert die nötige Teamgröße. Die Ergebnisse stehen im Fachteil.

Wie ernst ist das Modell zu nehmen?

Die Demo ist ein stark vereinfachtes Modell mit erfundenen Bedarfen. Es zählt nur der Bedarf je Stunde, es gibt keine Ruhezeiten zwischen Früh- und Spätschicht, keine Qualifikationen und keine Wünsche. Sie zeigt, wie die Mechanik wirkt, und liefert keinen fertigen Dienstplan mit Namen.

Eine Frage für Ihren eigenen Planungsprozess: Laufen bei uns Schichten über Mitternacht, oder fallen einmalige Kosten für einen Schichttyp an? Wenn nicht, genügt die Halbschicht-Rechnung; wenn ja, kann sie danebenliegen, und die Bestlösung zeigt, ob es tatsächlich so ist.

Hinweis: Alle Demos rechnen mit synthetischen oder frei verfügbaren Beispieldaten und laufen auf einem externen Anbieter (Datenschutz). Bitte geben Sie darin keine vertraulichen oder personenbezogenen Daten ein. Die Ergebnisse gelten für die jeweilige Demo-Instanz und lassen sich nicht ungeprüft auf reale Fälle übertragen; für darauf gestützte Entscheidungen übernehme ich keine Gewähr.

Teil 2 · Für Fachleute

Modell und Annahmen

Dieser Teil ist eigenständig lesbar. Er fasst die formale Beschreibung der Demo zusammen; die vollständige Fassung steht im Expander „📐 Mathematische Formulierung“ der Demo.

  • Tagesplan: ein gewichtetes Mengenüberdeckungsproblem mit Intervallstruktur. Zeithorizont \(T\) (24 Stunden), stündlicher Mindestbedarf \(d_t \geq 0\), Schichtkatalog \(J\) mit Abdeckungsmenge \(C_j \subseteq T\) und Kosten \(c_j\) (Stundenkosten mal Länge) je Instanz. Optional Fixkosten \(f \geq 0\) je genutzter Schichtlänge und Wraparound (Schichten über Mitternacht).
  • Drei Verfahren, eine Matrix: Greedy-Heuristik (bester Gegenwert je Euro, ohne Optimalitätsgarantie), LP-Relaxierung (kontinuierliche Anzahlen, untere Schranke) und exaktes ILP (Google OR-Tools, Branch & Bound). Die Demo prüft nach jedem Lauf, ob die LP-Lösung tatsächlich ganzzahlig ist, statt es anzunehmen.
  • Wochenmodell: Vollzeitkräfte mit 5 Arbeitstagen, die ihr Muster jede Woche wiederholen, alle austauschbar. Drei Regeln: beliebige 2 freie Tage (21 Muster über 7 Tage), 2 freie Tage am Stück, zyklisch (7 Muster), und ein ganzes freies Wochenende in jedem Zwei-Wochen-Zyklus (13 Muster über 14 Tage). Gesucht ist die kleinste Personenzahl, bei der der Tagesbedarf an keinem Tag unterschritten wird (exaktes ILP, Überdeckung erlaubt).

Die Formeln

Gesucht sind Anzahlen \(x_j \geq 0\) und, nur bei aktiven Fixkosten, Aktivierungsvariablen \(y_L \in \{0,1\}\) (Schichtlänge \(L\) wird überhaupt genutzt):

\[\min \; \sum_{j \in J} c_j\, x_j \;+\; \sum_{L} f \cdot y_L\]

\[\text{u. d. N.} \quad \sum_{j:\, t \in C_j} x_j \;\geq\; d_t \quad \forall t \in T\]

\[x_j \;\leq\; M_j \cdot y_{L(j)} \quad \forall j \in J \qquad (\text{nur bei } f > 0)\]

mit \(M_j = \max_{t \in C_j} d_t\), der Bedarfsspitze, die Schicht \(j\) abdeckt. Ohne Wraparound ist jedes \(C_j\) ein zusammenhängendes Intervall, die Nebenbedingungsmatrix hat in jeder Spalte aufeinanderfolgende Einsen und ist damit eine Intervallmatrix. Eine Intervallmatrix ist total unimodular (jede quadratische Teilmatrix hat Determinante \(0\), \(+1\) oder \(-1\)); bei ganzzahligem \(d_t\) sind dann alle Ecken des LP-Polyeders ganzzahlig, und die LP-Relaxierung liefert ohne Branch & Bound eine ganzzahlige Lösung. Wraparound zerstört die Intervalleigenschaft. Die Kopplung \(x_j \le M_j\, y_{L(j)}\) ist eine Big-M-/Fixed-Charge-Struktur, die die Garantie unabhängig vom Wraparound bricht; zusätzlich wird die Relaxierung dort locker, weil \(y_L\) fast beliebig klein werden darf.

Das Lehrbuchbeispiel mit einem ungeraden Zyklus (drei Zeiteinheiten im Kreis, Bedarf eine Person je Einheit, jede Schicht deckt zwei benachbarte Einheiten ab, Kosten eine Einheit je Schicht):

\[\text{LP-Relaxierung: } x = (0.5,\, 0.5,\, 0.5) \;\to\; \text{Kosten } 1.5\]

\[\text{ILP: } x = (1,\, 1,\, 0) \;\to\; \text{Kosten } 2.0\]

Für das Wochenmodell stehen geschlossene Formeln als unabhängige Referenz im Test. Mit \(D\) als größtem Tagesbedarf und \(S\) als Wochensumme gilt für beliebige freie Tage \(N = \max(D, \lceil S/5 \rceil)\). Bei freien Tagen am Stück kommt für jeden Tag \(i\) die Untergrenze \(\lceil (d_i + d_{i+2} + d_{i+4} + d_{i+6}) / 3 \rceil\) hinzu: Zwei zusammenhängende freie Tage berühren immer mindestens einen der vier Tage, jede Person arbeitet dort also an höchstens 3. Für das freie Wochenende gilt \(N \geq 2 \times \max(\text{Sa}, \text{So})\), weil jede Person ein bestimmtes Wochenende nur in einer der zwei Wochen arbeiten kann.

Befunde

Die Zahlen zum Tagesplan stammen aus einer Nachmessung mit den Mitteln der Demo: 400 Zufallskonfigurationen aus dem Reglerbereich (Wraparound an, ohne Fixkosten, 1–3 Schichtlängen aus 3–12 h, 1–3 Spitzen). Der Suchraum des ursprünglichen Prototyps ist nicht dokumentiert. Die Zahlen zur Woche stammen aus der vorgerechneten Messreihe (tools/week_sweep.py): vier Profile (flach, Wochenende hoch, Wochenmitte hoch, zufällig je Tag) × drei mittlere Tagesbedarfe (4, 10, 25) × drei Streuungen (20, 40, 70) × 100 gepaarte Zufallswochen = 3.600 Wochen, jede durch alle drei Regeln gerechnet. Die Bedarfe sind erfunden; die Zahlen gelten für diese Messreihe, nicht für einen echten Betrieb.

FrageBefund
Wann ist die LP-Lösung im Tagesplan nicht ganzzahlig?Von 400 Zufallskonfigurationen (Wraparound an, ohne Fixkosten) zeigten 35 (rund 9 %) eine Kostenlücke zwischen LP und ILP, bei 90 (rund 22 %) war die LP-Lösung fraktional. Ohne Wraparound zeigte keine der 150 Konfigurationen eine Lücke.
Was kosten zwei freie Tage am Stück gegenüber beliebigen?Im Mittel +1,1 % Personen; in 13,3 % der Wochen mehr, höchstens 9 Personen. Je Profil: flach +0,03 %, Wochenende hoch +0,14 %, Wochenmitte hoch +0,56 %, zufällig je Tag +3,7 %.
Wann werden freie Tage am Stück teuer?Beim abwechselnden Profil (Mo, Mi, Fr und So hoch, dazwischen niedrig; deterministisch): bei mittlerem Bedarf 25 und Streuung 70 51 statt 38 Personen (+34,2 %), bei Bedarf 10 und Streuung 40 18 statt 14 (+28,6 %).
Was kostet ein freies Wochenende alle 2 Wochen gegenüber freien Tagen am Stück?Im Mittel +47,0 %; in 89,6 % der Wochen mehr. Je Profil: flach +41,5 %, Wochenende hoch +86,8 %, Wochenmitte hoch +11,5 %, zufällig je Tag +48,0 %.
Trägt das Zählargument?Die Untergrenze \(2 \times \max(\text{Sa}, \text{So})\) trifft in 93,7 % der Wochen exakt und bindet in 84,8 %.
Ist die Ganzzahligkeit im Wochenmodell ein Problem?Nein: ILP = aufgerundeter LP-Wert in 3.600 von 3.600 Wochen für alle drei Regeln, obwohl der LP-Wert bei beliebigen freien Tagen in 1.946 und bei freien Tagen am Stück in 1.991 Wochen nicht ganzzahlig war.

Der letzte Befund setzt das Thema fort: Die Matrix aus Mustern mit 5 zyklisch aufeinanderfolgenden Einsen ist nicht total unimodular, denn ein nicht ganzzahliger LP-Wert bei ganzzahligem Bedarf wäre bei Total-Unimodularität unmöglich. Totale Unimodularität ist hinreichend, nicht notwendig: Hier genügt das Aufrunden des LP-Werts.

Grenzen

  • Nur Tagesbedarf: eine Schichtart je Tag, keine Ruhezeit-Regel zwischen Früh- und Spätschicht (deren Preis hängt an den Anteilen von Früh und Spät, die hier nicht modelliert sind), keine Qualifikationen, keine Wünsche, Kosten gleich Köpfe. Alle Muster einer Person wiederholen sich jede Woche, alle Personen sind austauschbar.
  • Kein Dienstplan: Das Ergebnis ist die kleinste Teamgröße unter diesen Annahmen, keine namentliche Zuordnung. Bei kleinen Teams (mittlerer Bedarf 4) ist der relative Aufschlag vom Aufrunden geprägt.
  • Erfundene Bedarfe, synthetische Stichproben: Die Anteile der Lücken im Tagesplan gelten für den beschriebenen Reglerbereich und sind keine Häufigkeiten in echten Betrieben. Die Greedy-Heuristik hat keine Optimalitätsgarantie; wie weit sie im Einzelfall vom Optimum liegt, zeigt die Demo live und lässt sich nicht pauschal sagen.
  • Ganzzahligkeit im Wochenmodell nur gemessen: Belegt ist, dass das ILP in allen 3.600 Wochen dem aufgerundeten LP-Wert entspricht. Ob das in der Literatur zu zirkulären Einsen (Bartholdi, Orlin und Ratliff 1980) genau dieselbe Eigenschaft ist, wurde nicht nachgeprüft.

Quellen

  • Nemhauser, G. L., Wolsey, L. A. (1988): Integer and Combinatorial Optimization (zu total unimodularen Matrizen und Fixed-Charge-Problemen, wie in der Demo genannt).
  • Bartholdi, J. J., Orlin, J. B., Ratliff, H. D. (1980): Cyclic Scheduling via Integer Programs with Circular Ones. Operations Research 28(5).
  • Quelltext, Messreihe und Tests der Demo: github.com/sebastian-hanisch/shift-demo.

Die genannten Arbeiten wurden für diese Seite nicht nachgeschlagen; die Literaturhinweise stammen aus der README und der Demo.