Dekker arbeidsgivers behov, ansattes stillingsprosenter og maksimerer de ansattes ønsker.
Vaktplanlegging er ofte svært komplisert, og ulike bransjer har ulike innfallsvinkler. Likevel er det noen fellestrekk på tvers av bransjer, og denne algoritmen er i stand til å lage svært gode vaktplaner for mange bransjer. Dersom du har mer spesialiserte krav så gjerne ta kontakt.
Utgangspunktet er at vi har et sett med vakter som skal bemannes, og et sett med ansatte. De ansatte har preferanser for hvilke vakter de ønsker å jobbe.
Hvordan kan vi fordele vaktene slik at alle blir mest mulig fornøyde?
Vaktplanlegging er et mange-til-mange allokeringsproblem: én ansatt kan jobbe flere vakter og én vakt kan ha flere ansatte. Denne algoritmen balanserer tre målsetninger i prioritert rekkefølge:
Algoritmen søker gjennom milliarder av ulike vaktplaner før den gir et svar, og fungerer for hundrevis av ansatte på tvers av ulike avdelinger.
Denne algoritmen egner seg til vaktplanlegging i mange bransjer og sektorer:
Du kan teste Vaktplanlegging
på eksempelene nedenfor i APIet helt gratis.
Eksempelene er små for å vise struktur og hva som er mulig.
Med betalt tilgang kan du sende inn store datasett.
De fleste problemer løses på under ett sekund.
Et enkelt eksempel med to vakter og to arbeidere. Ola foretrekker morgenvakten (score 10), mens Kari foretrekker kveldsvakten (score 10). Algoritmen gir Ola morgenvakten og Kari kveldsvakten - begge får det de ønsker mest.
{"data": {
"shifts": [
{"id": "1", "department": "A", "date": "2025-12-20", "period": "morning", "desired_workers": 1},
{"id": "2", "department": "A", "date": "2025-12-20", "period": "evening", "desired_workers": 1}
],
"workers": [
{"id": "Ola", "desired_shifts": 1},
{"id": "Kari", "desired_shifts": 1}
],
"preferences": [
{"worker": "Ola", "shift": "1", "score": 10},
{"worker": "Ola", "shift": "2", "score": 5},
{"worker": "Kari", "shift": "1", "score": 5},
{"worker": "Kari", "shift": "2", "score": 10}
]
}}
Resultat:
{"1": ["Ola"], "2": ["Kari"]}
Dette eksempelet viser relativ rettferdighet ved underbemanning. Vaktene ønsker 4 + 8 + 16 = 28 arbeidere, men bare 14 er tilgjengelige. Algoritmen fordeler mangelen proporsjonalt: vaktene får 2, 4 og 8 arbeidere. Alle vakter fylles til 50% - ingen vakt blir urettferdig nedprioritert.
{"data": {
"shifts": [
{"id": "A", "department": "A", "date": "2025-12-08", "period": "morning", "desired_workers": 4},
{"id": "B", "department": "A", "date": "2025-12-08", "period": "evening", "desired_workers": 8},
{"id": "C", "department": "A", "date": "2025-12-08", "period": "night", "desired_workers": 16}
],
"workers": [
{"id": "0", "desired_shifts": 1}, {"id": "1", "desired_shifts": 1},
{"id": "2", "desired_shifts": 1}, {"id": "3", "desired_shifts": 1},
{"id": "4", "desired_shifts": 1}, {"id": "5", "desired_shifts": 1},
{"id": "6", "desired_shifts": 1}, {"id": "7", "desired_shifts": 1},
{"id": "8", "desired_shifts": 1}, {"id": "9", "desired_shifts": 1}
],
"preferences": [
{"worker": "0", "shift": "A", "score": 1}, {"worker": "0", "shift": "B", "score": 1}, {"worker": "0", "shift": "C", "score": 1},
{"worker": "1", "shift": "A", "score": 1}, {"worker": "1", "shift": "B", "score": 1}, {"worker": "1", "shift": "C", "score": 1},
{"worker": "2", "shift": "A", "score": 1}, {"worker": "2", "shift": "B", "score": 1}, {"worker": "2", "shift": "C", "score": 1},
{"worker": "3", "shift": "A", "score": 1}, {"worker": "3", "shift": "B", "score": 1}, {"worker": "3", "shift": "C", "score": 1},
{"worker": "4", "shift": "A", "score": 1}, {"worker": "4", "shift": "B", "score": 1}, {"worker": "4", "shift": "C", "score": 1},
{"worker": "5", "shift": "A", "score": 1}, {"worker": "5", "shift": "B", "score": 1}, {"worker": "5", "shift": "C", "score": 1},
{"worker": "6", "shift": "A", "score": 1}, {"worker": "6", "shift": "B", "score": 1}, {"worker": "6", "shift": "C", "score": 1},
{"worker": "7", "shift": "A", "score": 1}, {"worker": "7", "shift": "B", "score": 1}, {"worker": "7", "shift": "C", "score": 1},
{"worker": "8", "shift": "A", "score": 1}, {"worker": "8", "shift": "B", "score": 1}, {"worker": "8", "shift": "C", "score": 1},
{"worker": "9", "shift": "A", "score": 1}, {"worker": "9", "shift": "B", "score": 1}, {"worker": "9", "shift": "C", "score": 1}
]
}}
Resultat:
{"A": ["0", "7"], "B": ["3", "5"], "C": ["1", "2", "4", "6", "8", "9"]}