Skip to content

Instantly share code, notes, and snippets.

@niquola
Last active March 14, 2026 20:58
Show Gist options
  • Select an option

  • Save niquola/e93044cd4539cbd7bfe277d57b05904e to your computer and use it in GitHub Desktop.

Select an option

Save niquola/e93044cd4539cbd7bfe277d57b05904e to your computer and use it in GitHub Desktop.
ER Physician Scheduling: Algorithm & Literature Review (110 references). Finnish healthcare context (Työaikalaki, SOTE, Lääkärisopimus).

Подход к расписанию ER: финальная формулировка

Одним абзацем

Система — дизайнер паттернов. Она генерирует набор совместимых паттернов ротации (общих и персональных) на конкретный квартал, с учётом покрытия, отпусков, праздников, болезней (статистически), предпочтений и резервов. Верифицирует что всё сходится по каждой неделе. Потом врачи разбирают заготовки — выбирают паттерн и отпуск, получают расписание. Система не составляет расписание — она проектирует паттерны из которых расписание собирается автоматически.


Две фазы

Фаза 1 — Дизайн паттернов (итеративная)

Система генерирует паттерны на конкретный квартал. Входные данные:

Покрытие:      какие слоты надо закрыть (смена × место × день)
Врачи:         типы (EL/EVAL), квалификации, занятость (100/80/50%)
Отпуска:       плановые на этот квартал
Праздники:     конкретные даты (Vappu, Juhannus, Joulu...)
Болезни:       статистика (~5%, зимой ~8%, грипп ~15%)
Резерв:        запас прочности по критичным слотам
Факт прошлого: где рвалось в предыдущем квартале

Итерации Фазы 1:

Итерация 1: Система генерирует общие паттерны
            → Верификатор проверяет каждую неделю
            → Показывает карту хрупкости

Итерация 2: Врачи просят кастомные паттерны
            ("мне без парных ночных")
            → Система генерирует персональный паттерн
            → Проверяет совместимость с остальными
            → Если не сходится → показывает цену:
              "Ок, но тебе +1 Loimaa. Согласен?"
            → Врач соглашается или остаётся на стандартном

Итерация 3: Админ корректирует требования если нужно
            (летом Loimaa 4 дня вместо 5)
            → Пересчёт → ОК

...

Итерация N: Все паттерны утверждены

Результат: библиотека совместимых паттернов на квартал + карта хрупкости.

Ключевые принципы Фазы 1:

  • Общий паттерн — дефолт. 80% врачей на стандартном, сбалансированном, справедливом. Спорить не о чем — все одинаковые.
  • Персональный — исключение с компенсацией. Кто просит кастом — должен быть гибок при противоречиях. Не привилегия, а trade-off.
  • Паттерн на квартал, не вечный. Летний отличается от зимнего. Праздники, отпуска, состав врачей — всё учтено при генерации.
  • Резерв заложен в паттерн. Критичные слоты (ночные VV) генерируются с запасом. В хороший день резервный врач на обучении/админе. В плохой — закрывает дыру.

Фаза 2 — Врачи разбирают заготовки + добивка

1. Врачи выбирают отпуск
2. Система назначает offset (отпуск → лёгкие позиции)
3. Расписание собирается автоматически
4. Оставшиеся дыры (2-5%) — подмены или контракторы

Верификатор — ядро системы

Не просто чекер ✅/❌, а инструмент переговоров между админом, врачами и реальностью.

Что проверяет

Паттерны генерируются на конкретный квартал (13 недель) — верификатор проверяет каждую неделю явно, не среднее.

Для каждой недели, для каждого слота:

  покрытие = сколько врачей проходят этот слот в паттернах
  требование = сколько нужно
  отпуска = сколько потеряем (план этого квартала)
  праздники = изменённое покрытие в эту неделю
  болезни = статистический резерв (сезонный)

  запас = покрытие - требование - отпуска - праздники - болезни

  запас > 0.5  → 🟢 устойчиво
  запас 0-0.5  → 🟡 хрупко
  запас < 0    → 🔴 дефицит

Карта хрупкости

Админ видит где система сломается первой на каждой неделе квартала:

        Нед.1  Нед.2  Нед.3  ...  Нед.13
Yö VV:   🟢     🟢     🟡         🟢
Loimaa:  🟢     🟢     🟢         🟡
hy3 ilta:🟢     🔴     🟢         🟢
                 ↑
                 Неделя 2: 3 врача в отпуске + праздник
                 → hy3 вечерний не покрыт

Диалог с админом

Система: "Q3 2027 — работает, но:
  - неделя 28: hy3 вечер недопокрыт (3 отпуска совпали)
  - недели 30-31: запас Yö VV = 0.2 (хрупко)
  - грипп-сценарий: недели 1-4 ломаются при >10% болезней"

Админ: "Что делать?"

Система: "Варианты:
  1. Добавить резервный вечерний слот в позицию D (+2ч)
  2. Сдвинуть отпуск Петровой на неделю 29 → конфликт уходит
  3. Запланировать контрактора на неделю 28
  4. Снизить покрытие hy3 вечер до 0 на эту неделю"

Обратная связь между кварталами

Q2 прошёл → факт:
  - 12 реальных подмен (план был 5)
  - Позиция K оказалась хрупкой 3 раза
  - Грипп в феврале: 4 дня без покрытия hy1

→ Входные данные для генерации паттернов Q3:
  - Усилить резерв позиции K
  - Увеличить зимний коэффициент болезней
  - Добавить резервный слот hy1

Поток работы

                    Факт прошлого квартала
                           │
                           ▼
┌──────────────────────────────────────────────────┐
│  ФАЗА 1: ДИЗАЙН ПАТТЕРНОВ (итеративная)         │
│                                                  │
│  Входные данные:                                 │
│    покрытие + врачи + отпуска + праздники +      │
│    болезни (стат.) + резерв + факт прошлого      │
│                                                  │
│  Итерация 1: Система генерирует общие паттерны   │
│  Итерация 2: Врачи просят кастом → переговоры    │
│  Итерация 3: Админ корректирует → пересчёт       │
│  ...                                             │
│  Итерация N: Утверждение                         │
│                                                  │
│  Результат: паттерны + карта хрупкости            │
├──────────────────────────────────────────────────┤
│  ФАЗА 2: РАСПИСАНИЕ                             │
│                                                  │
│  Врачи выбирают отпуск → offset → расписание     │
│  Добивка остатков (2-5%) → финал                 │
│                                                  │
│  Результат: расписание на квартал                │
└──────────────────────────────────────────────────┘
                           │
                           ▼
                    Факт этого квартала
                           │
                           ▼
                    Фаза 1 следующего квартала

Почему это работает

Вопрос Ответ
Праздники? Часть входных данных для генерации, не исключение
Лето, все в отпуске? Паттерн на квартал — летний уже учитывает 30% отпусков
Много персональных? Система генерирует и проверяет, не человек
Worst case покрытие? Проверка каждой недели явно, не среднего
Врачи не хотят выбирать? 80% на стандартном, выбирать не надо
Неравенство? Стандартный сбалансирован, персональный = компенсация
Кластерные болезни? Резерв в паттерне + контракторы на хрупкие периоды
Нет обратной связи? Факт → вход для следующего квартала
Зависимость от эксперта? Система генерирует, админ валидирует

Ключевые свойства

  1. Система — дизайнер паттернов. Генерирует, проверяет, предлагает варианты. Админ — валидатор, не проектировщик.

  2. Паттерн на квартал. Не вечный шаблон с заплатками, а оптимальный дизайн под конкретную реальность (отпуска, праздники, состав врачей).

  3. Фаза 1 итеративная. Система → врачи → админ → система → утверждение. С обратной связью между кварталами.

  4. Общий паттерн — дефолт, персональный — исключение. 80/20. Кто просит кастом — гибок при противоречиях.

  5. Резерв встроен в паттерн. Не надеемся на удачу — запас прочности по критичным слотам заложен при генерации.

  6. Прозрачность. Врач видит свой паттерн, видит цену своих запросов, видит влияние на коллег. Не чёрный ящик.

ER Physician Scheduling: Algorithm & Literature Review

Алгоритм создания расписания для врачей скорой помощи (päivystys) в Финляндии с «идеальной цепочкой» смен и полный обзор литературы (110 источников).


Часть I. Контекст и ограничения

Идеальная цепочка (Metropolitan Pattern)

Паттерн УУДДННВВ — 8-дневный цикл прямой ротации (forward rotation) для 4 команд:

День 1–2:  Утро   (07:00–15:00)
День 3–4:  День   (15:00–23:00)
День 5–6:  Ночь   (23:00–07:00)
День 7–8:  Выходной

Почему именно этот паттерн:

  • Прямая ротация (M→E→N) соответствует циркадному ритму — тело легче сдвигает фазу «по часовой». Доказано в ландмарковом исследовании Czeisler et al. [R30]: −40% аварий, −25% случаев засыпания на работе.
  • Быстрая ротация (2 смены каждого типа) — циркадная фаза остаётся в узком коридоре ~4 часа, без глубокой десинхронизации [R31], [R32].
  • Только 2 ночи подряд — безопасная зона. Риск растёт экспоненциально: 3-я ночь +17%, 4-я +36% [R36].
  • Справедливость по конструкции — все команды работают одинаковый паттерн [R22], [R68].

Финское законодательство

Ключевые ограничения для системы расписания:

Ограничение Значение Источник
Регулярные часы (SOTE) 38ч 15мин / неделя SOTE-sopimus
Jaksotyö: 3-недельный период ≤ 114ч 45мин Työaikalaki §7
Отдых между сменами ≥ 11ч (≥ 9ч для jaksotyö) Työaikalaki §25
Еженедельный отдых ≥ 35ч непрерывно Työaikalaki §27
Макс. рабочее время ≤ 48ч/нед (среднее за 4 мес) EU WTD (без opt-out)
Выходных за 3 недели ≥ 6, из них ≥ 2 подряд SOTE-sopimus
Макс. дневная смена 10ч SOTE-sopimus
Макс. ночная смена 11–12ч SOTE-sopimus
Дежурства врачей ≤ 5/мес, ≤ 85ч/мес Lääkärisopimus
Ночное время 23:00–06:00 Työaikalaki §8

