📋 ИИ Промпт - Графики смен
🎯 Описание проекта
Проект для автоматического составления графиков смен сотрудников с использованием Constraint Programming (CP-SAT). Решает задачи оптимального распределения персонала с учетом множества ограничений и предпочтений.
📁 Структура проекта
OperatorSchedule/
├── src/ # Основной исходный код
│ ├── __init__.py # Корневой пакет
│ ├── app.py # Точка входа (FastAPI, если веб-интерфейс)
│ ├── config.py # Конфигурация системы
│ ├── exceptions.py # Исключения и ошибки
│ ├── logging_config.py # Настройка логирования
│ │
│ ├── core/ # Ядро системы
│ │ ├── __init__.py
│ │ ├── engine.py # Основной класс планировщика (SchedulerEngine)
│ │ ├── solver.py # Орто-модель CP-SAT
│ │ ├── validator.py # Валидатор результатов
│ │ └── events.py # События системы (логи, уведомления)
│ │
│ ├── domains/ # Доменные сущности
│ │ ├── __init__.py
│ │ ├── models/ # Модели данных
│ │ │ ├── __init__.py
│ │ │ ├── operator.py # Класс Operator (оператор)
│ │ │ ├── shift.py # класс Shift (смена)
│ │ │ ├── schedule.py # класс Schedule (график)
│ │ │ └── preference.py # класс Preference (предпочтение)
│ │ ├── repositories/ # Интерфейсы доступа к данным
│ │ │ ├── __init__.py
│ │ │ ├── operator_repo.py
│ │ │ ├── shift_repo.py
│ │ │ └── schedule_repo.py
│ │ └── services/ # Бизнес-логика
│ │ ├── __init__.py
│ │ ├── generator.py # Генератор графиков
│ │ ├── optimizer.py # Оптимизатор
│ │ └── conflict_resolver.py # Ресольвер конфликтов
│ │
│ ├── constraints/ # Управление ограничениями
│ │ ├── __init__.py
│ │ ├── base_constraint.py # Базовый класс ограничения
│ │ ├── hard_constraints.py # Жёсткие ограничения
│ │ ├── soft_constraints.py # Мягкие ограничения (предпочтения)
│ │ └── global_constraints.py # Глобальные ограничения
│ │
│ ├── exporters/ # Экспорт данных
│ │ ├── __init__.py
│ │ ├── base_exporter.py # Базовый класс экспортера
│ │ ├── csv_exporter.py
│ │ ├── excel_exporter.py
│ │ ├── html_exporter.py
│ │ └── json_exporter.py
│ │
│ ├── ui/ # Веб-интерфейс (опционально)
│ │ ├── __init__.py
│ │ ├── routes/ # Маршруты API
│ │ │ ├── __init__.py
│ │ │ ├── index.py # Главная страница
│ │ │ ├── config.py # Конфигурация API
│ │ │ └── export.py # Экспорт графики
│ │ ├── templates/ # Jinja2 шаблоны
│ │ └── static/ # CSS, JS
│ │
│ └── utils/ # Вспомогательные модули
│ ├── __init__.py
│ ├── calendar.py # Работа с календарями
│ ├── validators.py # Валидаторы данных
│ └── formatters.py # Форматтеры вывода
│
├── tests/ # Тесты
│ ├── __init__.py
│ ├── conftest.py # Фикстуры pytest
│ ├── unit/ # Unit-тесты
│ │ ├── __init__.py
│ │ ├── test_domains.py
│ │ ├── test_constraints.py
│ │ └── test_exporters.py
│ ├── integration/ # Интеграционные тесты
│ │ ├── __init__.py
│ │ └── test_scheduler.py
│ └── fixtures/ # Фикстуры данных
│ ├── __init__.py
│ ├── operators.json # JSON с операторами
│ └── shifts.json # JSON со сменами
│
├── docs/ # Документация
│ ├── README.md
│ ├── CHANGELOG.md # История изменений
│ ├── API.md # Документация API
│ └── architecture.md # Архитектурный обзор
│
├── config/ # Конфигурационные файлы
│ ├── __init__.py
│ ├── default.yaml # Стандартная конфигурация
│ └── development.yaml # Разработка
│
├── examples/ # Примеры использования
│ ├── basic.py # Базовый пример
│ ├── custom_constraints.py# Пример с кастомными ограничениями
│ └── multi_department.py # Многоотраслевой пример
│
├── requirements.txt # Зависимости Python
├── requirements-dev.txt # Зависимости для разработки
├── setup.py # Установка пакета
├── pytest.ini # Настройки pytest
└── .gitignore
🚀 Планы по улучшению проекта
📌 Общее описание плана
Данный план содержит улучшения для:
- Удобства использования — понятная документация
- Модульности — выделение логических блоков в функции
- Гибкости — поддержка разных форматов экспорта
- Тестируемости — возможность проверки результатов
📝 Задачи и планы по улучшению
✅ Улучшение 1: Более понятный README.md
🎯 Цель
Сделать документацию дружелюбной для новых разработчиков и пользователей
📋 Подзадачи
-
2.1.1 — Добавить описание проекта
- Краткий абзац о назначении
- Пример использования
-
2.1.2 — Структурировать условия задачи
- Сделать списки с маркерами
- Выделить типы ограничений (жёсткие/мягкие)
-
2.1.3 — Обновить секцию "Смены"
- Оформить таблицей с временем работы
- Добавить комментарии для каждого значения
-
2.1.4 — Структурировать предпочтения
- Сформировать таблицу с операторами и пожеланиями
- Объяснить типы предпочтений (обязательные/желательные)
-
2.1.5 — Добавить секцию "Как это работает"
- Краткое описание алгоритма
- Пример потока выполнения
-
2.1.6 — Добавить примеры конфигурации
- Пример добавления нового оператора
- Пример добавления новой смены
-
2.1.7 — Добавить секцию "Формат CSV"
- Объяснить структуру файла
- Пример содержимого
-
2.1.8 — Добавить секцию "Как запустить"
- Команды для запуска скрипта
- Требования (Python версии и библиотеки)
-
2.1.9 — Добавить секцию "Возможные расширения"
- Учёт усталости сотрудников
- Интеграция с календарными данными
- Поддержка разных форматов экспорта
-
2.1.10 — Добавить секцию "FAQ"
- Ответы на частые вопросы
- Что делать, если график не составляется
- Как обработать конфликт предпочтений
✅ Улучшение 2: Модульность ограничений
🎯 Цель
Упростить добавление новых операторов и ограничений
📋 Подзадачи
-
2.2.1 — Создать функцию
add_hard_constraints(operator_name)- Обрабатывать обязательные дни отдыха
- Обрабатывать обязательные дни работы
- Обрабатывать ограничения на непрерывную работу
-
2.2.2 — Создать функцию
add_soft_preferences(operator_name)- Обрабатывать предпочтения по сменам
- Обрабатывать предпочтения по дням
- Использовать
AddHint()для мягких условий
-
2.2.3 — Создать функцию
add_global_constraints(model)- Проверка покрытия всех смен
- Проверка количества выходных
- Проверка лимита дней подряд
-
2.2.4 — Создать функцию
create_operator_variables(model)- Генерация переменных для одного оператора
- Создание булевых переменных для всех смен
-
2.2.5 — Переписать
main.pyс использованием новых функций- Вынести цикл по операторам
- Вынести создание переменных
- Добавить тестовые операторы в конце
-
2.2.6 — Добавить докстринги
- Документирование всех функций
- Описание аргументов
- Возвращаемых значений
-
2.2.7 — Добавить проверки типов
- Проверка входных данных
- Валидация дат и смен
✅ Улучшение 3: Экспорт результатов
🎯 Цель
Поддержка различных форматов вывода
📋 Подзадачи
-
2.3.1 — Создать базовый класс
ScheduleExporter- Интерфейс для методов экспорта
- Конструктор с параметрами модели
-
2.3.2 — Реализовать экспорт в CSV
- Метод
export_to_csv(self, filename) - Форматирование заголовков
- Обработка пустых значений
- Метод
-
2.3.3 — Реализовать экспорт в Excel (.xlsx)
- Использование
pandas - Сохранение стилей (опционально)
- Использование
-
2.3.4 — Реализовать экспорт в HTML-таблицу
- Создание интерактивной таблицы
- Добавление календаря
- Подсветка выходных
-
2.3.5 — Добавить вывод в консоль (Pretty Print)
- Отформатированный вывод в терминал
- Цветовое кодирование (опционально)
-
2.3.6 — Создать класс
UIExporter(для будущих веб-интерфейсов)- Генерация JSON для frontend
- REST API endpoints (будущее)
-
2.3.7 — Добавить методы конфигурации
- Выбор формата по умолчанию
- Настройки кодировки
- Дополнительные столбцы (например, время смены)
-
2.3.8 — Обновить
main.pyс использованием экспортера- Вынести логику записи в
main.py - Создать экземпляр
ScheduleExporter - Вызвать нужный метод экспорта
- Вынести логику записи в
-
2.3.9 — Добавить тесты для экспортеров
- Проверка правильности CSV
- Проверка форматирования Excel
- Проверка HTML валидности
📅 Дорожная карта (Roadmap)
Этап 1: Фундамент (Неделя 1)
- Обновление README.md (подзадачи 2.1.*)
- Добавление докстрингов и комментариев в код
Этап 2: Модульность (Неделя 2)
- Создание функций ограничений (подзадачи 2.2.1–2.2.4)
- Переписывание
main.py - Тестирование модульных функций
Этап 3: Экспорт (Неделя 3)
- Разработка базового класса экспортера (2.3.1–2.3.5)
- Реализация Excel и HTML
- Интеграция в
main.py
Этап 4: Документация и тесты (Неделя 4)
- Написание примеров в README
- Создание секции FAQ
- Написание unit-тестов
- Проверка всех форматов экспорта
🛠️ Технические требования
- Python: 3.8+
- Библиотеки:
ortools(CP-SAT)pandas(для Excel)jinja2(для HTML)openpyxl(для стилей Excel)
📝 Примечание
Этот план можно выполнять итеративно. Можно начать с улучшения README.md, затем перейти к модульности, и в конце добавить новые форматы экспорта.
ИИ Промпт
Нужно назначить операторов на смены
Условия:
- апрель 2026 года. Месяц начинается со среды
- график нужен на каждый день этого месяца
- Операторов всего 6
- в каждой смене - должен быть один оператор
- У каждого оператора должно быть 10 выходных
- оператор не должен работать больше 5 дней подряд
- в день оператор может работать только одну смену
Смены(4 на каждый день): с 06:00 до 14:30 с 08:00 до 16:30 с 11:30 до 20:00 с 12:30 до 21:00
Список операторов и их пожелания:
- Оператор Иванов: Хочет отдыхать 10 апреля и 13 апреля
- Оператор Алексеев: Хочет работать по понедельникам в смену с 06:00 до 14:30
- Оператор Сидоров: Хочет отдыхать 25 апреля и 26 апреля
- Оператор Козобородов: предпочитает смену 11:30–20:00, но может работать в любую, если иначе график не составить.
- Оператор Трудяшкина: Хочет отдыхать 4 апреля
- Оператор Петрова: Хочет отдыхать 29 и 14 апреля
Задача: Составь конкретный ежедневный график (таблицей: день недели → смена → оператор), соблюдая:
- условия задачи
- на каждую смену должен быть назначен оператор
- выходные - это дни когда оператор вообще не работает
- пожелания обязательны к исполнению, если это не делает график невозможным
- дни отдыха входят в 10 выходных
Перед отправкой мне решения - проверь что все условия отрабатывают. Если у тебя есть какой-то вопрос или что-то непонятно - задай, я отвечу Ответ выдай в csv, в котором столбцы - день;1 смена;2 смена;3 смена;4 смена Если возможности подобрать такой график работ нет - то так и ответь