Какие примеры задач хорошо подходят для целочисленного линейного программирования?

Я всегда пишу программное обеспечение для решения бизнес-задач. Я наткнулся на липа, когда проходил через один из постов SO. Я погуглил его, но я не могу понять, как я могу использовать его для решения бизнес-проблем. Ценю, если кто-то может помочь мне понять в непрофессиональных терминах.

6 ответов


ILP можно использовать для решения по существу любой проблема, связанная с принятием множества решений, каждое из которых имеет только несколько возможных результатов, все известные заранее, и в которых общее "качество" любой комбинации вариантов может быть описано с помощью функции, которая не зависит от "взаимодействий" между вариантами. Чтобы увидеть, как это работает, проще всего ограничить в переменных могут быть только 0 или 1 (минимальный полезный диапазон целых чисел). Теперь:

  • каждое решение, требующее ответа "Да / нет", становится переменной
  • целевая функция должна описывать то, что мы хотим максимизировать (или минимизировать) как взвешенная комбинация этих переменных
  • вам нужно найти способ выразить каждое ограничение (сочетание вариантов, которые не могут быть сделаны одновременно), используя одно или несколько линейных ограничений равенства или неравенства

пример

например, предположим, что у вас есть 3 рабочих, Энн, Билл и Карл, и 3 работы, вытирая пыль, печатая и пакуя. Все люди могут выполнять любую работу, но каждый из них имеет разные уровни эффективности/способности на каждой работе, поэтому мы хотим найти лучшую задачу для каждого из них, чтобы максимизировать общую эффективность. Мы хотим, чтобы каждый человек выполнял ровно 1 задание.

переменные

один из способов настроить эту проблему - это 9 переменных, по одной для каждой комбинации работника и задания. Переменная x_ad получит значение 1, Если Anne должна пылиться в оптимальном решении, и 0 в противном случае; x_bp получит значение 1, если Билл должен упаковать в оптимальном решении, и 0 в противном случае; и так далее.

Целевая Функция

следующее, что нужно сделать, это сформулировать целевую функцию, которую мы хотим максимизировать или минимизировать. Предположим, что, основываясь на последних оценках производительности Энн, Билла и Карла, у нас есть таблица из 9 чисел, говорящая нам, сколько минут требуется каждому из них для выполнения каждый из 3 заданий. В этом случае имеет смысл взять сумму всех 9 переменных, каждая из которых умножена на время, необходимое конкретному работнику для выполнения конкретной работы, и попытаться минимизировать эту сумму, то есть свести к минимуму общее время, необходимое для выполнения всей работы.

ограничения

последний шаг - дать ограничения, которые заставляют (a) каждый делает ровно 1 работу и (b) каждая работа выполняется ровно 1 человеком. (Обратите внимание, что на самом деле эти шаги можно сделать в любом порядке.)

чтобы убедиться, что Энн выполняет ровно 1 задание, мы можем добавить ограничение, что x_ad + x_at + x_ap = 1. Аналогичные ограничения могут быть добавлены для Билла и Карла.

чтобы убедиться, что ровно 1 человек пыль, мы можем добавить ограничение, что x_ad + x_bd + x_cd = 1. Аналогичные ограничения могут быть добавлены для ввода и упаковки.

всего существует 6 ограничений. Теперь вы можете поставить эту 9-переменную, 6-ограничивающую проблему решателю ILP и он выплюнет обратно значения переменных в одном из оптимальных решений-ровно 3 из них будут 1, а остальные-0. 3, которые являются 1, говорят вам, какие люди должны делать какую работу!

ILP является общим

Как это происходит, эта проблема имеет специальные структуры это позволяет решать его более эффективно, используя другой алгоритм. Преимущество использования ILP заключается в том, что вариации проблемы могут быть легко incorporated: например, если бы на самом деле было 4 человека и только 3 рабочих места, нам нужно было бы ослабить ограничения, чтобы каждый человек делал максимум 1 задание, а не ровно 1 задание. Это может быть выражено просто путем изменения знака равенства в каждом из 1-го ограничения 3 в знак меньше или равно.


во-первых, читать пример линейного программирования из Википедии

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

Я использовал целочисленное линейное программирование раньше, чтобы определить как выложить N одинаково пропорциональных изображений, чтобы максимизировать пространство экрана, используемое для отображения этих изображений, и формализм может представлять такие проблемы, как планирование, но бизнес-приложения целочисленного линейного программирования кажутся более естественными приложениями.

Так говорит пользователь flolo: Используйте случаи, когда я часто встречал его: в цифровой схемотехнике у вас есть объекты для размещения/отображения на определенные части чипа (FPGA-размещение) - это можно сделать с помощью ILP. Также в HW-SW codesign часто возникает проблема раздела: какая часть программы все еще должна работать на CPU, а какая часть должна быть ускорена на оборудовании. Это также можно решить с помощью ILP.


