Оптимизация алгоритма на ortools python
30 000 руб. за проект
Алгоритм работает и подбирает смены не учитывая все условия и ограничения.
Ищем опытного специалиста который работал с 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: Является ключевым элементом для решения оптимизационных задач, позволяя эффективно находить оптимальные решения при соблюдении заданных ограничений.
Асинхронность: Весь процесс работы с данными и решения задачи реализован асинхронно, что позволяет эффективно использовать ресурсы и улучшить отзывчивость системы.
Обработка исключений: В коде предусмотрена обработка различных исключительных ситуаций, в том числе отсутствие необходимых данных или невозможность найти решение.
Ищем опытного специалиста который работал с 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: Является ключевым элементом для решения оптимизационных задач, позволяя эффективно находить оптимальные решения при соблюдении заданных ограничений.
Асинхронность: Весь процесс работы с данными и решения задачи реализован асинхронно, что позволяет эффективно использовать ресурсы и улучшить отзывчивость системы.
Обработка исключений: В коде предусмотрена обработка различных исключительных ситуаций, в том числе отсутствие необходимых данных или невозможность найти решение.
В заказе есть исполнитель
При переводе заказа из архивного в актуальный, текущий исполнитель будет снят с задачи.
Выберите тип сделки
С безопасной сделкой вы всегда сможете вернуть средства, если что-то пойдет не так. С простой сделкой вы самостоятельно договариваетесь с исполнителем об оплате и берете на себя решение конфликтов.