Финляндия не использует opt-out из 48ч EU WTD — в отличие от UK, Германии, Нидерландов [R91].


Часть II. Алгоритм

Общий принцип

Расписание строится послойно — от идеального каркаса к реальности:

┌─────────────────────────────────────────┐
│  Шаг 0. Входные данные                  │
├─────────────────────────────────────────┤
│  Шаг 1. Мастер-паттерн (цепочка)        │  ← чистая математика
├─────────────────────────────────────────┤
│  Шаг 2. Разбивка по командам            │  ← кто с кем
├─────────────────────────────────────────┤
│  Шаг 3. Раскладка на календарь          │  ← привязка к датам
├─────────────────────────────────────────┤
│  Шаг 4. Вычитание отпусков              │  ← дыры в расписании
├─────────────────────────────────────────┤
│  Шаг 5. Заполнение дыр                  │  ← подмены, оптимизация
├─────────────────────────────────────────┤
│  Шаг 6. Назначение отделений            │  ← кто куда
├─────────────────────────────────────────┤
│  Шаг 7. Валидация                       │  ← проверка всех ограничений
├─────────────────────────────────────────┤
│  Шаг 8. Публикация                      │  ← уведомления, экспорт
└─────────────────────────────────────────┘

Этот послойный подход обоснован в литературе: циклическая база + обработка исключений — наиболее практичный гибрид [R5], [R16], [R21].


Шаг 0. Входные данные

Больница:
  отделения:
    - { name: "Trauma",     покрытие: { утро: 2, день: 2, ночь: 1 } }
    - { name: "Acute Med",  покрытие: { утро: 3, день: 3, ночь: 2 } }
    - { name: "Pediatric",  покрытие: { утро: 1, день: 1, ночь: 1 } }
    - { name: "Fast-track", покрытие: { утро: 2, день: 2, ночь: 0 } }

  смены:
    - { id: M, начало: "07:00", конец: "15:00" }   #
    - { id: E, начало: "15:00", конец: "23:00" }   #
    - { id: N, начало: "23:00", конец: "07:00" }   #

  паттерн: [M, M, E, E, N, N, -, -]
  период: 3 недели (jaksotyö)
  макс_часов: 114.75

Врачи:
  - { id: 1, name: "Dr. Virtanen",
      отделения: ["Trauma", "Acute Med"],
      отпуск: ["2026-04-06".."2026-04-12"],
      конфликты: [{ с_врачом: 5, тип: "не_вместе" }] }
  - ...

Праздники: ["2026-04-03", "2026-04-06", ...]

Формализация входных данных для задач расписания врачей рассмотрена в [R9], [R10], [R102].


Шаг 1. Мастер-паттерн

Определяем базовый цикл и адаптируем под финские нормы.

Проблема: чистый 8-дневный цикл даёт 42ч/нед > 38ч15мин.

Решение — jaksotyö (периодический учёт за 3 недели):

114.75ч ÷ 8ч = 14.3 смены за 3 недели
21 день − 14 смен = 7 выходных (≥ 6 по SOTE ✓)

Неделя 1:  M M E E N N -      (6 смен = 48ч)
Неделя 2:  - M M E E N N      (6 смен = 48ч)
Неделя 3:  - - M M - - -      (2 смены = 16ч)

Итого: 14 смен × 8ч = 112ч ≤ 114.75ч ✓

Теоретическое обоснование циклических расписаний: [R26], [R27], [R28]. Для ER конкретно: [R21] — cyclic stint-based staff scheduling with on-call.

Расчёт количества врачей:

Потребность по отделениям:
  Утро:  2+3+1+2 = 8 врачей одновременно
  День:  2+3+1+2 = 8
  Ночь:  1+2+1+0 = 4

При 14 сменах из 21 дня → каждый врач работает 2/3 времени
Минимум врачей: 8 ÷ (2/3) = 12 (+ запас на отпуска ≈ 15)

Вопросы стаффинга с учётом квалификаций рассмотрены в [R14], [R64].


Шаг 2. Разбивка по командам

Группируем врачей в ротационные команды:

Для каждого врача определить «совместимую команду»:
  1. В каждой команде — квалификации для всех отделений
  2. Конфликтующие врачи → разные команды
  3. Парные связки (обучение) → одна команда

Пример:
  Команда A: [Virtanen(Trauma), Korhonen(Pediatric), Mäkinen(Acute), Laine(Acute)]
  Команда B: [Nieminen(Trauma), Heikkinen(Pediatric), Hämäläinen(Acute), Koskinen(FT)]
  Команда C: [Järvinen(Trauma), Lehtonen(Pediatric), Salo(Acute), Tuominen(Acute)]

Это задача балансировки с ограничениями — формально описана в [R70] (multi-department nursing) и [R72] (multi-skill scheduling).


Шаг 3. Раскладка на календарь

Накладываем паттерн на конкретные даты:

