Начнем с простого примера демонстрирующего различия чисто статистического, чисто вероятностного и вероятностно-статистического подходов к выработке прогнозного решения. Одновременно на этом примере достаточно прозрачно видна роль математических моделей в технологии формирования прогнозного решения.
Статистический способ принятия решения. Пусть читатель представит себя бизнесменом, наблюдающим за игрой двух его приятелей-бизнесменов (А и В) в кости. Игра идет по следующим правилам. Производится четыре последовательных бросания игральной кости.
Игрок А получает одну денежную единицу от игрока В, если в результате этих четырех бросаний хотя бы один раз выпало шесть очков (назовем этот исход «шесть»), и платит одну денежную единицу игроку В в противном случае (назовем этот исход «не шесть»). После ста туров читатель должен сменить одного из игроков, причем он имеет право выбрать ситуацию, на которую он будет ставить свою денежную единицу в следующей серии туров: за появление хотя бы одной «шестерки» или против. Правильное осуществление этого выбора определяется, естественно, качеством его прогноза по поводу результата игры при ставке на исход «шесть»: если вероятность этого исхода правильно оценивается величиной, превосходящей половину, то игрок должен поставить именно на этот исход. Итак, задача наблюдателя – сделать достоверный прогноз.
Тихонов Н. А. — Основы математического моделирования — Типы математических моделей (Лекция 1)
Статистический способ решения этой задачи диктуется обычным здравым смыслом и заключается в следующем. Пронаблюдав сто туров игры предыдущих партнеров и подсчитав относительные частоты их выигрыша, казалось бы, естественно поставить на ту ситуацию, которая чаще возникала в процессе игры. Например, было зафиксировано, что в 52 партиях из 100 выиграл игрок В, т.е. в 52 турах из 100 «шестерка» не выпадала ни разу при четырехкратном выбрасывании кости (соответственно в остальных 48 партиях из ста осуществлялся исход «шесть»). Следовательно, делает вывод читатель, применивший статистический способ рассуждения, выгоднее ставить на исход «не шесть», т.е. на тот исход, относительная частота появления которого равна 0,52 (больше половины).
Теоретико-вероятностный способ решения. Этот способ основан на определенной математической модели изучаемого явления: полагая кость правильной (т. е. симметричной), а следовательно, принимая шансы выпадения любой грани кости при одном бросании равными между собой (другими словами, относительная частота, или вероятность, выпадения «единицы» равна относительной частоте выпадения «двойки», «тройки» и т. д. и равна 1/6), можно подсчитать вероятность P осуществления ситуации «не шесть», т. е. вероятность события, заключающегося в том, что при четырех последовательных бросаниях игральной кости ни разу не появится «шестерка».
Этот расчет основан на следующих фактах, вытекающих из принятых нами предпосылок модели. Вероятность не выбросить шестерку при одном бросании кости складывается из шансов появиться в результате одного бросания «единице», «двойке», «тройке», «четверке»и «пятерке» и, следовательно, составляет (в соответствии с определением вероятности любого события) величину 5/6. Затем используем правило умножения вероятностей, в соответствии с которым вероятность наступления нескольких независимых событий равна произведению вероятностей этих событий. В нашем случае мы рассматриваем факт наступления четырех независимых событий, каждое из которых заключается в невыпадении «шестерки» при одном бросании и имеет вероятность осуществления, равную 5/6. Поэтому
Три этапа математического моделирования.Задача о садовнике. Алгебра 7 класс
Как видно, вероятность ситуации «не шесть» оказалась меньше половины, следовательно, шансы ситуации «шесть» предпочтительнее (соответствующая вероятность равна: 1-0,482 = 0,518). А значит, читатель, использовавший теоретико-вероятностный способ рассуждения, придет к диаметрально противоположному по сравнению с читателем со статистическим образом мышления решению и будет ставить в игре на ситуацию «шесть».
Вероятностно-статистический (или математико-статистический) способ принятия решения. Этот способ как бы синтезирует инструментарий двух предыдущих, так как при выработке с его помощью окончательного вывода используются и накопленные в результате наблюдения за игрой исходные статистические данные (в виде относительных частот появления ситуаций «шесть» и «не шесть», которые, как мы помним, были равны соответственно 0,48 и 0,52), и теоретико-вероятностные модельные соображения.
Однако модель, принимаемая в данном случае, менее жестка, менее ограничена, она как бы настраивается на реальную действительность, используя для этого накопленную статистическую информацию. В частности, эта модель уже не постулирует правильность используемых костей, допуская, что центр тяжести игральной кости может быть и смещен некоторым особым образом. Характер этого смещения (если оно есть) должен как-то проявиться в тех исходных статистических данных, которыми мы располагаем. Однако читатель, владеющий вероятностно-статистическим образом мышления, должен отдавать себе отчет в том, что полученные из этих данных величины относительных частот исходов «шесть» и «не шесть» дают лишь некоторые приближенные оценки истинных (теоретических) шансов той и другой ситуации: ведь подбрасывая, скажем, 10 раз даже идеально симметричную монету, мы можем случайно получить семь выпадений «гербов»; соответственно относительная частота выпадения «герба», подсчитанная по этим результатам испытаний, будет равна 0,7; но это еще не значит, что истинные (теоретические) шансы (вероятности) появления «герба» и другой стороны монеты оцениваются величинами соответственно 0,7 и 0,3, – эти вероятности, как мы знаем, равны 0,5. Точно так же установленная нами в серии из ста игровых туров относительная частота исхода «не шесть» (равная 0,52) может отличаться от истинной (теоретической) вероятности того же события и, значит, может не быть достаточным основанием для выбора этой ситуации в игре!
Получается, что весь вопрос заключается в том, насколько сильно может отличаться наблюденная (в результате осуществления n испытаний) относительная частота интересующего нас события от истинной вероятности появления этого события, и как это отличие, т. е. погрешность , зависит от числа имеющихся в нашем распоряжении наблюдений (интуитивно ясно, что чем дольше мы наблюдали за игрой, т. е. чем больше общее число использованных нами наблюдений, тем больше доверия заслуживают вычисленные нами эмпирические относительные частоты , т. е. тем меньше их отличие от неизвестных нам истинных значений вероятностей ). Ответ на этот вопрос можно получить в нашем случае, если воспользоваться рядом дополнительных модельных соображений: а) предположить, что результат каждого тура никак не зависит от результатов предыдущих туров, а неизвестная нам вероятность осуществления ситуации «не шесть» остается одной и той же на протяжении всех туров игры; б) использовать тот факт, что поведение случайно меняющейся (при повторениях эксперимента) погрешности приближенно описывается законом нормального распределения вероятностей со средним значением, равным нулю, и дисперсией, равной (см. [1], п. 3.1.5).
Эти соображения, в частности, позволяют оценить абсолютную величину погрешности , заменяя неизвестную величину вероятности интересующего нас события (в нашем случае – исход «не шесть») относительной частотой этого события, зафиксированной в серии из испытаний (в нашем случае , а ). Если же мы смогли численно оценить абсолютную величину возможной погрешности , то естественно применить следующее правило принятия решения: если относительная частота появления исхода «не шесть» больше половины и продолжает превышать 0,5 после вычитания из нее возможной погрешности , то выгоднее ставить на «не шесть»; если относительная частота меньше половины и продолжает быть меньше 0,5 после прибавления к ней возможной погрешности , то выгоднее ставить на «шесть»; в других случаях у наблюдателя нет оснований для статистического вывода о преимуществах того или иного выбора ставки в игре (т. е. надо либо продолжить наблюдения, либо участвовать в игре с произвольным выбором ставки, ожидая, что это не может привести к сколько-нибудь ощутимому выигрышу или проигрышу).
Приближенный подсчет максимально возможной величины этой погрешности, опирающийся на модельное соображение б) (т. е. теорему Муавра-Лапласа, см. [1] и п. 4.3), дает в рассматриваемом примере, что с практической достоверностью, а именно с вероятностью 0,95, справедливо неравенство
Возведение этого неравенства в квадрат и решение получившегося квадратного неравенства относительно неизвестного параметра дает
или, с точностью до величин порядка малости выше, чем ,
В данном случае (при и ) получаем:
Таким образом, наблюдения за исходами ста партий дают нам основания лишь заключить, что интересующая нас неизвестная величина вероятности исхода «не шесть» на самом деле может быть любым числом из отрезка [0,42; 0,62], т. е. может быть как величиной, меньшей 0,5 (и тогда надо ставить в игре на ситуацию «шесть»), так и величиной, большей 0,5 (и тогда надо ставить в игре на ситуацию «не шесть»).
Иначе говоря, читатель, воспользовавшийся вероятностно-статистическим способом решения задачи и указанными выше модельными предпосылками, должен прийти к следующему «осторожному» выводу: ста партий в качестве исходного статистического материала оказалось недостаточно для вынесения надежного заключения о том, какой из исходов игры является более вероятным. Отсюда решение: либо продолжить роль «зрителя» до тех пор, пока область возможных значений для вероятности , полученная из оценок вида (4), не окажется целиком лежащей левее или правее 0,5, либо вступить в игру, оценивая ее как близкую к «безобидной», т. е. к такой, в которой в длинной серии туров практически останешься «при своих».
Приведенный пример иллюстрирует роль и назначение теоретико-вероятностных и математико-статистических методов, их взаимоотношения. Если теория вероятностей предоставляет исследователю набор математических моделей, предназначенных для описания закономерностей в поведении реальных явлений или систем, функционирование которых происходит под влиянием большого числа взаимодействующих случайных факторов, то средства математической статистики позволяют подбирать среди множества возможных теоретико-вероятностных моделей ту, которая в определенном смысле наилучшим образом соответствует имеющимся в распоряжении исследователя статистическим данным, характеризующим реальное поведение конкретной исследуемой системы.
Математическая модель. Математическая модель – это некоторая математическая конструкция, представляющая собой абстракцию реального мира: в модели интересующие исследователя отношения между реальными элементами заменены подходящими отношениями между элементами математической конструкции (математическими категориями). Эти отношения, как правило, представлены в форме уравнений и (или) неравенств между показателями (переменными), характеризующими функционирование моделируемой реальной системы. Искусство построения математической модели состоит в том, чтобы совместить как можно большую лаконичность в ее математическом описании с достаточной точностью модельного воспроизводства именно тех сторон анализируемой реальности, которые интересуют исследователя.
Выше, анализируя взаимоотношения чисто статистического, чисто теоретико-вероятностного и смешанного – вероятностно-статистического способа рассуждения, мы, в действительности, пользовались простейшими моделями, а именно:
статистической частотной моделью интересующего нас случайного события, заключающегося в том, что в результате четырех последовательных бросаний игральной кости ни разу не выпадет «шестерка»; оценив по предыстории относительную частоту этого события и приняв ее за вероятность появления этого события в будущем ряду испытаний, мы, тем самым, используем модель случайного эксперимента с известной вероятностью его исхода (см. [1] и п. 1.1.3);
теоретико-вероятностной моделью последовательности испытаний Бернулли (см. [1] и п. 3.1.1), которая никак не связана с использованием результатов наблюдений (т. е. со статистикой); для подсчета вероятности интересующего нас события достаточно принятия гипотетического допущения о том, что используемая игральная кость идеально симметрична. Тогда в соответствии с моделью серии независимых испытаний и справедливой, в рамках этой модели, теоремой умножения вероятностей подсчитывается интересующая нас вероятность по формуле ;
вероятностно-статистической моделью, интерпретирующей оцененную в чисто статистическом подходе относительную частоту как некую случайную величину (см. [1] и п. 2.1), поведение которой подчиняется правилам, определяемым так называемой теоремой Муавра–Лапласа; при построении этой модели были использованы как теоретико-вероятностные понятия и правила, так и статистические приемы, основанные на результатах наблюдений.
Обобщая этот пример, можно сказать, что:
вероятностная модель – это математическая модель, имитирующая механизм функционирования гипотетического (не конкретного) реального явления (или системы) стохастической природы; в нашем примере гипотетичность относилась к свойствам игральной кости: она должна была быть идеально симметричной;
вероятностно-статистическая модель – это вероятностная модель, значения отдельных характеристик (параметров) которой оцениваются по результатам наблюдений (исходным статистическим данным), характеризующим функционирование моделируемого конкретного (а не гипотетического) явления (или системы).
Вероятностно-статистическая модель, описывающая механизм функционирования экономической или социально-экономической системы, называется эконометрической.
Прогностические и управленческие модели в бизнесе. Вернемся к задачам статистического анализа механизма функционирования предприятия (фирмы) и связанным с ними прогнозами. Вновь рассматривая «фазовое пространство» этих задач, нетрудно описать общую логическую структуру необходимых для их решения моделей. Эта структура прямо следует из сформулированного выше определения стратегии бизнеса.
Для того чтобы формализовать (т. е. записать в терминах математической модели) задачи оптимального управления и построения прогноза в бизнесе, введем следующие обозначения:
– вектор-столбец результирующих показателей (объем продаж и т. п.);
– вектор-столбец «поведенческих» (управляемых) переменных (вложения в развитие основных фондов, в службы маркетинга и т. п.);
– вектор-столбец так называемых «статусных» переменных, т. е. показателей, характеризующих состояние фирмы (число работников, основные фонды, возраст фирмы и т. п.);
– вектор-столбец гео-социо-экономико-демографичес-ких характеристик внешней среды (показатели общей экономической ситуации, характеристики клиентов и поставщиков и т. п.);
– вектор-столбец случайных регрессионных остатков (подробнее о них ниже).
Тогда система уравнений, на базе которых может осуществляться оптимальное управление предприятием и выполнение необходимых прогнозных расчетов, в самом общем виде может быть представлена в форме:
где – некоторая векторнозначная ( -мерная) функция от , структура (значения параметров) которой, вообще говоря, зависит от того, на каких уровнях зафиксированы величины переменных «состояния» фирмы и «внешней среды» .
Тогда базовая проблема статистического анализа и прогнозирования в бизнесе состоит в построении наилучшей (в определенном смысле) оценки для неизвестной функции по имеющейся в распоряжении исследователя исходной статистической информации вида
где – значения соответственно поведенческих, «статусных», внешних и результирующих переменных, характеризующие -й такт времени (или измеренных на -м статистически обследованном предприятии), . Соответственно параметр (объем выборки) интерпретируется как общая длительность наблюдений за значениями анализируемых переменных на исследуемом предприятии, если наблюдения регистрировались во времени, и как общее число статистически обследованных однотипных предприятий, если наблюдения регистрировались в пространстве (т. е., переходя от одного предприятия к другому). При этом описание функции должно сопровождаться способом расчета гарантированных погрешностей аппроксимации (ошибок прогноза), т. е. таких векторных ( -мерных) значений и , которые для любых заданных значений и гарантировали бы выполнение неравенств (с вероятностью, не меньшей, чем , где – наперед заданная, достаточно близкая к единице положительная величина)
В (7) и (8) имеется в виду покомпонентное выполнение соответствующих векторно-значных неравенств.
Если базовая проблема статистического анализа и прогнозирования решена, то решения задач оптимального управления и прогноза могут быть описаны следующим образом.
Задача оптимального управления. Пусть – некоторое подмножество в фазовом подпространстве поведенческих переменных , с помощью которого определяются ресурсные и другие ограничения на возможные значения , т.е. . Тогда оптимальные значения поведенческих (управляемых) переменных определяются как решение оптимизационной задачи вида
где под понимаются минимальные или максимальные значения компонент функции (в зависимости от их содержательного смысла).
Задача прогнозирования результирующих показателей. Пусть – текущий момент времени (им заканчивается базовый, т.е. статистически обследованный интервал времени [1; n]). И пусть заданы (нормативные, спрогнозированные) значения и соответственно поведенческих (управляемых), «статусных» и переменных внешней среды для момента времени ( – горизонт прогнозирования, измеряется в целом числе принятых в исследовании временных тактов). Тогда общая структура прогноза значений результирующих показателей на временных тактов вперед имеет вид:
где величина приращения , как правило, достаточно мала по сравнению с и зависит от вероятностной природы регрессионных остатков в соотношении (5) (например, в рамках допущений, принятых в классической модели регрессии, величина тождественно равна нулю (см [1, гл. 15]).
Некоторые общие сведения о математическом инструментарии решения задач (9) и (10) см. ниже, в п. 4.
Источник: www.aup.ru
Примеры задач по экономико-математическим методам и моделям
Ищете готовые решения, чтобы разобраться в своей работе по ЭММ? Переходите в нужный раздел:
- Дерево решений (5 задач)
- Динамическое программирование (3 задачи)
- Межотраслевой баланс (5 задач)
- Сетевое планирование (7 задач)
- Системы массового обслуживания (3 задачи)
- Теория игр (7 задач)
- Теория принятия решений (12 задач)
- Управление запасами (7 задач)
- Задачи оптимизации в Excel
Может быть интересно:
- Решенные контрольные по ЭММ
- Примеры задач ЭМММ в Excel
- Учебники, видео, лекции по МММЭ
- Примеры решений по ЛП
- Решения задачи коммивояжера
- Сдаем тесты по ЭММ
Закажите решение задач по ЭМММ в МатБюро
- Заказать работу
- Услуги и предметы
- Онлайн-помощь
- Сдача тестов
- Отзывы клиентов
- Цены и оплата
- О заказе и гарантиях
- Оформление работ
- Вопросы и ответы
- Примеры решений задач
- Онлайн решение задач
- Программы-решатели
- Учебники и видеоуроки
- Статьи о математике
- Полезные сайты
- Формулы и справочники
- Онлайн учебник
- Примеры решений
- Онлайн калькуляторы
- Формулы и таблицы
- Статьи по ТВ
- Учебники и ссылки
МатБюро поможет
Вы также можете:
Оптимальный выбор
МатБюро помогает студентам с 2006 года. Всё это время мы поддерживаем прекрасную репутацию и наилучшие условия «цена-качество».
Мы предлагаем:
Грамотную и подробную консультацию и решение за разумную стоимость.
- Количество Более 96000
выполненных
заказов - Цены Разумные и
обоснованные
цены - Опыт Помогаем студентам
в решении задач
уже 16 лет - Кредо Качество,
ответственность
и уважение - И еще Мы рады
выполнить
ваш заказ
Источник: www.matburo.ru
Математическая оптимизация и моделирование в PuLP: задача о назначениях
Приветствую! Я, Ложкинс Алексей, консультант и разработчик оптимизационных решений и математических моделей для бизнеса. Это первая в цикле работ обучающая статья, часть личного образовательного проекта «Make optimization simple». Цель проекта – продемонстрировать доступность технологий и показать на примерах, что моделировать можно без глубокого математического фундамента.
Из статьи вы узнаете об основных компонентах математической оптимизационной задачи на примере классической задачи о назначениях, в частности, распределение машин такси на заказы. Далее, я покажу, как реализовать программный прототип математической модели посредством Python и библиотеки PuLP, а также продемонстрирую, как получить оптимальное решение задачи всего в одной строке кода без реализации специальных алгоритмов.
Материал статьи предназначен
- для базового погружения в математическое моделирование и оптимизацию;
- для демонстрации доступности технологий и возможностей моделировать, решать оптимизационные задачи без порога входа и специальной подготовки (мат./тех. образования).
Математическая оптимизация
Математическая оптимизация — это мощный метод, используемый для поиска наилучшего решения задачи, отвечающего определенным критериям и удовлетворяющего набору ограничений. Она включает в себя четыре основных компонента:
- Целевая функция — это математическое выражение, объект оптимизации. В зависимости от целей оптимизации выделяют два критерия: задача максимизации и задача минимизации целевой функции;
- Ограничения — это условия, которые должны быть выполнены для того, чтобы решение было осуществимым. Они ограничивают возможные значения переменных и обычно выражаются в виде неравенств или равенств;
- Решающие переменные — это неизвестные величины, которые мы хотим определить в результате решения оптимизационной задачи. Они используются для формулирования целевой функции и ограничений. Моделируют различные варианты выбора или действий, которые могут быть предприняты для достижения желаемого результата;
- Метод оптимизации — это алгоритмы, используемые для нахождения оптимального решения задачи. Мы сконцентрируем наше внимание на задачах смешанного линейного программирования (MILP), для которых существуют стандартные методы их решения. Кроме того, есть упакованные программные пакеты с этими методами, что повышает доступность мат. моделирования.
Комбинация этих четырех компонентов — это то, что составляет задачу математической оптимизации. Тщательно сформулировав целевую функцию, переменные для принятия решения и ограничения, а также выбрав подходящий метод оптимизации, мы можем найти наилучшее решение для широкого спектра реальных проблем.
Постановка задачи
Рассмотрим типичную питерскую ситуацию в пятницу вечером. Иван, Михаил и Александр запланировали пойти в бар. Одновременно заказывают такси от своего дома до бара, используя один и тот же агрегатор такси одинакового класса (например, комфорт). Рядом оказываются свободными ровно три машины с разной удаленностью от потенциальных пассажиров. Кроме этого, действуют следующие вполне реалистичные условия: пассажир может ехать только на одной машине, одна машина может взять не более одного заказа (пассажира).
Задача: назначить клиентам машины таким образом, чтобы все клиенты добрались до бара на такси, каждая машина перевезла не более одного пассажира и общие затраты на перевозку пассажиров были минимальны.
Построение модели
Чтобы решить поставленную выше задачу, мы будем использовать линейное программирование. Оно представляет собой математических методов, используемых для оптимизации линейной целевой функции с учетом линейных ограничений. Линейное программирование имеет множество реальных применений, включая планирование производства, оптимизацию транспортировки и распределение ресурсов.
Построение программного прототипа линейной модели будем реализовывать посредством программного пакета PuLP, который предоставляет среду для инициализации самой математической модели и позволяет подключать сторонние пакеты (коммерческие или open source) для решения оптимизационных задач. Чтобы использовать PuLP для решения задачи с назначениями, нам сначала нужно будет установить библиотеку. Вы можете установить PuLP с помощью pip:
pip install pulp
Индексы и входные данные
Введем следующие обозначения:
C — список клиентов: Иван, Александр и Михаил;
T — список такси: желтое, зеленое, синее;
c ∈ C — индекс и множество клиентов, клиент c содержится во множестве C;
t ∈ T — индекс и множество такси, машина t содержится во множестве T.
Запишем эти множества в виде списков Python:
# Инициализируем множества клиентов и множество такси. Используем англоязычные названия C = [«Ivan», «Aleksander», «Mikhail»] # имена клиентов T = [«yellow», «green», «blue»] # цвета машин
Целевая функция рассматриваемой задачи — минимизация затрат. Разберемся в структуре затрат.
Общие затраты = постоянные затраты + переменные затраты.
Под постоянными затратами будем понимать затраты на перевозку пассажира от его местоположения до бара. Они не зависят от того, какая из трех машин будет выполнять заказ (уровень сервиса одинаковый). В свою очередь, переменные затраты — это затраты на подачу машины клиенту.
В зависимости от клиента эти затраты могут отличаться: разное расстояние и разное прогнозное время в пути до клиента. Постоянные затраты не влияют на целевую функцию, т.к. они не зависят от назначения, поэтому будем рассматривать только переменные затраты. Ниже представлена матрица переменных затрат.
Для каждой комбинации клиента c (строка) и машины t (столбец) сопоставлены затраты ect в рублях. Воспользуемся словарем в Python для инициализации матрицы затрат, где по ключу (c, t) получим размер переменных затрат назначения.
# Матрица переменных затрат E =
Инициализация модели
Импортируем библиотеку PuLP:
import pulp
Прежде чем создавать переменные и ограничения, необходимо инициализировать класс модели. В дальнейшем ограничения и целевая функция будут определяться в привязке к модели. В качестве аргументов передаем название модели «TaxiAssignmentProblem» и класс оптимизационной задачи, в нашем случае — минимизация затрат: pulp.LpMinimize . Модель может содержать только одну оптимизационную задачу.
# Инициализация модели model = pulp.LpProblem(«TaxiAssignmentProblem», pulp.LpMinimize)
Инициализация переменных
Модель инициализирована, теперь можем начать запись нашей модели. Сначала определим набор решающих переменных. Нам нужно выяснить, какую машину назначить какому клиенту.
Определим для каждой возможной связки клиент-машина переменную, которая может принимать значение 1, если выбрана связка назначений, 0 — в противном случае. Таким образом, у нас есть 9 переменных для принятия решения.
Например: если переменная для связки Aleksander-green равна 1, следовательно, Александр поедет на зеленой машине. Если значение переменной равно 0, то Александр не поедет на зеленой машине.
Добавление переменных в модель pulp возможно через метод LpVariable , где в качестве аргументов передаем название переменной, нижнюю и верхнюю границы принимаемых значений (0 и 1 в нашем случае), тип переменной (в нашем случае — бинарная).
Комментарий: для переменных, которые могут принимать значения 0 или 1, в pulp выделен отдельный тип — бинарные переменные.
Переменные запишем в словарь, аналогичный словарю E . Назовем переменные xct, где c ∈ C — клиент, а t ∈ T — машина.
# Инициализация переменных X = <> # Словарь для хранения ссылок на переменные for (client, car) in E: var_name = «x_» + client + «_» + car # Название переменной X[client, car] = pulp.LpVariable(var_name, cat=pulp.LpBinary) # Эквивалентный способ задания переменных через целочисленный тип # X[client, car] = pulp.LpVariable(var_name, lowBound=0, upBound=1, cat=»Integer») # Задание переменных без цикла # X = pulp.LpVariable.dicts(«x», E.keys(), 0, 1, pulp.LpBinary)
Целевая функция
Целевая функция состоит в том, чтобы минимизировать переменные затраты. Для каждой переменной xct мы ставим в соответствие размер затрат ect, на который возрастут общие затраты, если xct = 1. Например, если желтая машина будет назначена Ивану xIvan,yellow = 1, то затраты вырастут на eIvan,yellow = 15 рублей. Это условие можно записать как произведение затрат на переменную: ect xct.
Суммируем все возможные произведения ect xct, получим функцию общих затрат. В принятых нами обозначениях она будет иметь следующий вид:
В более лаконичной форме с помощью символа суммы ∑ целевую функцию можно записать как
Метод LpProblem.setObjective() добавляет целевую функцию в модель. В качестве аргументов передается сама целевая функция и «направленность» оптимизации (минимизация / максимизация). Для нашей задачи определим целевую функцию следующим образом:
# Построение целевой функции # 1. Список произведений затрат на соответствующую переменную lst_mult = [E[key] * var for key, var in X.items()] # 2. Суммируем произведения obj_expression = pulp.lpSum(lst_mult) # Встроенный в pulp метод # obj_expression = sum(lst_mult) # Python сумма # 3. Добавляем в модель model.setObjective(obj_expression) # Альтернативный способ инициализации целевой функции # model += obj_expression
Ограничения
В нашей задаче два основных ограничения:
- Все клиенты должны попасть в бар;
- Одна машина не может перевозить более одного пассажира.
Оба этих ограничения можно записать в математическом виде и передать в модель. Для этого воспользуемся ранее введенными переменными.
Ограничение 1: Все клиенты должны попасть в бар
Рассмотрим клиента Ивана. В бар он должен попасть на одной из трех машин: желтой, зеленой или синей. С каждым вариантом назначения машины Ивану связана бинарная переменная: xIvan,yellow, xIvan,green и xIvan,blue. Условие можно переформулировать как: ровно одна машина должна быть назначена Ивану.
В случае Александра и Михаила строим аналогичные ограничения, но с учетом соответствующих им переменных:
Введенные ограничения можно записать в более лаконичной форме с использованием символа суммы ∑ и символа повторения для каждого элемента множества ∀ («Для любого. »).
Добавление ограничений в PuLP незамысловатое, используется сочетание символов += :
model += expression, expression_name
Ограничению можно привязать название или оставить поле пустым. Само выражение для нашего ограничения состоит из операции сложения переменных, тип ограничения == , а значение правой части ограничения 1 .
# Ограничение: Все клиенты должны попасть в бар (Client Satisfaction Constraint) for c in C: # Создаем ограничение для каждого клиента # Название ограничения constr_name = f»_sat_constr» # Список возможных машин для клиента lst_vars = [X[c, t] for t in T] # Добавление ограничений в модель model += pulp.lpSum(lst_vars) == 1, constr_name
Ограничение 2: Одна машина не может перевозить более одного пассажира.
Рассмотрим желтую машину. Она может взять Ивана, Александра, Михаила или никого. С каждым вариантом назначения желтой машины клиенту у нас связана бинарная переменная: xIvan,yellow, xAleksander,yellow и xMikhail,yellow. Ограничение запишется в следующем виде:
Заметим, что данное ограничение позволяет всем переменным присвоить значений 0, что будет означать отсутствие назначений на желтую машину.
Для остальных машин имеем аналогичные ограничения:
Эти ограничения можно записать в более короткой форме с учетом ранее введенных обозначений:
Процесс добавления ограничений «назначение машины не более чем на одного пассажира» не отличается от добавления в модель PuLP предыдущего ограничения:
# Ограничение: Одна машина не может перевозить более одного пассажира (Taxi Passengers Limitation Constraint) for t in T: # Создаем ограничение для каждой машины # Название ограничения constr_name = f»_tpl_constr» # Список возможных клиентов для машины t lst_vars = [X[c, t] for c in C] # Добавление ограничений в модель model += pulp.lpSum(lst_vars)
Поиск оптимального решения
Прежде чем переходить к решению оптимизационной задачи, посмотрим на полную математическую модель нашей задачи. Существует достаточно распространённый формат записи задач Линейного программирования в формат .lp, удобный для чтения пользователем. В PuLP для сохранения модели в формате .lp есть метод LpProblem.writeLP() , где в качестве аргументов передается название файла:
# Запись модели в файл model.writeLP(«TaxiAssignmentProblem.lp»)
Файл можно открыть обычным блокнотом. Здесь можно увидеть целевую функцию, ограничения с привязкой к их названию и типы переменных.
* TaxiAssignmentProblem * Minimize OBJ: 12 x_Aleksander_blue + 21 x_Aleksander_green + 9 x_Aleksander_yellow + 21 x_Ivan_blue + 24 x_Ivan_green + 15 x_Ivan_yellow + 15 x_Mikhail_blue + 12 x_Mikhail_green + 18 x_Mikhail_yellow Subject To Aleksander_sat_constr: x_Aleksander_blue + x_Aleksander_green + x_Aleksander_yellow = 1 Ivan_sat_constr: x_Ivan_blue + x_Ivan_green + x_Ivan_yellow = 1 Mikhail_sat_constr: x_Mikhail_blue + x_Mikhail_green + x_Mikhail_yellow = 1 blue_tpl_constr: x_Aleksander_blue + x_Ivan_blue + x_Mikhail_blue
Поиск оптимального решения в PuLP запускается с помощью метода LpProblem.solve() :
# Поиск оптимального решения задачи model.solve() # Проверяем статус модели print(pulp.LpStatus[model.status])
Теперь давайте извлечем оптимальное значение целевой функции, используя метод PuLP value(LpProblem.objective) и оптимальные значения переменных LpVariable.varValue .
# Значение целевой функции после решения задачи obj_value = pulp.value(model.objective) obj_value = int(obj_value) # Преобразование в целочисленное значение print(f»Минимальные переменные затраты для выполнения всех заказов = руб.») # Извлечение значений переменных for (client, taxi), var in X.items(): var_value = var.varValue # Извлечение значения переменной var_value = int(var_value) # Преобразование в целочисленное значение if var_value > 0: # Выводим оптимальные назначения машин клиентам print(f»- Клиенту назначена машина , затраты на подачу = руб.»)
Минимальные переменные затраты для выполнения всех заказов = 39 руб.
- Клиенту Ivan назначена машина yellow, затраты на подачу = 15 руб.
- Клиенту Aleksander назначена машина blue, затраты на подачу = 12 руб.
- Клиенту Mikhail назначена машина green, затраты на подачу = 12 руб.
Предлагаю самостоятельно с помощью ручного перебора убедиться в том, что более оптимального решения при указанных ограничениях не получить.
Расширение задачи
Рассмотренная выше задача максимально упрощена для простого погружения в проблематику математического моделирования и возможностей решения задач оптимизации.
С целью закрепления материала предлагаю рассмотреть и попробовать добавить следующие ограничения:
- Добавить четвертую машину в модель (например, «red»);
- Добавить время ожидания в исходные данные для каждого назначения. Добавить в модель ограничение лимита ожидания для каждого клиента (сколько по времени клиент готов ждать);
- Добавить параметр выручки за выполнение заказа. Скорректировать целевую функцию и изменить ограничение обязательного выполнения заказа на неравенство (Ограничение 1: Все клиенты должны попасть в бар);
- Добавление нескольких клиентов в модель.
Ссылки
- Ссылка на Jupyter Notebook здесь;
- Документация Python библиотеки PuLP;
- Примеры мат.моделей для решения некоторых задач;
- Задача: Белки, Жиры и Углеводы — оптимизируем рацион питания;
- Задача коммивояжёра с использованием разных пакетов (в том числе PuLP);
- В основе структуры статьи лежит материал от сюда;
P.S. Направляйте оптимизационные задачи, которые хотелось бы увидеть в разборе.
P.S.S. Есть на примете статьи с моделями в PuLP или ORtools? Присылайте, дополню статью ссылками.
- задача о назначениях
- задача оптимизации
- математическое моделирование
- исследование операций
- принятие решений
- целочисленное программирование
- линейное программирование
- Математика
- Читальный зал
Источник: habr.com