Целочисленная модель математического программирования

     Введение.                                

     При рассмотрении целого ряда задач финансового  менеджмента и бизнеса необходимо учитывать требование целочисленности  используемых переменных. Такие задачи называются задачами целочисленного программирования.          

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

     Особый  интерес к задачам ЦП вызван тем, что во многих практических задачах необходимо находить целочисленное решение ввиду дискретности ряда значений искомых переменных.

     Целочисленное программирование возникло в 50-60-е годы нашего века из нужд практики -  главным образом в работах американских математиков Дж.Данцига и Р.Гомори. Первоначально целочисленное программирование развивалось независимо от геометрии чисел на основе теории и методов математической оптимизации, прежде всего линейного программирования. Однако в последние время исследования в этом направлении все чаще проводятся средствами математики целых чисел.

     Задачи  такого типа весьма актуальны, так как  к их решению сводится анализ разнообразных ситуаций, возникающих в экономике, технике, военном деле и других областях. С появлением ЭВМ, ростом их производительности повысился интерес к задачам такого типа и к математике в целом. 
 
 

     1. Общие понятия целочисленного программирования.

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

     Целочисленное программирование ориентировано на решение задач математического программирования, в которых все или некоторые переменные должны принимать только целочисленные значения.

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

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

           Задачи и методы, относящиеся к перечисленному кругу вопросов, в литературе именуются по-разному. Наибольшее распространение получил термин «целочисленное программирование», однако встречаются и такие как «дискретное программирование», реже «комбинаторное программирование».

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

     Целочисленные задачи математического программирования могут возникать различными путями:

     1. Существуют задачи линейного программирования, которые формально к целочисленным не относятся, но при соответствующих исходных данных всегда обладают целочисленным планом. Примеры таких задач – транспортная задача и ее модификации (задачи о назначениях, о потоках в сетях).

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

     3. Другим важным толчком к построению теории целочисленного программирования стал новый подход к некоторым экстремальным комбинаторным  задачам. В них требуется найти экстремум целочисленной линейной функции, заданной на конечном множестве элементов. Такие задачи принято называть задачами с альтернативными переменными. В качестве примеров можно назвать задачи коммивояжера (бродячего торговца), об оптимальном назначении, теории расписания, или календарного планирования, и задачи с дополнительными логическими условиями (например, типа «или – или», «если – то» и т. п.). 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

     2. Методы решения задач целочисленного программирования

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

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

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

     Несостоятельность метода округления как общего метода решения задач целочисленного программирования обусловлена не только возможностью получения неоптимального решения. Дело заключается в том, что многие задачи математического программирования, не имеющие на первый взгляд никакого отношения к полностью или частично целочисленным задачам, могут быть сформулированы как задачи целочисленного программирования, в которых переменные модели принимают значения из множества {0, 1}. В этой ситуации процедура округления является логически неприемлемой.

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

     Комбинаторные методы широко используют для решения задач булева программирования, т.е. для решения полностью целочисленных задач, переменные которых принимают значения из множества {0, 1}. Эти переменные называют булевыми переменными. Свойства булевых переменных позволяют существенно упростить процедуры поиска оптимального решения.

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

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

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

     Элемент 3. В результате анализа решения  ослабленной задачи в зависимости  от специфики метода, как правило, принимается решение, относящееся  к задаче-истоку:

     а) исключить ее из рассмотрения;

     б) заменить одной порожденной задачей, выбранной по специальному правилу из определенной совокупности;

     в) заменить системой порожденных задач.

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

     Метод ветвей и границ

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

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

     Алгоритм  решения:

     Первоначально находим симплексным методом или методом искусственного базиса оптимальный план задачи без учета целочисленности переменных. Пусть им является план X0Если среди компонент этого плана нет дробных чисел, то тем самым найдено искомое решение данной задачи и Fmax = F(Xo).

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

     Предполагая, что найденный оптимальный план Xне удовлетворяет условию целочисленности переменных, тем самым считаем, что среди его компонент есть дробные числа. Пусть, например, переменная приняла в плане Xдробное значение. Тогда в оптимальном целочисленном плане ее значение будет, по крайней мере, либо меньше или равно ближайшему меньшему целому числулибо больше или равно ближайшему большему целому числу + 1. Определяя эти числа, находим симплексным методом решение двух задач линейного программирования:

     Найдем  решение задач линейного программирования (I) и (II). Очевидно, здесь возможен один из следующих четырех случаев:

     1. Одна из задач неразрешима,  а другая имеет целочисленный  оптимальный план. Тогда этот план и значение целевой функции на нем и дают решение исходной задачи.

     2. Одна из задач неразрешима,  а другая имеет оптимальный  план, среди компонент которого  есть дробные числа. Тогда рассматриваем  вторую задачу и в ее оптимальном  плане выбираем одну из компонент, значение которой равно дробному числу, и строим две задачи, аналогичные задачам (I) и (II).

     3. Обе задачи разрешимы. Одна  из задач имеет оптимальный  целочисленный план, а в оптимальном  плане другой задачи есть дробные  числа. Тогда вычисляем значения целевой функции на этих планах и сравниваем их между собой. Если на целочисленном оптимальном плане значение целевой функции больше или равно ее значению на плане, среди компонент которого есть дробные числа, то данный целочисленный план является оптимальным для исходной задачи и он вместе со значением целевой функции на нем дает искомое решение.

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

     4. Обе задачи разрешимы, и среди  оптимальных планов обеих задач  есть дробные числа. Тогда вычисляем  значение целевой функции на  данных оптимальных планах и  рассматриваем ту из задач, для которой значение целевой функции является наибольшим. В оптимальном плане этой задачи выбираем одну из компонент, значение которой является дробным числом, и строим две задачи, аналогичные (I) и (II).

     Таким образом, описанный выше итерационный процесс может быть представлен в виде некоторого дерева, на котором исходная вершина отвечает оптимальному плану Хзадачи (1)-(3), а каждая соединенная с ней ветвью вершина отвечает оптимальным планам задач (I) и (II). Каждая из этих вершин имеет свои ветвления. При этом на каждом шаге выбирается та вершина, для которой значение функции является наибольшим. Если на некотором шаге будет получен план, имеющий целочисленные компоненты, и значение функции на нем окажется больше или равно, чем значение функции в других возможных для ветвления вершинах, то данный план является оптимальным планом исходной задачи целочисленного программирования и значение целевой функции на нем является максимальным.

     Итак, процесс нахождения решения задачи целочисленного программирования (1)-(4) методом ветвей и границ включает следующие основные этапы:

     1. Находят решение задачи линейного  программирования (1)-(3).

     2. Составляют дополнительные ограничения  для одной из переменных, значение  которой в оптимальном плане  задачи (1)-(3) является дробным числом.

     3. Находят решение задач (I) и  (II), которые получаются из задачи (1)-(3) в результате присоединения  дополнительных ограничений.

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

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

     Метод Гомори

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

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

     Описываемая ниже версия алгоритма предназначена  для решения полностью целочисленных  задач, т.е. таких, у которых все  параметры aij, cj, b- целые.

     Описание  алгоритма.

     Приведем  обобщенную схему алгоритма Гомори. Структурно он делится на так называемые большие итерации. Каждая большая итерация содержит этапы:

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

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

     3. Построение для найденного компонента условия отсечения. Исходя из уравнения, в систему ограничений добавляем неравенство, в котором коэффициенты будут дробными частями коэффициентов данного уравнения.  Переводим к каноническому виду добавляя новую переменную xn+1.И соответственно добавляем в симплекс-таблицу новый базисный вектор по новой переменной xn+1.

     4. Переход на начало следующей  большой итерации.

     Замечание:

     При добавлении в симплекс-таблицу нового базисного вектора по новой переменной xn+1 мы получаем недопустимое (отрицательное) решение. Для того, чтобы избавиться от недопустимого решения выбираем столбец замещения так, чтобы строкой замещения стала новая добавленная строка по переменной xn+1Продолжаем пересчет симплекс-таблицы. Если снова получаем дробное решение, то еще вводим дополнительный базисный вектор, и так до получения целочисленного решения. Но следует заметить, что если область допустимых решений очень мала, то она может и не содержать целых значений, это необходимо проверить графически. Если область допустимых решений не содержит целочисленного решения, то в применении метода Гомори нет необходимости, целого решения не будет. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

     3. Пример решения  целочисленных задач.

     Задача.

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

       Диваны Кресла Столы Стулья       