for team in teams:
    offset = team.index * (cycle_length // n_teams)
    for day in period:
        pos = (day - start + offset) % cycle_length
        schedule[doctor][day] = pattern[pos]

Результат — «идеальное расписание»:

           Пн  Вт  Ср  Чт  Пт  Сб  Вс
Dr.Virt:    M   M   E   E   N   N   -
Dr.Korh:    E   N   N   -   -   M   M
Dr.Mäki:    -   -   M   M   E   E   N
Dr.Lain:    N   -   -   M   M   E   E

Этот подход — «master schedule» — описан в [R16] (Master Physician Scheduling Problem).


Шаг 4. Вычитание отпусков

«Пробиваем дыры» в идеальном расписании:

for doctor in doctors:
    for day in doctor.vacation:
        lost_shift = schedule[doctor][day]
        schedule[doctor][day] = VACANT
        deficit[day][lost_shift] += 1

# Результат — список дыр:
holes = [
    { day: "2026-04-06", shift: "M", dept: "Trauma", lost: "Virtanen" },
    { day: "2026-04-07", shift: "M", dept: "Trauma", lost: "Virtanen" },
    ...
]

Обработка отпусков как «disruptions» формализована в [R104] — online rescheduling of physicians, и [R71] — rerostering strategies.


Шаг 5. Заполнение дыр (ключевой шаг)

Самая сложная часть — NP-hard задача [R11].

Вариант A: Жадный алгоритм

1. Отсортировать дыры по приоритету:
   ночные > дневные > утренние
   праздники > выходные > будни

2. Для каждой дыры H:

   a. Кандидаты: врачи на выходном в этот день

   b. Фильтр (жёсткие ограничения):
      - квалификация для отделения
      - ≥ 11ч отдых до и после
      - ≤ 114.75ч за 3 недели
      - ≤ 48ч/нед за 4 месяца
      - нет конфликта с врачами на смене

   c. Ранжирование (мягкие):
      score = w1 × (кол-во доп. смен)        # справедливость
            + w2 × (нарушение ротации)         # циркадность
            + w3 × (предпочтение)              # персональное
            + w4 × (стоимость сверхурочных)    # бюджет
            - w5 × (родное отделение)           # квалификация

   d. Назначить с минимальным score

3. Каскадные перестановки (глубина ≤ 3) для неразрешимых дыр

GRASP-вариант этого подхода описан в [R19], показавший улучшение справедливости распределения.

Вариант B: CP-SAT солвер (рекомендуемый)

Переменные:  swap[i,j,k] ∈ {0,1}  — врач i берёт смену k в день j
Ограничения: все жёсткие из шага 5b
Цель:        min Σ дыр + Σ штрафов за мягкие нарушения

Решатель: Google OR-Tools CP-SAT

CP-SAT доказал эффективность на бенчмарках INRC [R77], [R78]. Практическое руководство по CP-SAT для расписаний — [R110], [R50].

Альтернативные подходы:


Шаг 6. Назначение отделений

Для каждой смены — задача назначения (assignment problem):

Для каждого дня j, для каждого типа смены k:

  1. working = [врачи, работающие смену k в день j]
  2. needs = { "Trauma": 2, "Acute": 3, "Pediatric": 1, "FT": 2 }

  3. Назначить по критериям:
     - Квалификация (жёсткое)
     - «Домашнее» отделение (мягкое)
     - Ротация отделений (мягкое)
     - Баланс за период (мягкое)

  → Венгерский алгоритм или CP-SAT

Мульти-отделенческое назначение рассмотрено в [R70], [R73]. Учёт мульти-квалификаций — [R72].


Шаг 7. Валидация

Финальная проверка всех финских ограничений:

Для каждого врача:
  ✓ Часы за 3 недели ≤ 114ч 45мин            (Työaikalaki §7)
  ✓ Часы за неделю ≤ 48ч (средн. за 4 мес)   (EU WTD)
  ✓ Между сменами ≥ 11ч (или ≥ 9ч jaksotyö)  (Työaikalaki §25)
  ✓ Еженедельный отдых ≥ 35ч непрерывно       (Työaikalaki §27)
  ✓ Выходных за 3 недели ≥ 6                  (SOTE)
  ✓ Есть ≥ 1 блок из 2+ выходных подряд       (SOTE)
  ✓ Ночных подряд ≤ 2                         (хронобиология)
  ✓ Дежурств в месяц ≤ 5                      (Lääkärisopimus)
  ✓ Нет работы в дни отпуска
  ✓ Нет конфликтующих врачей на одной смене

Для каждой смены:
  ✓ Покрытие ≥ минимума по каждому отделению
  ✓ Хотя бы 1 senior врач (если требуется)

Справедливость:
  ✓ Разброс ночных смен ≤ 2
  ✓ Разброс выходных смен ≤ 2
  ✓ Разброс праздничных смен ≤ 1

Формализация fairness-метрик: [R65], [R67], [R68]. Перспектива медперсонала на справедливость AI-расписаний: [R69].

Модель валидации EWTD-compliance: [R90] (Heidelberg New Working Time Model).


Шаг 8. Публикация

1. Персональное расписание (PDF / iCal / приложение)
2. Табло отделений (кто сегодня где)
3. Отчёт по часам и надбавкам
4. Уведомления при изменениях

Визуализация потока

                    ┌──────────────┐
                    │  Конфигурация │
                    │  больницы     │
                    └──────┬───────┘
                           │
                    ┌──────▼───────┐
                    │  Паттерн     │   M M E E N N - -
                    │  (цепочка)   │
                    └──────┬───────┘
                           │
              ┌────────────▼────────────┐
              │  Команды                │   A=[1,2,3,4] B=[5,6,7,8]
              │  (группировка врачей)   │
              └────────────┬────────────┘
                           │
              ┌────────────▼────────────┐
              │  Раскладка на даты      │   01.04→M, 02.04→M, ...
              │  (3-недельный период)   │
              └────────────┬────────────┘
                           │
          ┌────────────────▼─────────────────┐
          │                                  │
    ┌─────▼─────┐                    ┌───────▼──────┐
    │ Отпуска   │                    │ Блокировки   │
    │ (дыры)    │                    │ (конфликты)  │
    └─────┬─────┘                    └───────┬──────┘
          │                                  │
          └────────────┬─────────────────────┘
                       │
              ┌────────▼────────┐
              │  ЗАПОЛНЕНИЕ     │   ← CP-SAT / GRASP
              │  ДЫР            │
              └────────┬────────┘
                       │
              ┌────────▼────────┐
              │  НАЗНАЧЕНИЕ     │   ← Assignment problem
              │  ОТДЕЛЕНИЙ      │
              └────────┬────────┘
                       │
              ┌────────▼────────┐
              │  ВАЛИДАЦИЯ      │   ← Финские законы
              └────────┬────────┘
                       │
                  pass │  fail → назад
                       │
              ┌────────▼────────┐
              │  ПУБЛИКАЦИЯ     │   → iCal, PDF
              └─────────────────┘

Ключевые решения

Вопрос Варианты Рекомендация Обоснование
Длина смены 7.5ч / 8ч / 12ч Стандарт для 3-сменной ротации [R36]
Количество команд 4 / 5 5 Запас для финской нормы 38ч15мин
Адаптация часов доп. выходной / короче смена jaksotyö 114.75ч за 3 недели (Työaikalaki §7)
Алгоритм заполнения жадный / CP-SAT CP-SAT Оптимальное решение [R50]
Период планирования 3 нед / месяц 3 недели Соответствует jaksotyö
Горизонт 1 период / 3 мес 3 месяца Проверка 48ч/4мес (EU WTD)

Часть III. Полная библиография (110 источников)

1. Обзоры и surveys

[R1] Burke, E.K., De Causmaecker, P., Vanden Berghe, G., & Van Landeghem, H. (2004). "The State of the Art of Nurse Rostering." Journal of Scheduling, 7(6), 441–499. DOI

Семинальный обзор 40 лет исследований NRP. Классификация ограничений, методов OR и AI.

[R2] Cheang, B., Li, H., Lim, A., & Rodrigues, B. (2003). "Nurse Rostering Problems — A Bibliographic Survey." EJOR, 151(3), 447–460. DOI

Библиографический обзор моделей и методологий NRP.

[R3] Ngoo, C.M. et al. (2022). "A Survey of the Nurse Rostering Solution Methodologies." IEEE Access, 10, 56504–56524. DOI

Новейший обзор 2012–2021. Категоризация: heuristics, meta-heuristics, hyper-heuristics, matheuristics.

[R4] Hulshof, P.J.H. et al. (2012). "Taxonomic Classification of Planning Decisions in Health Care." Health Systems, 1(2), 129–175. DOI

Таксономия всех решений планирования в здравоохранении.

[R5] Erhard, M., Schoenfelder, J., Fuegener, A., & Brunner, J.O. (2018). "State of the Art in Physician Scheduling." EJOR, 265(1), 1–18. DOI

Определяющий обзор PSP. 68 статей: staffing, rostering, re-planning, квалификации.

[R6] Ernst, A.T. et al. (2004). "Staff Scheduling and Rostering: A Review." EJOR, 153(1), 3–27. DOI

Широкий обзор scheduling по отраслям.

[R7] Van den Bergh, J. et al. (2013). "Personnel Scheduling: A Literature Review." EJOR, 226(3), 367–385. DOI

Классификационные таблицы проблем, методов и трендов.

[R8] Abdalkareem, Z.A. et al. (2021). "Healthcare Scheduling in Optimization Context: A Review." Health and Technology, 11(3), 445–469. DOI

Обзор healthcare scheduling: admission, nursing, OR, surgery.

2. Структура проблемы и сложность

[R9] Smet, P. et al. (2013). "Nurse Rostering: A Complex Example of Personnel Scheduling with Perspectives." Automated Scheduling and Planning, Springer, 129–153. DOI

Универсальная математическая формулировка NRP.

[R10] De Causmaecker, P. & Vanden Berghe, G. (2010). "A Critical Appraisal of the Problem Structure." EJOR, 202(2), 379–389. DOI

Критический анализ структуры NRP.

[R11] den Hartog, T. et al. (2023). "On the Complexity of Nurse Rostering Problems." Operations Research Letters, 51(6), 672–678. DOI

Доказательство NP-hard для NRP даже с 3 типами смен.

[R12] Kellogg, D.L. & Walczak, S. (2007). "Nurse Scheduling: From Academia to Implementation or Not?" Interfaces (INFORMS), 37(4), 355–369. DOI

Разрыв между исследованиями и практикой.

3. Расписание ER/ED

[R13] Zaerpour, F. et al. (2022). "Scheduling of Physicians with Time-Varying Productivity in EDs." Production and Operations Management, 31(2), 645–667. DOI

Двухэтапное стохастическое программирование: гетерогенная продуктивность врачей + стохастический поток пациентов.

[R14] Brunner, J.O. & Edenharter, G.M. (2011). "Long-Term Staff Scheduling of Physicians with Different Experience Levels." Health Care Mgmt Sci, 14(2), 189–202. DOI

Column generation для расписания с двумя уровнями опыта (резиденты vs специалисты).

[R15] Gendreau, M. et al. (2006). "Physician Scheduling in Emergency Rooms." PATAT, Springer LNCS 3867, 53–66. DOI

CP + IP для ER-расписания.

[R16] Gunawan, A. & Lau, H.C. (2013). "Master Physician Scheduling Problem." JORS, 64(3), 410–425. DOI

Мастер-расписание (циклический шаблон) для врачей.

[R17] Beaulieu, H. et al. (2000). "A Mathematical Programming Approach for Scheduling Physicians in the ER." Health Care Mgmt Sci, 3(3), 193–200. DOI

Пионерская работа по MIP для ER.

[R18] Ferrand, Y.B. et al. (2021). "Productivity-Driven Physician Scheduling in EDs." POM, 30(8), 2606–2626. PMC

Снижение времени ожидания с 54.6 до 16.8 мин через оптимизацию.

[R19] Apornak, A. (2021). "A GRASP-Based Algorithm for the ER Physician Scheduling Problem." Applied Soft Computing, 103, 107151. DOI

GRASP для ER с улучшенной справедливостью.

[R20] Savage, D.W. et al. (2015). "Developing Emergency Physician Work Schedules to Reduce Fatigue." Emergency Medicine Journal, 32(12), 935–940.

Оптимизация расписания для снижения утомляемости.

[R21] Becker, T. et al. (2019). "Cyclic Shift Scheduling with On-Call Duties for EMS." Health Care Mgmt Sci, 22(4), 676–690. DOI

Циклическое расписание + ротация дежурств для скорой.

[R22] Garcia de Veas Lovillo, R. et al. (2021). "The ED Physician Rostering Problem: Equitable Solutions via Network Optimization." Flexible Services and Manufacturing J., 34, 783–809. DOI

Двухфазный подход: multicommodity flow для справедливого распределения ночей и выходных.

[R23] Wang, T. et al. (2009). "Modelling and Optimization of Emergency Physician Scheduling." Int. J. Production Economics, 125(2), 281–293.

Оптимизация с предпочтениями врачей и нормами труда.

[R24] Stolletz, R. & Brunner, J.O. (2012). "Fair Optimization of Fortnightly Physician Schedules with Flexible Shifts." EJOR, 219(3), 622–629. DOI

Set covering с минимизацией overtime/undertime.

[R25] Li, J. et al. (2025). "Stochastic Model for Physician Staffing and Scheduling in EDs with Multiple Treatment Stages." EJOR, 324(1), 250–265. DOI

Двухэтапное стохастическое программирование + DES.

4. Циклические и ротационные расписания

[R26] Musliu, N. (2006). "Heuristic Methods for Automatic Rotating Workforce Scheduling." Int. J. Comp. Intelligence Research, 2(4), 309–326. PDF

Tabu search + min-conflict для автоматической генерации ротаций.

[R27] Bard, J.F. & Purnomo, H.W. (2005). "Preference Scheduling for Nurses Using Column Generation." EJOR, 164(2), 510–534. DOI

Column generation с индивидуальными предпочтениями.

[R28] Bard, J.F. & Purnomo, H.W. (2007). "Cyclic Preference Scheduling of Nurses Using a Lagrangian-Based Heuristic." J. Scheduling, 10(1), 5–23. DOI

IP + Lagrangian relaxation для циклических расписаний до 100 медсестёр.

[R29] Trilling, L. et al. (2006). "Nurse Scheduling Using Integer Linear Programming and Constraint Programming." IFAC Proceedings, 39(3), 651–656. DOI

Сравнение ILP и CP для расписаний медсестёр.

5. Циркадная хронобиология и ротация

[R30] Czeisler, C.A. et al. (1982). "Rotating Shift Work Schedules That Disrupt Sleep Are Improved by Applying Circadian Principles." Science, 217(4558), 460–463. DOI

Ландмарковое исследование. Прямая ротация → −40% аварий, −25% засыпания.

[R31] Folkard, S. (1992). "Is There a 'Best Compromise' Shift System?" Ergonomics, 35(12), 1453–1463.

Рекомендации: быстрая прямая ротация, ≤3 ночей подряд.

[R32] Knauth, P. (1993). "The Design of Shift Systems." Ergonomics, 36(1–3), 15–28. DOI

Комплексные guideline по проектированию сменных систем.

[R33] Dall'Ora, C. et al. (2016). "Characteristics of Shift Work and Their Impact on Employee Performance." Int. J. Nursing Studies, 57, 12–27. DOI

Обзор влияния характеристик смен на медперсонал.

[R34] Juda, M. et al. (2013). "The Munich ChronoType Questionnaire for Shift-Workers." J. Biological Rhythms, 28(2), 130–140. DOI

Инструмент оценки хронотипа для персонализации расписаний.

[R35] Boivin, D.B. et al. (2022). "Disturbance of the Circadian System in Shift Work and Its Health Impact." J. Biological Rhythms, 37(1), 3–28. DOI

Обзор циркадных нарушений и стратегий митигации.

[R36] ACEP. "Circadian Rhythms and Shift Work — PREP." PDF

Рекомендации ACEP: прямая ротация, ≤3 ночей, ≤8ч смены, 3 дня восстановления.

[R37] Smith, M.R. et al. (2009). "A Compromise Circadian Phase Position for Permanent Night Work." Sleep, 32(11), 1481–1489.

Компромиссная фаза для постоянных ночных работников.

6. Integer Linear Programming (ILP/MIP)

[R38] Brunner, J.O. et al. (2009). "Flexible Shift Scheduling of Physicians." Health Care Mgmt Sci, 12(3), 285–305. DOI

MIP с implicit shift generation, column generation heuristic.

[R39] Brunner, J.O. et al. (2011). "Midterm Scheduling of Physicians with Flexible Shifts Using Branch and Price." IIE Transactions, 43(2), 84–109. DOI

Branch-and-price для больших инстансов.

[R40] Santos, H.G. et al. (2016). "Integer Programming Techniques for the Nurse Rostering Problem." Annals of OR, 239(1), 225–251. DOI

Улучшенные cuts + primal heuristics для INRC. Оптимальность для большинства инстансов.

[R41] Rahimian, E. et al. (2017). "A Hybrid IP and VNS Algorithm for Nurse Rostering." EJOR, 258(2), 411–423. DOI

Гибрид IP + VNS для сложных инстансов.

[R42] Burke, E.K. & Curtois, T. (2014). "New Approaches to Nurse Rostering Benchmark Instances." EJOR, 237(1), 71–81. DOI

Branch-and-price + ejection chains. Бенчмарки на schedulingbenchmarks.org.

[R43] Bagheri, M. et al. (2016). "Stochastic Programming for Nurse Scheduling in Real-World Hospital." Computers & Industrial Engineering, 96, 192–200.

[R44] Gomes, R.A. et al. (2017). "IP Model Extensions for Multi-Stage Nurse Rostering." Annals of OR, 275(2), 403–419. DOI

7. Constraint Programming (CP/CP-SAT)

[R45] Topaloglu, S. & Ozkarahan, I. (2011). "A CP-Based Solution Approach for Medical Resident Scheduling." Computers & OR, 38(1), 246–255. DOI

CP для резидентов с учётом ACGME.

[R46] Qu, R. & He, F. (2009). "A Hybrid CP Approach for Nurse Rostering." PDF

CP-based column generation.

[R47] Abdennadher, S. & Schlenker, H. (1999). "INTERDIP — An Interactive Constraint Based Nurse Scheduler." PACLP.

[R48] Aeschbacher, D.J. et al. (2023). "Nurse Scheduling with State-of-the-Art Open-Source Tools." SHTI, 302, 897–898. DOI

Оценка open-source инструментов (OMPR, DEAP) на реальном госпитале.

[R49] Ahmad, F. & Kovalchuk, Y. (2024). "ML and CP for Efficient Healthcare Scheduling." arXiv:2409.07547. arXiv

ML + CSP для расписания медсестёр.

[R50] Google OR-Tools. "Employee Scheduling." Tutorial

Официальный туториал CP-SAT для расписаний.

8. Метаэвристики

[R51] Ceschia, S. & Schaerf, A. (2020). "Solving INRC-II by Simulated Annealing Based on Large Neighborhoods." Annals of OR, 288(1), 95–113. DOI

[R52] Ceschia, S. & Schaerf, A. (2023). "Solving a Real-World NRP by Simulated Annealing." JIFS, 44(4), 6309–6321. DOI

[R53] Knust, F. & Xie, L. (2019). "SA Approach to Nurse Rostering Benchmark and Real-World Instances." Annals of OR, 272(1), 187–216. DOI

[R54] Leksakul, K. & Phetsawat, S. (2014). "Nurse Scheduling Using Genetic Algorithm." Math. Problems in Engineering, 2014, 246543. DOI

[R55] Pato, M.V. & Moz, M. (2008). "Solving a Bi-Objective Nurse Rerostering Problem by Utopic Pareto GA." J. Heuristics, 14(4), 359–374. DOI

[R56] Aickelin, U. et al. (2009). "An EDA with Intelligent Local Search for Rule-Based Nurse Rostering." JORS, 60(8), 1085–1098. DOI

[R57] Dowsland, K.A. (1998). "Nurse Scheduling with Tabu Search and Strategic Oscillation." EJOR, 106(2–3), 393–407. DOI

[R58] Bilgin, B. et al. (2012). "Local Search Neighbourhoods for a Novel Nurse Rostering Model." Annals of OR, 194(1), 33–57. DOI

[R59] Burke, E.K. et al. (2010). "A Hybrid IP + VNS for Highly-Constrained NRP." EJOR, 203(2), 484–493. DOI

[R60] Li, C. & Li, H. (2022). "A Combined MIP and DNN-Assisted Heuristics for NRP." Applied Soft Computing, 131, 109919. DOI

[R61] Zhang, Y. et al. (2022). "Neural Network-Assisted Method for the NRP." Computers & Industrial Engineering, 171, 108432. DOI

9. Column Generation / Branch-and-Price

[R62] Legrain, A. et al. (2020). "A Rotation-Based Branch-and-Price Approach for the NSP." Math. Programming Computation, 12, 417–450. DOI

До 120 медсестёр, 4 смены, 8-недельный горизонт. Open-source.

[R63] Maenhout, B. & Vanhoucke, M. (2010). "Branching Strategies in B&P for Multi-Objective NRP." J. Scheduling, 13(1), 77–93. DOI

[R64] Maenhout, B. & Vanhoucke, M. (2013). "Integrated Nurse Staffing and Scheduling for Longer-Term Problems." Omega, 41(2), 485–499. DOI

10. Справедливость (Fairness)

[R65] Berrada, I. et al. (1996). "A Multi-Objective Approach to Nurse Scheduling." Socio-Economic Planning Sciences, 30(3), 183–193. DOI

[R66] Constantino, A.A. et al. (2013). "A Heuristic for Nurse Scheduling with Balanced Preference Satisfaction." IEEE CEC, 605–612.

[R67] Wang, S. et al. (2019). "Improving Physician Schedules by Leveraging Equalization." Omega, 85, 182–193. DOI

[R68] Wolbeck, L. (2019). "Fairness Aspects in Personnel Scheduling." PhD, Universität Hamburg. PDF

[R69] Roemer, A. et al. (2025). "Exploring Nurse Perspectives on AI-Based Shift Scheduling for Fairness." BMC Nursing, 24, 383. DOI

11. Мульти-отделения

[R70] Maenhout, B. & Vanhoucke, M. (2013). "Analyzing Nursing Organizational Structure from a Scheduling Perspective." Health Care Mgmt Sci, 16(3), 177–196. DOI

[R71] Wickert, T.I. et al. (2019). "The Nurse Rerostering Problem: Strategies for Reconstructing Disrupted Schedules." J. Scheduling, 22(6), 647–668.

[R72] Chen, P.-S. et al. (2023). "A Heuristic for Medical Staff Scheduling with Multi-Skills and Vacation Control." Int. J. Comp. Intelligence Systems, 16, 126. DOI

[R73] Dogan, E. et al. (2023). "A B&P Approach for the NRP with Multiple Units." arXiv:2311.05438. arXiv

12. Финляндия и Скандинавия

[R74] Garde, A.H. et al. (2019). "Working Hour Characteristics Among Nurses in Three Nordic Countries." BMC Nursing, 18, 12. DOI

Сравнение Дания/Финляндия/Норвегия (n=83,473). Ночные смены длиннее в Финляндии (10–11ч).

[R75] Leineweber, C. et al. (2014). "Organization of Nursing Care in Three Nordic Countries." BMC Nursing, 13, 27. DOI

32 финских, 35 норвежских, 71 шведский госпиталь (n=15,900).

[R76] Kasanen, J. (2023). "Norway Did It — Why Does Finland Not Improve Nurses' Shift Planning?" Tehy

Норвегия: 6-мес горизонт vs Финляндия: 3 недели.

13. INRC Competition

[R77] Haspeslagh, S. et al. (2014). "The First International Nurse Rostering Competition 2010." Annals of OR, 218(1), 221–236. DOI

[R78] Ceschia, S. et al. (2019). "The Second International Nurse Rostering Competition." Annals of OR, 274(1-2), 171–186. DOI

[R79] Ceschia, S. et al. (2015). "INRC-II — Problem Description and Rules." arXiv:1501.04177. arXiv

[R80] Valouxis, C. et al. (2012). "A Systematic Two Phase Approach for the NRP." EJOR, 219(2), 425–433. DOI

14. Книги и учебники

[R81] Hall, R.W. (Ed.) (2012). Handbook of Healthcare System Scheduling. Springer. DOI

[R82] Hopp, W.J. & Lovejoy, W.S. (2012). Hospital Operations: Principles of High Efficiency Health Care. FT Press.

[R83] Zonderland, M.E. & Boucherie, R.J. (Eds.) (2015). Operations Management in Healthcare (2nd Ed). Springer.

[R84] Pinedo, M.L. (2016). Scheduling: Theory, Algorithms, and Systems (5th Ed). Springer. DOI

[R85] Demeulemeester, E. & Herroelen, W. (2002). Project Scheduling: A Research Handbook. Springer. DOI

15. EU Working Time Directive

[R86] Tobin, I. (2000). "The EWTD: We Will Need More Doctors." BMJ, 320(7225), 1–2. PMC

[R87] Clarke, N. et al. (2014). "The EWTD: A Decade On." The Lancet, 384(9954), e57–e58. DOI

[R88] Rodriguez-Jareno, M.C. et al. (2014). "EWTD and Doctors' Health: A Systematic Review." BMJ Open, 4(7), e004916. PMC

[R89] Soria-Aledo, V. et al. (2012). "The EWTD: A Practical Review for Surgical Trainees." Int. J. Surgery, 10(7), 399–403. DOI

[R90] Brunner, J.O. (2014). "Maximizing Time from the EWTD: The Heidelberg New Working Time Model." Health Economics Review, 4, 14. DOI

[R91] Garcia-Perez, M.A. et al. (2023). "Resident Physician Duty Hours and EWTD Compliance in Spain." Human Resources for Health, 21, 67. DOI

80.49% резидентов превышают 48ч/нед.

16. Open-source реализации

[R92] Timefold Solver — Java/Kotlin/Python, Apache 2.0. Employee rostering quickstarts.

[R93] NurseScheduler — Branch-and-price (C++, COIN-OR BCP).

[R94] nurse-scheduling — Web-приложение, constrained optimization.

[R95] shift_schedule — CP для shift scheduling (Python).

[R96] Doctor-Nurse-rostering-with-MiniZinc — 4 модели MiniZinc + Python.

[R97] D-Wave nurse-scheduling — Quantum annealing demo.

[R98] Google OR-Tools — CP-SAT solver с примерами nurse scheduling.

[R99] CP-SAT Primer — Практическое руководство по CP-SAT.

[R100] GA nurse-rostering — Генетический алгоритм.

[R101] AutoShiftPlanner — Free web app для roster scheduling.

17. Дополнительные важные работы

[R102] Carter, M.W. & Lapierre, S.D. (2001). "Scheduling Emergency Room Physicians." Health Care Mgmt Sci, 4(4), 347–360. DOI

Основополагающая работа по расписанию ER.

[R103] Franz, L.S. & Miller, J.L. (1993). "Scheduling Medical Residents to Rotations." Operations Research, 41(2), 269–279.

[R104] Fuegener, A. et al. (2017). "Online Rescheduling of Physicians in Hospitals." Flexible Services and Manufacturing J., 29, 375–399. DOI

[R105] Fuegener, A. & Brunner, J.O. (2021). "Physician Scheduling During a Pandemic." CPAIOR, Springer LNCS, 29–44. DOI

[R106] Lin, C.-C. et al. (2015). "Nurse Scheduling with Joint Normalized Preference Satisfaction Using GA." Int. J. Distributed Sensor Networks, 11(7), 595419. DOI

[R107] Fikar, C. & Hirsch, P. (2017). "Home Health Care Routing and Scheduling: A Review." Computers & OR, 77, 86–95. DOI

[R108] Asfaw, A. et al. (2021). "Fatigue, Personnel Scheduling and Operations: Review." EJOR, 295(3), 807–822. DOI

[R109] Youn, S. et al. (2022). "Planning and Scheduling in Healthcare for Better Care Coordination." POM, 31(12), 4407–4423. DOI

[R110] Brenndoerfer, M. (2024). "CP-SAT Rostering: Complete Guide to Constraint Programming for Workforce Scheduling." Blog


Сводная таблица

Категория Номера Кол-во
Обзоры и surveys R1–R8 8
Структура / NP-hard R9–R12 4
ER/ED scheduling R13–R25 13
Циклические расписания R26–R29 4
Циркадная хронобиология R30–R37 8
ILP/MIP R38–R44 7
CP/CP-SAT R45–R50 6
Метаэвристики R51–R61 11
Column generation / B&P R62–R64 3
Справедливость R65–R69 5
Мульти-отделения R70–R73 4
Финляндия / Скандинавия R74–R76 3
INRC Competition R77–R80 4
Книги R81–R85 5
EU Working Time Directive R86–R91 6
Open-source R92–R101 10
Доп. работы R102–R110 9
ИТОГО 110

Генерация паттернов ротации: обзор литературы

Контекст

Задача: не составлять расписание с нуля, а спроектировать сам паттерн ротации (master template) алгоритмически — с заложенной гибкостью, устойчивостью к отпускам и учётом предпочтений. Потом использовать этот паттерн как эталон для составления конкретных расписаний.

Три фазы:

  1. Дизайн паттерна — оптимизация самого шаблона
  2. Выбор — сравнение вариантов, утверждение
  3. Составление расписания — Column Generation с паттерном как эталоном

1. Генерация паттернов как задача оптимизации

Musliu, Gärtner, Slany (TU Wien, 2002–2020)

Главная группа по автоматической генерации ротационных паттернов.

Musliu, N., Gärtner, J., Slany, W. (2002). "Efficient generation of rotating workforce schedules." Discrete Applied Mathematics, 118(1-2), 85-98. DOI: 10.1016/S0166-218X(01)00258-X

Основополагающая работа. Алгоритм строит ротационный паттерн за 4 шага: (1) выбрать длину рабочих блоков, (2) расставить выходные с оптимальными свойствами, (3) перебрать допустимые последовательности смен, (4) назначить смены на блоки для покрытия. Паттерн — прямой выход алгоритма.

Musliu, N. (2006). "Heuristic methods for automatic rotating workforce scheduling." Int. J. Comp. Intelligence Research, 2(4), 309-326. PDF

Tabu search + min-conflicts для автоматической генерации ротаций. Гибрид методов эффективнее каждого по отдельности. Встроен в коммерческую систему Ximes.

Kletzander, L., Musliu, N. (2019). "Exact methods for extended rotating workforce scheduling problems." Proc. ICAPS, 29, 519-527. DOI: 10.1609/icaps.v29i1.3518

Best Paper Award ICAPS 2019. Находит оптимальный паттерн точно (не приближённо) для реальных инстансов с практическими расширениями.

Kletzander, L., Musliu, N. (2020). "A decomposition heuristic for rotational workforce scheduling." J. Scheduling, 23(5), 529-553. DOI: 10.1007/s10951-020-00659-2

Декомпозиция внутри дизайна паттерна: фиксируется блочная структура → решается назначение смен. Двухфазная оптимизация самого паттерна.

Gärtner, J., Musliu, N., Slany, W. (2001). "Rota: A research project on algorithms for workforce scheduling and shift design optimization." AI Communications, 14(2), 83-92.

Обзор проекта Rota: shift design (какие смены существуют) и rotation design (как они повторяются) как связанные задачи оптимизации.


Column Generation: колонки = паттерны

Legrain, A., Omer, J., Rosat, S. (2020). "A rotation-based branch-and-price approach for the nurse scheduling problem." Math. Programming Computation, 12, 417-450. DOI: 10.1007/s12532-019-00172-4

Каждая колонка = ротация (блок последовательных рабочих дней). Pricing subproblem генерирует новые ротации динамически. 120 медсестёр, 4 смены, 8 недель. Open-source реализация.

Bard, J.F., Purnomo, H.W. (2005). "Preference scheduling for nurses using column generation." EJOR, 164(2), 510-534. DOI: 10.1016/j.ejor.2003.06.046

Column generation где колонки = индивидуальные schedule-паттерны. Subproblem генерирует новые паттерны с учётом предпочтений.

Bard, J.F., Purnomo, H.W. (2007). "Cyclic preference scheduling of nurses using a Lagrangian-based heuristic." J. Scheduling, 10, 5-23. DOI: 10.1007/s10951-006-0323-7

Генерация циклических профилей (repeating patterns) через IP + Lagrangian relaxation. До 100 медсестёр, 20 ротационных профилей. Предпочтения встроены в паттерн.

Maenhout, B., Vanhoucke, M. (2010). "Branching strategies in a branch-and-price approach for a multiple objective nurse scheduling problem." J. Scheduling, 13, 77-93. DOI: 10.1007/s10951-009-0108-x

Branch-and-price с branch-on-pattern стратегиями. Многокритериальная оптимизация паттернов.


Physician Scheduling — генерация паттернов для врачей

Brunner, J.O., Bard, J.F., Kolisch, R. (2009). "Flexible shift scheduling of physicians." Health Care Mgmt Sci, 12(3), 285-305. DOI: 10.1007/s10729-008-9095-2

MIP с implicit shift generation через column generation. Новый подход: множественная генерация паттернов из одного решения для ускорения.

Brunner, J.O., Edenharter, G.M. (2011). "Long term staff scheduling of physicians with different experience levels." Health Care Mgmt Sci, 14(2), 189-202. DOI: 10.1007/s10729-011-9155-x

Стратегическое долгосрочное планирование. Dantzig-Wolfe декомпозиция с генерацией паттернов для врачей разного уровня.


2. Гибкость в паттернах

Doi, T., Nishi, T., Voß, S. (2016). "Flexible cyclic rostering in the service industry." IIE Transactions, 48(12), 1139-1155. DOI: 10.1080/0740817X.2016.1200202

Flexible cyclic rostering — паттерн спроектирован, но допускает ограниченные еженедельные отклонения. Стохастическая модель: паттерн оптимизируется под неопределённость спроса. Результат: −10% непокрытия vs жёсткий паттерн.

Maenhout, B., Vanhoucke, M. (2009). "The impact of incorporating nurse-specific characteristics in a cyclical scheduling approach." JORS, 60(12), 1683-1698. DOI: 10.1057/jors.2008.131

Сравнение: (1) один паттерн для всех, (2) персональные циклические паттерны, (3) полностью ациклическое расписание. Персональные паттерны — лучший баланс предсказуемости и качества.


3. Устойчивость к отпускам (Robust Pattern Design)

Smet, P., Wauters, T., Mihaylov, M., Vanden Berghe, G. (2015). "The impact of reserve duties on the robustness of a personnel shift roster." Computers & OR, 61, 153-169. DOI: 10.1016/j.cor.2015.03.005

Встраивают резервные смены прямо в паттерн. Расположение резервов — переменная оптимизации. Паттерн заранее устойчив к отсутствиям.

Wickert, T.I., Smet, P., Vanden Berghe, G. (2021). "Quantifying and enforcing robustness in staff rostering." J. Scheduling, 24(3), 325-345. DOI: 10.1007/s10951-021-00686-7

Метрики робастности паттерна без симуляции. Можно оценить устойчивость паттерна к дырам ещё до составления расписания.

Doneda, M., Smet, P., Carello, G. et al. (2025). "Robust personnel rostering: How accurate should absenteeism predictions be?" J. Scheduling. DOI: 10.1007/s10951-025-00858-9

Predict-then-optimize: ML предсказывает отсутствия → паттерн проектируется с учётом прогноза. Чем точнее прогноз отпусков, тем лучше паттерн.


4. Основополагающие работы

Balakrishnan, N., Wong, R.T. (1990). "A network model for the rotating workforce scheduling problem." Networks, 20(1), 25-42. DOI: 10.1002/net.3230200103

Дизайн паттерна как shortest path в сетевой модели. Все ограничения = структура графа. Оптимальный паттерн = кратчайший путь.

Laporte, G. (1999). "The art and science of designing rotating schedules." JORS, 50, 1011-1017. DOI: 10.1057/palgrave.jors.2600803

Аргументирует что хороший паттерн — и математика, и неявные знания (эргономика, хронобиология). IP-модели слишком жёсткие, нужен гибридный подход.

Alfares, H.K. (2004). "Survey, categorization, and comparison of recent tour scheduling literature." Annals of OR, 127, 145-175. DOI: 10.1023/B:ANOR.0000019088.98647.e2

Обзор методов дизайна циклических графиков (tour scheduling). 10 категорий подходов.

Erhard, M., Schoenfelder, J., Fugener, A., Brunner, J.O. (2018). "State of the art in physician scheduling." EJOR, 265(1), 1-18. DOI: 10.1016/j.ejor.2017.06.037

Определяющий обзор PSP: cyclic vs acyclic, template-based, two-phase decompositions.


5. Двухфазные подходы: Дизайн + Инстанциация

Valouxis, C., Gogos, C. et al. (2012). "A systematic two phase approach for the nurse rostering problem." EJOR, 219(2), 425-433. DOI: 10.1016/j.ejor.2011.12.042

Фаза 1: назначить day-on/day-off паттерны (шаблон). Фаза 2: назначить конкретные смены внутри шаблона. Существенно уменьшает размер задачи.


Сводная таблица

Что Кто Как
Генерация ротационного паттерна Musliu et al. (2002–2020) Constraint-based + tabu search, точные методы
Паттерны через column generation Legrain (2020), Bard (2005, 2007) Колонки = паттерны, pricing = генерация
Паттерны для врачей Brunner (2009, 2011) MIP + column generation
Гибкие паттерны Doi, Nishi, Voß (2016) Стохастическая модель, допуск отклонений
Персональные vs общие паттерны Maenhout & Vanhoucke (2009) Сравнение подходов
Устойчивость к отпускам Smet et al. (2015), Wickert (2021) Резервные смены в паттерне
Прогноз отсутствий → дизайн Doneda et al. (2025) ML + optimize
Паттерн как shortest path Balakrishnan & Wong (1990) Сетевая модель
Дизайн + инстанциация (2 фазы) Valouxis et al. (2012) IP фаза 1 + IP фаза 2

Вывод

Генерация паттернов — зрелая область. Точные методы существуют (Musliu 2019). Гибкость в паттернах (Doi 2016), устойчивость к отпускам (Smet 2015, Doneda 2025), персонализация (Maenhout 2009) — всё есть в литературе. Наша задача: скомбинировать — взять паттерн Сергея как стартовую точку, оптимизировать его гибкость и устойчивость, потом использовать Column Generation для составления конкретных расписаний.

Верификация паттернов ротации

Сергей, мы расшифровали оба паттерна с картинок. Проверь, пожалуйста, правильно ли мы всё поняли.


Общий принцип (как мы его поняли)

  1. Есть два паттерна: один для специалистов (EL/EL+), другой для специализирующихся (EVAL/EVAL+)
  2. Каждый паттерн — набор «недель-позиций» (16 для EL, 19 для EVAL)
  3. Каждая позиция — готовое недельное расписание: какой день, какая смена, какое место
  4. Врачу присваивается буква (A–P) или цифра (1–19), и он стартует с этой позиции
  5. Каждую неделю врач сдвигается на следующую позицию: A→B→C→...→P→A
  6. За полный цикл (16 или 19 недель) каждый врач проходит все позиции
  7. Среднее за цикл ≈ 38ч/нед — в норме SOTE

Вопрос: это верно? Или сдвиг идёт не каждую неделю, а как-то иначе?


Паттерн 1: Специалисты (EL/EL+) — 16 позиций

Позиция A — «Неделя ответственного» (40ч)

Пн–Пт: каждый день Aamu VV (утренняя смена ответственного по смене, 8-16). Сб–Вс: выходные. → Полная рабочая неделя в одной роли. Самая «стабильная» неделя.

Позиция B — «Loimaa + ночная + выходные» (45.25ч)

Пн: Ilta Loimaa (вечерняя в Loimaa). Вт: Yö VV (ночная ответственного). Ср–Чт: выходные. Пт: Aamu NOP (утро). Сб: Vkl aamu osasto (выходная утренняя, отделение). Вс: Vkl aamu hy3 (выходная утренняя, hy3). → Тяжёлая неделя: сателлит + ночная + работа в выходные.

Позиция C — «Выходные вечерние VV» (47ч)

Вт: ilta Kons (вечер, консультации). Чт: Aamu hy3 (утро). Пт: Hallinto (админ). Сб: Vkl ilta VV (выходная вечерняя, ответственный). Вс: Vkl ilta VV (то же). → Одна из самых тяжёлых — включает выходные вечерние VV.

Позиция D — «Лёгкая с Loimaa» (33ч)

Вт: Aamu Loimaa. Ср: Aamu hy4. Чт: Koulutus. Пт: Ilta sijoittamaton. → 4 рабочих дня, лёгкая неделя.

Позиция E — «Вечерняя VV» (30ч)

Пн: Ilta VV. Вт: Ilta VV. Чт: Aamu Loimaa. Пт: Hallinto. → Лёгкая, вечера + Loimaa.

Позиция F — «Утро + обучение» (39ч)

Пн: Aamu Kons. Вт: Aamu hy1. Ср: Aamu hy3. Чт: Koulutus. Пт: Ilta Loimaa. → Классическая неделя: утренние смены разные места, обучение в четверг, вечер Loimaa в пятницу.

Позиция G — «Ночные выходные» (43.5ч)

Вт: Aamu Osasto. Ср: Aamu Loimaa. Чт: Koulutus. Сб: Yö VV. Вс: Yö VV. → Будни лёгкие, но ночные в выходные (парные!).

Позиция H — «UKI + выходные утро» (40ч)

Чт: Aamu hy1. Пт: Aamu UKI (Uusikaupunki). Сб: Vkl aamu NOP/kons. Вс: Vkl aamu NOP/kons. → Короткие будни, но работа в выходные.

Позиция I — «Ночной блок» (28.5ч)

Вт: Ilta NOP+H1. Ср: Yö VV. Чт: Yö VV. → Самая лёгкая неделя. Вечер→Ночь→Ночь, потом 3 дня отдых. Forward rotation.

Позиция J — «Hallinto + вечера» (32ч)

Пн: Hallinto. Вт: Ilta hy4/5. Ср: Ilta hy4/5. Пт: Aamu hy1. → Лёгкая, начинается с админа.

Позиция K — «Forward до ночной» (43.25ч)

Пн: Aamu hy4. Вт: Hallinto. Ср: Ilta NOP+HY1. Чт: Ilta hy4/5. Пт: Yö VV. → Классический forward: Утро→Админ→Вечер→Вечер→Ночь.

Позиция L — «Утро-вечер» (30ч)

Пн: Aamu hy3. Вт: Aamu hy3. Ср: Ilta kons. Чт: Ilta kons. → Лёгкая: 2 утра + 2 вечера, пятница выходной.

Позиция M — «Ночная + выходные» (46.25ч)

Пн: Yö VV (после ночи Вс? или начало недели с ночной). Чт: Koulutus. Пт: Aamu hy4. Сб: Vkl aamu hy3. Вс: Vkl Aamu osasto. → Тяжёлая: ночная в начале + выходные.

Позиция N — «Выходные вечерние» (47ч)

Пн: Hallinto. Чт: Aamu osasto. Пт: Aamu Kons. Сб: Vkl ilta hy3. Вс: Vkl ilta hy3. → Тяжёлая из-за выходных вечерних.

Позиция O — «Ilta + обучение» (32ч)

Пн: Ilta Sijoittamaton. Ср: Aamu kons. Чт: Koulutus. Пт: Ilta VV. → Лёгкая с обучением.

Позиция P — «Утро-вечер VV» (29ч)

Пн: Aamu osasto. Вт: Hallinto. Ср: Ilta VV. Чт: Ilta VV. → Самая лёгкая буднишная: 4 дня, пятница выходной.


Паттерн 2: Специализирующиеся (EVAL/EVAL+) — 19 позиций

Позиция 1 — «Вечер + выходные утро» (47ч)

Пн: Ilta hy4. Вт: Ilta Loimaa. Чт: Koulutus. Сб: Vkl aamu hy1. Вс: Vkl aamu hy4/5. → Тяжёлая: вечера на буднях + рабочие выходные.

Позиция 2 — «10-20 + админ» (35ч)

Пн: 10-20 not/nop. Ср: Hallinto. Чт: Aamu aku/kons. Пт: Ilta hy3. → Средняя, с промежуточной сменой 10-20.

Позиция 3 — «UKI + комбо» (39ч)

Пн: Aamu Uki. Вт: Aamu hy3. Ср: Aamu nop. Чт: Koulutus + Ilta hy1. → Утренние смены + комбинированный четверг (обучение + вечерняя).

Позиция 4 — «Forward до ночных + выходные» (43.5ч)

Пн: Ilta hy3. Чт: Ilta Loimaa. Пт: Ilta aku/kons. Сб: Yö hy 1+5. Вс: Yö nopo. → Вечера → ночные в выходные.

Позиция 5 — «Обучение + выходные вечер» (40ч)

Чт: Koulutus. Пт: Aamu osasto. Сб: Vkl ilta hy4/5. Вс: Vkl ilta PED. → Лёгкие будни, но вечерние выходные (разные места!).

Вопрос: в позиции 5 Сб и Вс разные (hy4/5 и PED) — это ок? Или выходные всегда должны быть одинаковые?

Позиция 6 — «Промежуточная + обучение» (34ч)

Вт: Aamu nop. Ср: 10-20 not/nop. Чт: Koulutus. Пт: Ilta hy4. → Лёгкая, с промежуточной 10-20.

Позиция 7 — «Идеальный forward» (45.5ч)

Пн: Aamu nop. Вт: Ilta hy3. Ср: Ilta ped. Чт: Yö nopo. Пт: Yö hy1+5. → Утро→Вечер→Вечер→Ночь→Ночь. Классический forward!

Позиция 8 — «Loimaa + выходные вечер» (40ч)

Вт: Hallinto. Ср: Ilta Loimaa. Чт: Ilta hy3. Сб: Vkl ilta sijoittamaton. Вс: Vkl ilta nopo+h1. → Средняя с выходными.

Позиция 9 — «Ночная + восстановление» (29.25ч)

Пн: Yö hy 1+5. Чт: 10-20 not/nop. Пт: Ilta hy3. → Лёгкая. Ночь в начале, потом 2 дня отдыха, потом лёгкие смены.

Позиция 10 — «Утренняя неделя + UKI» (38ч)

Пн: Aamu hy3. Вт: Aamu nop. Ср: Aamu osasto. Чт: Koulutus. Пт: Ilta Uki. → Стандартная: утро разные места, обучение Чт, вечер UKI в Пт.

Позиция 11 — «Ночная + выходные утро» (45.25ч)

Пн: Yö nopo. Чт: Aamu nop. Пт: Aamu hy3. Сб: Vkl aamu osasto/sijoittamaton. Вс: Vkl aamu nop+kons. → Тяжёлая: ночь→восстановление→утро→выходные.

Позиция 12 — «UKI + 10-20» (33ч)

Пн: Ilta Uki. Ср: Aamu hy1. Чт: Aamu hy4. Пт: 10-20 not/nop. → Средняя.

Позиция 13 — «Loimaa + выходные вечер» (43ч)

Пн: Ilta aku/kons. Чт: Koulutus. Пт: Aamu Loimaa. Сб: Vkl ilta nopo+hy1. Вс: Vkl ilta h4/5. → Тяжёлая из-за выходных.

Позиция 14 — «10-20 + ночная Вс» (37.25ч)

Вт: 10-20 not/nop. Ср: Ilta hy3. Чт: Ilta ped. Вс: Yö hy1+5. → Необычная: ночная только в воскресенье (одиночная!).

Вопрос: ночная в Вс — с ней не следующий Пн выходной? Или это «заходная» ночь в следующую неделю?

Позиция 15 — «Hallinto + комбо» (31ч)

Ср: Hallinto. Чт: Koulutus + Ilta hy3. Пт: Ilta hy1. → Лёгкая: 3 рабочих дня.

Позиция 16 — «Forward» (36.25ч)

Пн: Aamu Loimaa. Вт: Ilta hy3. Ср: Ilta hy3. Чт: Yö hy1+5. → Forward: Утро→Вечер→Вечер→Ночь. Пт–Вс отдых.

Позиция 17 — «Утро + выходные» (48ч)

Пн: Aamu nop. Вт: Aamu hy4. Чт: Koulutus. Сб: Vkl aamu kons+nop. Вс: Vkl aamu hy1. → Самая тяжёлая неделя (48ч!). Из-за выходных.

Позиция 18 — «Ночной блок» (29.5ч)

Пн: Ilta hy3. Вт: Yö hy 1+5. Ср: Yö hy 1+5. → Лёгкая: Вечер→Ночь→Ночь + 4 дня отдыха. Forward.

Позиция 19 — «Вечера + обучение» (32ч)

Пн: Ilta hy1. Вт: Ilta ped. Чт: Koulutus. Пт: Aamu nop. → Лёгкая.


Закономерности (проверь, пожалуйста)

  1. Koulutus (обучение) всегда в четверг — верно?
  2. Ночные идут парами (2 ночи подряд) — за исключением позиции 14 (одиночная Yö в Вс). Это правило или исключение?
  3. После ночного блока — минимум 2 дня отдыха — верно?
  4. Выходные парные — Сб и Вс всегда одна и та же смена (aamu/ilta). Но в поз.5 они разные (hy4/5 и PED) — это ротация мест при одном типе смены?
  5. Forward rotation — заметна в K, I (паттерн 1), 7, 16, 18 (паттерн 2). Но не строгая — бывают прыжки. Это «стремление» или жёсткое правило?
  6. Тяжёлые и лёгкие недели не идут подряд — верно? Или это зависит от offset-а?
  7. VV (vuorovastaava) только у специалистов (паттерн 1) — у EVAL его нет? Верно?
  8. Смена 10-20 только у EVAL (паттерн 2) — у специалистов её нет? Верно?
  9. Loimaa и UKI — это сателлиты, куда врач реально едет? Все врачи их делают или только некоторые?
  10. Sijoittamaton — «не назначен». Это резервная позиция (врач на месте, но без конкретного назначения)?
  11. Комбинированные слоты типа «Koulutus + Ilta hy1» — обучение утром, вечерняя смена? Или весь день?
  12. Сдвиг — каждую неделю на +1 позицию? Т.е. за 16 (или 19) недель врач проходит весь цикл?

Задача: расписание врачей ER

Что есть

Два готовых паттерна ротации (таблицы Excel):

  • Паттерн специалистов: 16 позиций-недель, каждая позиция = конкретный набор {день → смена + место}
  • Паттерн EVAL: 19 позиций-недель, аналогично

Каждый паттерн спроектирован вручную так, что:

  • Смены идут цепочками (утро→вечер→ночь→отдых)
  • Локации ротируются (не одно место всю неделю)
  • Выходные парные (Сб=Вс)
  • Среднее за цикл ≈ 38ч/нед
  • Покрытие всех мест и смен обеспечено

Сейчас врачи «запускаются» в паттерн со смещением и вручную проходят все позиции. Это работает, но обработка отпусков и подмен делается руками в Excel.

Что не работает

Существующий солвер (Саша) пытается генерировать расписание с нуля из правил и constraints. Результат плохой:

  • Нет цепочек
  • Нет парных выходных
  • Хаотичное распределение
  • Половина врачей с недобором часов

Солвер не знает про паттерны. Он стартует с рандома и пытается удовлетворить правила — но пространство решений слишком большое, и он ловит локальный оптимум.

Что нужно

Алгоритм, который:

  1. Берёт готовый паттерн (16 или 19 позиций-недель)
  2. Назначает каждому врачу offset (позицию входа в паттерн)
  3. Раскатывает на календарь (квартал = 13 недель)
  4. Вырезает отпуска → список дыр
  5. Заполняет дыры подменами, сохраняя:
    • цепочки (не ломать утро→вечер→ночь)
    • покрытие всех мест
    • часовые нормы
    • парные выходные
  6. Отдаёт результат в существующую систему как warm-start для солвера — или как финальное расписание

Почему это должно сработать

Паттерн уже содержит в себе решение 80% задачи — цепочки, diversity, справедливость, покрытие. Остаётся только обработать 20% исключений (отпуска, частичная занятость, индивидуальные предпочтения). Это радикально меньшее пространство поиска, чем генерация с нуля.

Одной фразой

Не генерировать расписание из правил — а взять готовый работающий паттерн и адаптировать его под реальность.

Контекст

  • Система: aikataulutus.atomicehr.com (Александр Стрельцов)
  • Заказчик: Сергей Садов (главврач, Turku)
  • Масштаб: 57 врачей, 60 локаций, 3 клиники, квартальное планирование
  • Врачи: 2 типа — специалисты (EL/EL+, паттерн 16 нед) и специализирующиеся (EVAL/EVAL+, паттерн 19 нед)
  • Законодательство: Työaikalaki 872/2019, SOTE-sopimus, Lääkärisopimus (≤114.75ч/3нед, ≥11ч отдых, ≥35ч еженедельный, ≤48ч/нед EU WTD)

Правила от Сергея

  1. Цепочка будни: 2 утра → 2 вечера → 1-2 ночи → отдых
  2. Цепочка выходных: Чт день → Чт вечер → Сб 12ч → Вс 12ч
  3. Выходные парные (Сб=Вс)
  4. Вечер→утро OK если утро с 10:00
  5. Diversity: не одна локация всю неделю
  6. Всегда ≥1 Specialist+ на дежурстве
  7. Loimaa, Uusikaupunki, ночные → приоритет заполнения
  8. Админ время — ручное, отдельно от клинического

Циклическое проектирование расписаний

Циклическое проектирование расписаний означает, что сначала строится повторяющийся рабочий паттерн, и лишь затем он накладывается на реальные календарные даты. Вместо того чтобы каждый месяц составлять расписание заново, планировщик создаёт цикл — например, утро, утро, вечер, вечер, ночь, ночь, выходной, выходной — и затем воспроизводит его для всех команд или сотрудников [Mai73, Fer11]. Главное преимущество — стабильность. Персонал может видеть свой ритм далеко вперёд, руководителям проще проверять соответствие правилам, а расписание становится легче объяснять и отстаивать.

В здравоохранении эта идея особенно полезна, когда структура спроса достаточно регулярна и когда нормы отдыха имеют принципиальное значение. Хороший цикл может напрямую встраивать в паттерн многие из сложных ограничений — ограничения на количество подряд идущих ночных смен, время восстановления после ночей, справедливое распределение выходных и нежелательных дежурств [Mil98, Bar07, Pur07]. Получив рабочий цикл, планировщик может применять его на долгосрочных горизонтах вместо того, чтобы каждый раз выстраивать расписание с нуля.

Как это обычно работает

Типичный процесс циклического составления расписания включает четыре шага.

  1. Выбор повторяющегося паттерна смен. Паттерн задаёт ритм работы и отдыха. В медицинских работах это, как правило, чередование утренних, вечерних, ночных смен и выходных дней [Mai73, Mil98].

  2. Проверка качества паттерна. Цикл проверяется на соответствие нормам укомплектованности, правилам отдыха, целям справедливости и качеству последовательности смен. Важно не только обеспечить покрытие спроса, но и исключить вредные или непопулярные сочетания смен [Bar07, Pur07].

  3. Назначение цикла людям или командам. Разные команды нередко запускаются со сдвигом относительно одного и того же цикла. Таким образом, одна команда может быть на утренних сменах, пока другая работает ночью, и вся система в совокупности обеспечивает необходимое ежедневное покрытие [Mai73, Fer11].

  4. Развёртывание цикла в реальный календарь. После того как повторяющаяся основа зафиксирована, она накладывается на недели, месяцы или полный год. Именно на этом этапе начинают играть роль праздники, заявки на отпуск и локальные корректировки [Fer11].

Почему циклические расписания нравятся

Основные преимущества носят практический характер.

  • Предсказуемость для персонала
  • Упрощённая проверка соответствия юридическим и договорным нормам
  • Более стабильные ритмы сна и восстановления при грамотно спроектированном цикле
  • Снижение трудозатрат на планирование в долгосрочной перспективе
  • Чёткая база, от которой можно отталкиваться при последующих корректировках [Fer11, Kly21]

Для отделений экстренной помощи и стационарных отделений циклическое проектирование также помогает прозрачно распределять выходные, ночные смены и прочие тяжёлые дежурства. Это важно как для справедливости, так и для того, чтобы персонал принял итоговое расписание [Fer11, Sto12].

Основные проектные цели в литературе

Литература по циклическому составлению расписаний, как правило, стремится сбалансировать несколько повторяющихся целей.

Цель Что это означает на практике Примеры ссылок
Покрытие Достаточное количество персонала на каждом типе смены [Mai73, Mil98]
Отдых и безопасность Отсутствие вредных последовательностей и достаточное время восстановления [Mil98, Bec18]
Справедливость Разумное распределение ночей, выходных и нежелательных дежурств [Bar07, Pur07, Sto12]
Стабильность Повторяющиеся паттерны, которые персонал может освоить и учитывать в личном планировании [Fer11, Kly21]
Учёт предпочтений Частичный учёт пожеланий сотрудников [Bar07, Pur07]

Важные разновидности

Строго циклические расписания

Один и тот же паттерн повторяется с минимальными изменениями. Это наиболее чистая форма циклического планирования, наиболее удобная для аудита. Ранние работы по составлению расписаний медицинских сестёр наиболее близки к этому стилю [Mai73, Ros87].

Полуциклические расписания

Есть повторяющийся каркас, однако допускается некоторая локальная гибкость. На практике это ближе к реальной больничной среде: такой подход сохраняет преимущества стабильного ритма, не загоняя весь год в жёсткий шаблон [Kly21].

Циклические расписания с учётом предпочтений

Цикл проектируется не только для покрытия спроса и соответствия нормам, но и для повышения удовлетворённости персонала. Это направление стремится включать предпочтительные последовательности и минимизировать нежелательные, сохраняя при этом циклическую структуру [Bar07, Pur07].

Вклад классических работ

Статья Ключевая идея Почему она актуальна до сих пор
[Mai73] Построить цикличное расписание медсестёр, а затем распределить персонал по реальным потребностям Ранее доказательство того, что циклическое планирование можно отделить от последующей настройки
[Mil98] Сетевые модели для циклических и нециклических 12-часовых расписаний медсестёр Показывает, как циклическое проектирование можно решать как структурированную задачу оптимизации
[Bar07] Циклическое расписание с учётом предпочтений и эвристической оптимизацией Показывает, что циклические расписания могут включать предпочтения сотрудников
[Pur07] Метод ветвей и цен для циклического расписания с предпочтениями Строгий взгляд на точную оптимизацию циклических расписаний медсестёр
[Fer11] Повторяемые годовые циклические расписания для врачей скорой помощи Лучший прямой пример применения для врачей и отделений экстренной помощи в изученном наборе
[Kly21] Полуциклическое составление расписаний с явными показателями стабильности и гибкости Хороший мост между строгими циклами и реальной больничной гибкостью

Лучший пример для отделения экстренной помощи

Наиболее релевантной работой для контекста отделения экстренной помощи является статья Ferrand et al. [Fer11]. В ней строятся повторяемые расписания для врачей скорой помощи и обосновывается, что циклический подход делает расписание более предсказуемым и сбалансированным. Это важно, поскольку показывает: циклическое проектирование — не только устаревший метод составления расписаний медсестёр, оно применимо и в среде врачей с множеством ограничений и предпочтений [Fer11].

Не менее важно то, чего эта работа не делает. В ней говорится, что отпуска и праздничные заявки можно учитывать после построения циклического расписания, однако этот шаг не превращается в отдельный этап оптимизационного восстановления [Fer11]. Именно это является одной из главных причин, по которым более широкий проект по-прежнему выглядит новаторским.

Сильные стороны циклического проектирования расписаний

Циклическое проектирование расписаний наиболее эффективно при создании базового расписания.

Оно хорошо подходит для:

  • проектирования здорового и повторяемого рабочего ритма
  • соблюдения повторяющихся правил последовательности смен
  • управления планированием на длительных горизонтах
  • обеспечения предсказуемости для персонала
  • создания стабильного каркаса для дальнейшей работы с расписанием [Mai73, Fer11, Kly21]

Слабые стороны

Циклическое проектирование расписаний хуже справляется с ситуациями, когда реальная жизнь нарушает паттерн.

Типичные слабые места:

  • отпуска и ежегодные выходные
  • учебные дни
  • декретный или родительский отпуск
  • внезапные изменения спроса
  • распределение по конкретным подразделениям, кабинетам или рабочим местам после фиксации самой смены

Большинство работ по циклическому планированию останавливаются после построения базового паттерна или лишь вскользь упоминают последующие корректировки [Fer11]. Литература по перепланированию исследует восстановление расписаний гораздо детальнее, однако, как правило, отправной точкой служит обобщённое расписание, а не циклическое мастер-расписание [Wic19, Kly24]. Именно поэтому циклическое проектирование расписаний лучше всего рассматривать как один из слоёв более широкой архитектуры, а не как самостоятельное и исчерпывающее решение всей задачи больничного планирования.

Почему это важно для текущего проекта

Для финского отделения экстренной помощи циклическое проектирование расписаний имеет смысл в качестве фундаментального слоя. Оно обеспечивает стабильный мастер-паттерн, в который можно встроить нормы отдыха, ограничения на ночные смены и требования справедливости на повторяющихся периодах. После этого реальная задача сводится к тому, как наложить цикл на конкретные даты, учесть плановые отсутствия, устранить возникающие пробелы и лишь затем распределить людей по конкретным секциям отделения. Литература хорошо проработана на первом слое и значительно тоньше — в отношении полного конвейера, следующего за ним [Fer11, Kly24, Fug15].

Ключевые ссылки

  • [Mai73] Maier-Rothe, C., Wolfe, H.B. 1973. Cyclical scheduling and allocation of nursing staff. Socio-Economic Planning Sciences 7, 471–487.
  • [Mil98] Millar, H.H., Kiragu, M. 1998. Cyclic and non-cyclic scheduling of 12 h shift nurses by network programming. European Journal of Operational Research 104, 582–592.
  • [Bar07] Bard, J.F., Purnomo, H.W. 2007. Cyclic preference scheduling of nurses using a Lagrangian-based heuristic. Journal of Scheduling 10, 5–23.
  • [Pur07] Purnomo, H.W., Bard, J.F. 2007. Cyclic preference scheduling for nurses using branch and price.
  • [Fer11] Ferrand, Y.B., Magazine, M.J., Rao, U.S., Glass, T.F. 2011. Building Cyclic Schedules for Emergency Department Physicians. Interfaces 41, 521–533.
  • [Kly21] Klyve, K.K., et al. 2021. Semi-cyclic rostering of ranked surgeons: A real-life case with stability and flexibility measures. Operations Research for Health Care 28, 100286.
  • [Wic19] Wickert, T.I., Smet, P., Vanden Berghe, G. 2019. The nurse rerostering problem: Strategies for reconstructing disrupted schedules. Computers and Operations Research 104, 319–337.
  • [Fug15] Fügener, A., Brunner, J.O., Podtschaske, A. 2015. Duty and workstation rostering considering preferences and fairness: a case study at a department of anaesthesiology. International Journal of Production Research 53, 7465–7487.

Итог

Циклическое проектирование расписаний лучше всего понимать как способ создания стабильного повторяющегося каркаса рабочих графиков. Оно очень хорошо справляется с задачами упорядочивания, справедливости и предсказуемости. Как самостоятельный метод больничного планирования оно существенно менее полно, как только в картину входят отпуска, отсутствия и последующее распределение по подразделениям. Именно поэтому оно лучше всего работает как первый слой более широкого конвейера планирования, а не как весь конвейер целиком.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment