![]() |
![]() |
![]() |
|||||
![]() |
Линейное программирование. Практика решения задач оптимизации на Python |
||||||
МЕНЮ Искусственный интеллект Поиск Регистрация на сайте Помощь проекту ТЕМЫ Новости ИИ Искусственный интеллект Разработка ИИГолосовой помощник Городские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Нейронные сети начинающим Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Техническое зрение Чат-боты Авторизация |
2020-11-27 21:31 ![]() Данная публикация представляет собой сокращенный перевод руководства Мирко Стожилковича Hands-On Linear Programming: Optimization With Python. Для удобства читателей текст перевода также адаптирован в виде Jupyter-блокнота. *** Линейное программирование– это набор методов, используемых в математическом программировании, также называемых математической оптимизацией. Эти методы используются для решения систем линейных уравнений и неравенств, перед которыми стоит цель максимизации или минимизации некоторой линейной функции. Линейное программирование используется в научных вычислениях, экономике, технических науках, производстве, транспорте, военном деле, логистике, энергетике и т. д. Экосистема Python включает несколько мощных инструментов линейного программирования. Из этого руководства вы узнаете:
Что собой представляет линейное программирование Системы линейных уравнений и неравенств часто имеют множество возможных решений. Линейное программирование – это набор математических и вычислительных инструментов, позволяющих найти конкретное решение системы, которое соответствует максимуму или минимуму какой-либо другой линейной функции. Линейное программирование – это фундаментальный метод оптимизации, десятилетиями применяемый в областях, требующих большого объема математических вычислений. Эти методы точны, сравнительно быстры и подходят длямножества практических приложений. Смешанно-целочисленное линейное программирование– это вид линейного программирования, которое фокусируется на обработке задач, где хотя бы одна переменная принимаетдискретные целые, а не непрерывно меняющиеся значения. Целочисленные переменные важны для правильного представления количеств, естественным образом выражаемых целыми числами, таких как число выпущенных самолетов или количество обслуженных клиентов. Особенно важным видом целочисленных переменных являются бинарные переменные, имеющие лишь значения Смешанно-целочисленное линейное программирование позволяет преодолеть многие ограничения линейного программирования. Можно аппроксимировать нелинейные функции кусочно-линейными, использовать полунепрерывные переменные, логические ограничения модели. Это требовательный к ресурсам инструмент, но достижения в области компьютерного оборудования и программного обеспечения сделали его более доступным. Линейное программирование на Python Базовый метод решения задач линейного программирования называется симплекс-методом, другой популярный подход –метод внутренней точки. Задачи смешанного целочисленного линейного программирования решаются с помощью более сложных и ресурсоемких методов, таких как метод ветвей и границ. Заметим, что почти все широко используемые библиотеки линейного программирования и смешанно-целочисленного линейного программирования написаны на языках Fortran, C или C++, так как линейное программирование требует интенсивной вычислительной работы с матрицами, часто очень большими. Соответствующие инструменты Python – это просто удобные интерфейсы для работы с низкоуровневыми библиотеками – солверами. В этом руководстве для определения и решения задач линейного программирования мы будем использовать Python-библиотеки SciPy и PuLP. 1. Примеры задач линейного программирования 1.1. Небольшой показательный пример Рассмотрим следующую задачу максимизации: ![]() Нам нужно найти такие Независимые переменные, которые нужно найти ( Проблему можно визуализировать следующим образом. ![]() 2x + y = 20 , а красная область над ней показывает, где красное неравенство не выполняется. Аналогично синяя линия – это ?4x + 5y = 10 , желтая линия – это?x + 2y = ?2 , окрашенные области – та часть плоскости, где неравенство не выполняется.Каждая точка серой области удовлетворяет всем ограничениям и является потенциальным решением задачи. Эта область называетсяобластью допустимых решений(feasible region), а ее точки – допустимыми решениями (feasible solutions). Мы хотим максимизировать Обратите внимание, что функция Представим, что в задачу введено дополнительное ограничение в виде равенства, окрашенного зеленым: ![]() Его можно визуализировать, добавив соответствующую зеленую прямую: ![]() Теперь область допустимых решений не соответствует всей серой зоне. Это лишь часть зеленой линии, проходящей через серую область от точки пересечения с синей линией до точки пересечения с красной. Если добавить требование, что все значения ![]() Больше нет зеленой линии – только дискретные точки, где значение Эти три примера иллюстрируют задачи линейного программирования – они имеют ограниченные допустимые области решений и конечные решения. Когда ни одно решение не может удовлетворить все ограничения сразу, задача в рамках линейного программирования неразрешима. 1.2. Задача о распределении ресурсов В предыдущих разделах мы рассмотрели абстрактную задачу линейного программирования, не связанную с каким-либо реальным приложением. В этом разделе речь пойдет о более практической задачи оптимизации, связанной с распределением ресурсов на производстве. Предположим, что фабрика производит четыре различных продукта, ежедневное количество первого продукта составляет
Математическую модель можно определить так: ![]() Целевая функция (прибыль) определяется в условии 1. Ограничение рабочей силы следует из условия 2. Ограничения на сырье A и B могут быть получены из условий 3 и 4 путем суммирования потребностей в сырье для каждого продукта. Наконец, количество продуктов не может быть отрицательным. В отличие от предыдущего примера, эту задачу не так удобно визуализировать, потому как она имеет четыре переменных. Однако принципы остаются теми же. 2. Линейное программирование на Python. Практическая реализация В этом руководстве мы будем использовать для решения описанной выше задачи линейного программирования два пакета Python :
2.1. Установка SciPy и PuLP Чтобы следовать этому руководству, вам необходимо установить SciPy и PuLP. Возможно, вам потребуется запустить Примечание переводчика При желании вы можете таже использовать в качестве солвера GLPK. Это бесплатный солвер с открытым исходным кодом, который работает в Windows, MacOS и Linux. О том, как с ним работать в PuLP рассказано в оригинальной публикации. В переводе мы ограничимся доступным по умолчанию солвером CBC. 2.2. Использование SciPy В этом разделе мы рассмотрим, как использовать библиотеку SciPyпо оптимизации и поиску корнейдля линейного программирования. Начнём с импорта 2.3. Решение первого примера c помощью SciPy Начнём с решения первого (дополненного) примера: ![]()
![]() На следующем шаге определяем входные значения: Мы поместили значения из системы в соответствующие списки:
Примечание Будьте осторожны с порядком строк и столбцов! Порядок строк для левой и правой сторон ограничений должен быть одинаковым. Каждая строка представляет одно ограничение. Порядок коэффициентов целевой функции и левых частей ограничений должен совпадать. Каждый столбец соответствует одной переменной решения. Следующим шагом является определение границ каждой переменной. В данном случае они находятся между нулем и положительной бесконечностью: Однако эти границы совпадают с установленными по умолчанию в Наконец, пришло время оптимизировать и решить интересующую нас проблему: Параметр Параметр
Доступ к атрибутам можно получить по отдельности: Графически результат можно отобразить следующим образом. ![]() Вначале наша задача органичивалась только неравенствами. Если удалить параметры зеленого уравнения ![]() 2.4. Решение задачи о производстве с помощью SciPy Рассмотрим теперь решение второй задачи – о продуктах, рабочей силе и используемом сырье. ![]() Как и в предыдущем примере, нам нужно извлечь необходимые векторы и матрицу из задачи, передать их в качестве аргументов в Максимальная прибыль составляет
Возможности линейного программирования SciPy полезны в основном для небольших задач. Для более крупных и сложных проблем разумно использовать другие библиотеки:
2.5. Решение первой задачи на линейное программирование с помощью PuLP Итак, PuLP имеет более удобный API линейного программирования, чем SciPy. Начнем с импорта. Первый шаг – инициализировать экземпляр Параметр Создав модель, мы можем определить переменные решения как экземпляры класса Значения границ по умолчанию – отрицательная и положительная бесконечности, поэтому в нашем случае необходимо указать нижнюю границу ( Необязательный параметр Переменные Построив линейную комбинацию нескольких переменных решения, мы получаем экземпляр Опишем теперь ограничения. В отличие от SciPy, с PuLP не нужно создавать списки и матрицы. Просто записываем выражения Python и добавляем в модель с помощью оператора
Аналогично описывается целевая функция: Теперь можно посмотреть полное определение модели: Строковое представление модели содержит все соответствующие данные: цель, переменные, ограничения и их имена. Теперь мы готовы решить задачу. Достаточно лишь вызвать метод Метод Результаты оптимизации доступны в виде атрибутов модели:
Результаты получились примерно такие же, как у SciPy. Чтобы получить смешанно-целочисленное решение, достаточно обозначить это при помощи параметра Теперь ![]() Как видите, оптимальным решением является крайняя правая зеленая точка на сером фоне. Это решение с наибольшими значениями как 2.6. Решение задачи о производстве с помощью PuLP Подход к определению и решению второй задачи такой же, как и в предыдущем примере: Как видите, решение согласуется с тем, что мы молучили с помощью SciPy. Наиболее выгодное решение – производить в день 5 единиц первого продукта и 45 единиц третьего. Давайте сделаем задачу более интересной. Допустим, из-за проблем с оборудованием, фабрика не может производить первую и третью продукцию параллельно. Какое решение наиболее выгодно в этом случае? Теперь у нас есть еще одно логическое ограничение: если При таких условиях оказывается, что оптимальный подход – исключить первый продукт вовсе и производить только третий. Заключение Теперь вы в общих чертах представляете, с какими задачами имеет дело линейное программирование и как использовать Python для решения подобных задач. Теперь – после прохождения этого руководства – вы умеете:
Если вы хотите узнать больше о линейном программировании, вот несколько отправных точек, с которых можно начать:
Следите за нашими тегами Python и Математика! Источники Источник: proglib.io Комментарии: |
||||||