Оптимизация алгоритма на ortools python

30 000 руб. за проект
16 февраля 2024, 08:40 • 10 откликов • 67 просмотров
Алгоритм работает и подбирает смены не учитывая все условия и ограничения.
Ищем опытного специалиста который работал с ortools python. И пониманием решения задач линейного програмирования.

Как сейчас работает:

Шаг 1: Получение данных операторов
Запрос к базе данных для получения списка операторов, относящихся к определённой группе (например, "Дежурный по выдаче справок"). Это делается в функции get_operators, которая асинхронно извлекает данные из PostgreSQL.



Шаг 2: Извлечение операционных данных
Извлечение данных из Redis с использованием функции stage3_get_operating_data. Здесь асинхронно получаются два набора данных: операционные данные из предыдущего этапа и предварительно обработанные данные для текущего этапа расписания.



Шаг 3: Подготовка данных к решению
Фильтрация и подготовка расписаний
Фильтрация расписаний: В функции stage3_solver, из списка расписаний выбираются только те, у которых максимальное значение по ключу schedule_hours_binary больше нуля. Это означает, что расписание считается активным только если имеется хотя бы один час работы.
Распределение по датам: Создается словарь schedule_by_dates, где ключом является дата, а значением - список расписаний на эту дату. Это позволяет группировать расписания по датам для удобства последующей обработки.



Подготовка данных для модели решения
Сериализация смен: Для каждой даты и каждой смены в эту дату создается объект RosteringWithName, который затем используется для создания модели оптимизации. Если смена требует нескольких операторов, для нее создается соответствующее количество копий объекта.

Шаг 4: Построение и решение оптимизационной модели

Создание модели оптимизации с использованием OR-Tools
Определение переменных: Для каждой возможной смены и каждого оператора создается булева переменная в модели OR-Tools, представляющая, будет ли оператор работать в эту смену.
Установка ограничений:
Устанавливаются ограничения на максимальное количество смен, которые может взять оператор, учитывая его отпуска и выходные.

Для каждой даты и смены устанавливаются ограничения, чтобы оператор не работал больше, чем одна смена в день, и чтобы все смены были покрыты.

Настройка целевой функции
Минимизация или максимизация параметров: Например, модель может стремиться минимизировать общее количество рабочих часов, превышающих норму, или максимизировать соблюдение предпочтений операторов относительно смен.

Решение модели
Использование солвера: С помощью солвера OR-Tools модель решается. Солвер ищет решение, удовлетворяющее всем ограничениям и оптимизирующее целевую функцию.

Шаг 5: Обработка результатов
Анализ результатов решения
Проверка статуса решения: После выполнения солвера проверяется, найдено ли решение (допустимое решение).
Формирование итогового расписания:
В случае успеха, для каждого оператора формируется список смен, которые ему назначены, исходя из решения солвера.

Данные о назначенных сменах добавляются в итоговый ответ.
Обработка неудачи:

Если решение не найдено (статус INFEASIBLE), генерируется исключение HTTPException с сообщением о невозможности найти решение при текущих ограничениях.

Шаг 6: Итеративная настройка и оптимизация

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

Обработка исключений

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


Логика работы как должно быть:

Получение Данных

Получение списка операторов: Функция get_operators() асинхронно извлекает из базы данных информацию о группе операторов, отвечающих за выдачу справок. Если группа не найдена, выбрасывается исключение HTTPException.

Получение операционных данных: В функции stage3_get_operating_data() асинхронно извлекаются данные из Redis, необходимые для третьего этапа планирования. Это включает в себя информацию о расписании и предварительно подготовленные данные для этапа 3.

Подготовка к Решению

Фильтрация расписаний: В stage3_solver() происходит фильтрация расписаний по определенному критерию (присутствие активных часов в расписании), подготовка данных по датам и создание задачи оптимизации.

Подготовка модели для решения: В solve_schedules() происходит формирование задачи оптимизации. Для каждого оператора и смены создаются переменные, представляющие возможные назначения смен.

Оптимизация

Настройка ограничений и целей модели:

Устанавливаются ограничения на количество смен для операторов, включая отпуска и выходные.

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

Устанавливаются ограничения на минимальный и максимальный объем рабочих часов для операторов, чтобы обеспечить сбалансированное распределение рабочего времени.

Решение модели: С использованием решателя из OR-Tools модель оптимизации решается, и на основе полученного решения формируется итоговое расписание.

Обработка Результатов

Анализ и представление результатов: После решения задачи производится анализ полученных данных. Если модель не смогла найти решение (статус INFEASIBLE), выбрасывается исключение с соответствующим сообщением. В противном случае формируется итоговый ответ, включающий расписание для каждого оператора.

Особенности

Использование OR-Tools: Является ключевым элементом для решения оптимизационных задач, позволяя эффективно находить оптимальные решения при соблюдении заданных ограничений.
Асинхронность: Весь процесс работы с данными и решения задачи реализован асинхронно, что позволяет эффективно использовать ресурсы и улучшить отзывчивость системы.
Обработка исключений: В коде предусмотрена обработка различных исключительных ситуаций, в том числе отсутствие необходимых данных или невозможность найти решение.