пример проблемы ILP будет выглядеть примерно так:

  • увеличить 37∙x1 + 45∙x2

здесь

  • x1, x2,... должно быть положительные целые числа

...но, есть набор ограничения в форме

  • a1∙x1+b1∙x2
  • a2∙x1+b2∙x2
  • a3∙x1+b3∙x2
  • ...

теперь, более простая формулировка примера Википедии:

  • фермер L м2 земли для посадки с пшеницей или ячменем или их комбинацией.
  • фермер F грамма удобрений, и P граммов инсектицида.
  • каждый м2 пшеницы требует F1 грамма удобрений, и P1 грамм инсектицида
  • каждый м2 ячменя требует F2 грамма удобрений, и P2 граммов инсектицида

теперь

  • пусть a1 обозначим отпускную цену пшеницы за 1 м2
  • пусть a2 обозначим отпускную цену ячменя за 1 м2
  • пусть x1 обозначить область земля для посева пшеницы
  • пусть x2 обозначить площадь земли, которая будет засажена ячменем
  • x1, x2 являются целыми положительными числами (Предположим, мы можем посадить в разрешении 1 м2)

и

  • прибыль А1∙Х1 + А2∙Х2 - мы хотим увеличить его
  • потому что фермер имеет ограниченную площадь земли: x1+x2
  • потому что фермер имеет ограниченное количество минеральных удобрений: F1∙x1+F2∙x2
  • потому что фермер имеет ограниченное количество инсектицида: P1∙x1+P2∙x2

a1, a2, L, F1,F2,F,P1,P2, p - все константы (в нашем примере: положительный)

мы ищем положительные целые числа x1, x2 это максимизирует указанное выражение, учитывая указанные ограничения.

надеюсь, это понятно...


ILP "сам по себе" может непосредственно моделировать много вещей. Если вы ищете примеры LP, вы, вероятно, найдете много известных случаев учебника, таких как проблема диеты

данный набор таблеток, каждое с содержанием витамина и ежедневным витамином квота, найдите самый дешевый коктейль, который соответствует квоте.

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

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

заданный набор из N рабочих, N задач и N по N matirx, описывающий, как много каждый работник взимает за каждую задачу, определите, какую задачу дайте каждому работнику, чтобы минимизировать затраты.

большинство решений, которые естественно возникают, имеют экспоненциальную сложность, но есть полиномиальное решение, использующее линейное программирование.


когда дело доходит до ILP, ILP имеет дополнительное преимущество/трудность быть NP-полным. Это означает, что его можно использовать для моделирования очень широкого спектра задач (булева выполнимость также очень популярна в этом отношении). Поскольку существует много хороших и оптимизированных ILP-решателей, часто целесообразно перевести NP-полную проблему в ILP вместо разработки собственного алгоритма.


вы можете легко применять линейную программу везде, где хотите оптимизировать, и целевая функция линейна. Вы можете составлять графики (я имею в виду большие, как железнодорожные компании, которым нужно оптимизировать использование транспортных средств и путей), производства (оптимизировать выигрыш), почти все. Иногда сложно сформулировать вашу проблему как IP и / или иногда вы сталкиваетесь с проблемой, что ваше решение, что вы должны произвести, например, 0.345 автомобилей для оптимальной победы. Это, конечно, невозможно, и поэтому вы ограничиваете еще больше: ваша переменная для количества автомобилей должна быть целочисленной. Даже когда теперь это звучит проще (потому что у вас бесконечно меньше вариантов для вашей переменной), на самом деле это сложнее. В этот момент он становится NP-жестким. Что на самом деле означает, что вы можете решить любую проблему с Вашего компьютера с ILP, вам просто нужно ее преобразовать.

для вас я бы рекомендовал вступление в чтение некоторых базовых (I)LP-материалов. С моей точки зрения, я не знаю хорошего онлайн-сайта (но если вы goolge вы будете найти некоторые), как книгу я могу порекомендовать Линейное Программирование С Chvatal. Он имеет очень хорошие примеры, а также описывает реальные случаи использования.


другие ответы здесь есть отличные примеры. Два из золотых стандартов в бизнесе использования целочисленного программирования и более общих исследований операций -

  1. журнал "интерфейсы", издаваемый "ИНФОРМС" (Институт исследований операций и управленческих наук)
  2. лауреаты премии имени Франца Эдельмана за достижения в области исследований операций и управленческих наук

интерфейсы публикует исследование, которое использует operations research применяется к реальным проблемам, и премия Эдельмана является высококонкурентной наградой за использование методов исследования операций в бизнесе.