Цены  на изделия, тыс.руб. 1 1 1 1 16
Расход  труда,

чел-час

6 6 4 3 110
З/п  работников 4 6 10 13 150
Прибыль от реализации продукции 60 70 120 130  
 

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

     Решение:

     Построение  экономико-математической модели:

     Пусть Х (х1…х4) – оптимальная производственная программа мебельного магазина, где:

     х1 – количество диванов;

     х2 – количество кресел;

     х3 – количество столов;

     х4 – количество стульев.

     Система ограничений:

      1*x1+1*x2+1*x3+1*x4 ≤ 16

     6*x1+5*x2+4*x3+3*x4 ≤ 110

     4*x1+6*x2+10*x3+13*x4 ≤ 150

     х1…х4≥ 0

     х1…х4 - целые

     Целевая функция:

     F (х1…х4) = 60*x1+70*x2+120*x3+130*x4 → max

     Ответ: Х (1;1;14;0); F = 1810

     MS Excel содержит модуль «Поиск решения»  позволяющий осуществлять поиск  оптимальных решений, в том  числе решение задач линейного, целочисленного, нелинейного и стохастического программирования.

     Рис.1.1. Модуль «Поиск решения» программы MS Excel

     Далее, переходим к решению. Выбираем в  меню «Сервис | Поиск решения». Открывается  диалоговое окно «Поиск решения». Здесь  указывается ячейки целевой функции, переменных и устанавливаются ограничения исходя из системы ограничений. Можно начать решение, или установить «параметры» решения.

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

     «Линейная модель» - служит для ускорения поиска решения линейной задачи оптимизации.

     По-умолчанию  выбран метод поиска «Ньютона», есть возможность выбрать «сопряженных градиентов».

     «Метод  Ньютона» - реализация квазиньютоновского метода, в котором запрашивается  больше памяти, но выполняется меньше итераций, чем в методе сопряженных градиентов.

     «Метод  сопряженных градиентов» - реализация метода сопряженных градиентов, в  котором запрашивается меньше памяти, но выполняется больше итераций, чем  в методе Ньютона. Данный метод следует использовать, если задача достаточно велика и необходимо экономить память, а также если итерации дают слишком малое отличие в последовательных приближениях.

     Причем  здесь нет возможности выбрать  ни графический симплекс-метод, ни симплекс-таблиц. Применение метода позволяющего найти целочисленное решение определяется лишь добавление условия на каждую переменную – «целое».

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

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

     Заключение

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

     Задачи  такого типа весьма актуальны, так как  к их решению сводится анализ разнообразных ситуаций, возникающих в экономике, технике, военном деле и других областях. Эти задачи интересны и с математической точки зрения. С появлением ЭВМ, ростом их производительности повысился интерес к задачам такого типа и к математике в целом. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

     Список  используемых источников:

     1. Конюховский П.В. Математические методы исследования операций в экономике. - СПб: Питер, 2007

     2. В.Г.Карманов. Математическое программирование: Учебное пособие, стереотип - М: ФИЗМАТ, 2009

     3. В.В. Федосеев, А.Н. Гармаш, Д.М. Дайитбегов.: Экономико-математические методы и прикладные модели, 2007

     4. http://www.math.mrsu.ru/

Целочисленная модель математического программирования