Некоторые экономические задачи целочисленного программирования
Постановка задачи целочисленного программирования. Несостоятельность метода округления. Метод ветвей и границ. Сущность метода отсечений Гомори. Основные этапы итерации алгоритма Гомори. Сущность циклического алгоритма целочисленного программирования.
Рубрика | Экономико-математическое моделирование |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 21.12.2010 |
Размер файла | 597,6 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Сыктывкарский Государственный Университет
Курсовая работа
По теме: «Некоторые экономические задачи целочисленного программирования»
Сыктывкар 2010г.
План
Введение
1. Целочисленное программирование. Общие понятия
1.1 Постановка задачи целочисленного программирования
2. Методы решения задач целочисленного программирования
2.1 Метод ветвей и границ
2.2 Метод Гомори
2.3 Циклический алгоритм целочисленного программирования
2.4 Полностью целочисленный алгоритм
Заключение
Список используемой литературы
Ведение
При рассмотрении целого ряда задач финансового менеджмента и бизнеса необходимо учитывать требование целочисленности используемых переменных. Такие задачи называются задачами целочисленного программирования.
Под задачей целочисленного программирования (ЦП) понимается задача, в которой все или некоторые переменные должны принимать целые значения. В том случае, когда ограничения и целевая функция задачи представляют собой линейные зависимости, задачу называют целочисленной задачей линейного программирования. В противном случае, когда хотя бы одна зависимость будет нелинейной, это будет целочисленной задачей нелинейного программирования. Особый интерес к задачам ЦП вызван тем, что во многих практических задачах необходимо находить целочисленное решение ввиду дискретности ряда значений искомых переменных.
Целочисленное программирование возникло в 50-60-е годы нашего века из нужд практики - главным образом в работах американских математиков Дж. Данцига и Р. Гомори. Первоначально целочисленное программирование развивалось независимо от геометрии чисел на основе теории и методов математической оптимизации, прежде всего линейного программирования. Однако, в последние время исследования в этом направлении все чаще проводятся средствами математики целых чисел.
Задачи такого типа весьма актуальны, так как к их решению сводится анализ разнообразных ситуаций, возникающих в экономике, технике, военном деле и других областях. С появлением ЭВМ, ростом их производительности повысился интерес к задачам такого типа и к математике в целом.
1. Целочисленное программирование. Общие понятия
Целочисленное линейное программирование (сокращенно ЦЛП) занимается задачами линейного программирования с целочисленными переменными, общая задача формулируется следующим образом: найти тах{сх|Ах ? b; х - целочисленный}. ЦЛП может рассматриваться так же, как поиск точки решетки, принадлежащей многограннику или как решение системы линейных уравнений с целыми неотрицательными переменными. Иными словами, в ЦЛП рассматриваются совместные ограничения - не отрицательность и целочисленность.
Целочисленным (иногда его называют также дискретным) программированием называется раздел математического программирования, изучающий экстремальные задачи, в которых на искомые переменные накладывается условие целочисленности, а область допустимых решений конечна. Огромное количество экономических задач носит дискретный, чаще всего целочисленный характер, что связано, как правило, с физической неделимостью многих элементов расчета: например, нельзя построить два с половиной завода, купить полтора автомобиля и т.д. В ряде случаев такие задачи решаются обычными методами, например, симплексным методом, с последующим округлением до целых чисел. Однако такой подход оправдан, когда отдельная единица составляет очень малую часть всего объема (например, товарных запасов); в противном случае он может внести значительные искажения в действительно оптимальное решение. Поэтому разработаны специальные методы решения целочисленных задач.
В математической модели задачи целочисленного программирования как целевая функция, так и функции в системе ограничений могут быть линейными, нелинейными и смешанными.
Метод ветвей и границ можно применять для решения задач нелинейного программирования.
Постановка задачи целочисленного программирования По смыслу значительной части экономических задач, относятся к задачам линейного программирования, компоненты решения должны выражаться в целых числах, т.е. быть целочисленными. К ним относятся, например, задачи, в которых переменные означают количество единиц неделимой продукции, число станков при загрузке оборудования, число судов при распределениях по линиям, число турбин в энергосистеме, число вычислительных машин в управляющем комплексе и многие другие
1.1 Постановка задачи целочисленного программирования
По смыслу значительной части экономических задач, относятся к задачам линейного программирования, компоненты решения должны выражаться в целых числах, т.е. быть целочисленными. К ним относятся, например, задачи, в которых переменные означают количество единиц неделимой продукции, число станков при загрузке оборудования, число судов при распределениях по линиям, число турбин в энергосистеме, число вычислительных машин в управляющем комплексе и многие другие.
Задача линейного целочисленного программирования формируется следующим образом: найти такое решение (план) X = (x1,x2,...,xn), при котором линейная функция
(1)
принимает максимальное или минимальное значение при ограничениях
=bi, i=1, 2…, m. (2)
хj 0, j=1, 2,..., п. (3)
xj - целые числа (4)
2. Методы решения задач целочисленного программирования
На первый взгляд наиболее естественным методом решения задач целочисленного программирования является метод округления, реализация которого состоит из двух этапов. На первом этапе находят оптимальное решение задачи линейного программирования с ослабленными ограничениями, соответствующей рассматриваемой задаче целочисленного программирования. На втором этапе значения переменных в оптимальном решении X*, не являющиеся целыми, округляют так, чтобы получить допустимое решение X** с целочисленными значениями.
Соблазнительность использования метода округления понятна, особенно если погрешность округления невелика по сравнению со значениями округляемых переменных. Однако практическая реализация метода округления может привести к допустимому решению, значимо отличающемуся от оптимального решения исходной задачи целочисленного программирования.
Несостоятельность метода округления как общего метода решения задач целочисленного программирования обусловлена не только возможностью получения неоптимального решения. Дело заключается в том, что многие задачи математического программирования, не имеющие на первый взгляд никакого отношения к полностью или частично целочисленным задачам, могут быть сформулированы как задачи целочисленного программирования, в которых переменные модели принимают значения из множества {0, 1}. В этой ситуации процедура округления является логически неприемлемой.
Для иллюстрации основной идеи методов решения задач целочисленного программирования, известных как методы отсечений, рассмотрим полностью целочисленную задачу, множество допустимых решений которой изображено на рисунке 1. Допустимым решениям этой задачи соответствуют не все точки множества G допустимых решений, а лишь те, координаты которых удовлетворяют требованию целочисленности. Теоретически из множества G всегда можно выделить такое подмножество G*, что (см. рис. 1):
а) оно содержит все точки множества G, координаты которых удовлетворяют требованию целочисленности;
б) оно является выпуклым множеством;
в) координаты всех его крайних точек удовлетворяют требованию целочисленности.
Рис. 1
Если в рассматриваемой полностью целочисленной задаче множество G допустимых решений заменить множеством G*, то это не может привести к изменению ее оптимального решения, так как G* получено из G путем отсечения от него подмножества, заведомо не содержащего допустимых решений, удовлетворяющих требованию целочисленности. Но в этом случае оптимальное решение задачи линейного программирования с ослабленными ограничениями и множеством G* допустимых решений соответствует крайней точке множества G*. Как следствие, оно удовлетворяет требованию целочисленности и обеспечивает экстремальное значение целевой функции не только на G*, но и на G, т.е. является оптимальным решением исходной полностью целочисленной задачи. Основные различия в методах отсечений связаны с процедурами выделения подмножества G* множества допустимых решений задачи целочисленного программирования.
В основе комбинаторных методов решения задач целочисленного программирования лежит идея перебора всех элементов G множества допустимых решений, удовлетворяющих требованию целочисленности, с целью нахождения оптимального решения. При этом за счет использования различных специальных процедур, как правило, непосредственно рассматривают лишь часть элементов G, удовлетворяющих требованию целочисленности, а оставшиеся элементы учитывают некоторым косвенным образом.
Наиболее известным комбинаторным методом является метод ветвей и границ, использующий процедуру решения задачи линейного программирования с ослабленными ограничениями, соответствующей исходной задаче целочисленного программирования. Если оптимальное решение X* задачи линейного программирования с ослабленными ограничениями не удовлетворяет требованию целочисленности (на рисунке 2 этому решению соответствует точка В), то из множества G допустимых решений выделяют два непересекающихся выпуклых подмножества К1 и К2, содержащих все допустимые решения из G, удовлетворяющих требованию целочисленности и не содержащих X* (см. рис. 2). Это позволяет заменить рассматриваемую задачу целочисленного программирования совокупностью двух эквивалентных ей задач с множествами допустимых решений К1 и К2 соответственно, так как или .
Рис. 2
Комбинаторные методы широко используют для решения задач булева программирования, т.е. для решения полностью целочисленных задач, переменные которых принимают значения из множества {0, 1}. Эти переменные называют булевыми переменными. Свойства булевых переменных позволяют существенно упростить процедуры поиска оптимального решения.
К настоящему времени разработано значительное количество частных методов решения конкретных типов задач целочисленного программирования. Тем не менее, почти все эти методы и их модификации можно описать на основе единой принципиальной схемы, состоящей из трех элементов.
Элемент 1. Предусматривается процедура формирования и решения последовательности взаимосвязанных задач, которые называют задачами, порожденными исходной задачей, или задачами-истоками. При этом оптимальное решение по крайней мере одной из задач-истоков должно совпадать с оптимальным решением породившей их задачи.
Элемент 2. Каждой задаче, порожденной исходной задачей, ставится в соответствие так называемая ослабленная задача (задача с ослабленными ограничениями), оптимальное решение которой может быть найдено с гораздо меньшими затратами, чем оптимальное решение соответствующей ей задачи-истока. Специфика ослабленной задачи чаще всего заключается в том, что ее система ограничений является менее жесткой по сравнению с системой ограничений задачи-истока и определяет множество допустимых решений, содержащее все допустимые решения задачи-истока. Как правило, в целочисленном программировании ослабленная задача представляет собой задачу линейного программирования с ограничениями, более слабыми, чем в соответствующей целочисленной задаче-истоке. Очевидно, что если ослабленная задача не имеет допустимых решений, то их не имеет и задача-исток. В некоторых модификациях методов целочисленного программирования целевая функция ослабленной задачи также может отличаться от целевой функции задачи-истока. В этом случае оптимальное значение целевой функции ослабленной задачи (т.е. значение, соответствующее оптимальному решению) должно быть не меньше оптимального значения целевой функции задачи-истока, если речь идет о задаче максимизации. Кроме того, оптимальное значение целевой функции ослабленной задачи определяет (для задачи максимизации) верхнюю границу для оптимального значения целевой функции задачи-истока.
Элемент 3. В результате анализа решения ослабленной задачи в зависимости от специфики метода, как правило, принимается решение, относящееся к задаче-истоку:
а) исключить ее из рассмотрения;
б) заменить одной порожденной задачей, выбранной по специальному правилу из определенной совокупности;
в) заменить системой порожденных задач.
Следует отметить, что существуют и другие подходы к решению задач целочисленного программирования, которые в общем случае не гарантируют нахождения оптимального решения, но приводят к допустимому решению, близкому (в смысле значения целевой функции) к оптимальному, а иногда и совпадающему с ним. В основе одного из таких подходов лежит идея использования случайной выборки допустимых решений с последующим улучшением (в смысле значения целевой функции) каждого из них, когда возможность улучшения допустимого решения достаточно просто обнаружить.
В моей курсовой мы с вами рассмотрим такие методы как : метод ветвей и границ, метод Гомори, циклический алгоритм целочисленного программирования, полностью целочисленный алгоритм.
2.1 Метод ветвей и границ
Метод ветвей и границ - один из комбинаторных методов. Его суть заключается в упорядоченном переборе вариантов и рассмотрении лишь тех из них, которые оказываются по определенным признакам перспективными, и отбрасывании бесперспективных вариантов.
Метод ветвей и границ состоит в следующем: множество допустимых решений (планов) некоторым способом разбивается на подмножества, каждое из которых этим же способом снова разбивается на подмножества. Процесс продолжается до тех пор, пока не получено оптимальное целочисленное решение исходной задачи.
Алгоритм решения:
Первоначально находим симплексным методом или методом искусственного базиса оптимальный план задачи без учета целочисленности переменных. Пусть им является план X0. Если среди компонент этого плана нет дробных чисел, то тем самым найдено искомое решение данной задачи и Fmax = F(Xo).
Если же среди компонент плана X0 имеются дробные числа, то X0 не удовлетворяет условию целочисленности и необходимо осуществить упорядоченный переход к новым планам, пока не будет найдено решение задачи. Покажем, как это можно сделать, предварительно отметив, что F(X0) F(X) для всякого последующего плана X.
Предполагая, что найденный оптимальный план X0 не удовлетворяет условию целочисленности переменных, тем самым считаем, что среди его компонент есть дробные числа. Пусть, например, переменная приняла в плане X0 дробное значение. Тогда в оптимальном целочисленном плане ее значение будет по крайней мере либо меньше или равно ближайшему меньшему целому числу, либо больше или равно ближайшему большему целому числу + 1. Определяя эти числа, находим симплексным методом решение двух задач линейного программирования:
Найдем решение задач линейного программирования (I) и (II). Очевидно, здесь возможен один из следующих четырех случаев:
1. Одна из задач неразрешима, а другая имеет целочисленный оптимальный план. Тогда этот план и значение целевой функции на нем и дают решение исходной задачи.
2. Одна из задач неразрешима, а другая имеет оптимальный план, среди компонент которого есть дробные числа. Тогда рассматриваем вторую задачу и в ее оптимальном плане выбираем одну из компонент, значение которой равно дробному числу, и строим две задачи, аналогичные задачам (I) и (II).
3. Обе задачи разрешимы. Одна из задач имеет оптимальный целочисленный план, а в оптимальном плане другой задачи есть дробные числа. Тогда вычисляем значения целевой функции на этих планах и сравниваем их между собой. Если на целочисленном оптимальном плане значение целевой функции больше или равно ее значению на плане, среди компонент которого есть дробные числа, то данный целочисленный план является оптимальным для исходной задачи и он вместе со значением целевой функции на нем дает искомое решение.
Если же значение целевой функции больше на плане, среди компонент которого есть дробные числа, то следует взять одно из таких чисел и для задачи, план которой рассматривается, необходимо построить две задачи, аналогичные (I) и (II).
4. Обе задачи разрешимы, и среди оптимальных планов обеих задач есть дробные числа. Тогда вычисляем значение целевой функции на данных оптимальных планах и рассматриваем ту из задач, для которой значение целевой функции является наибольшим. В оптимальном плане этой задачи выбираем одну из компонент, значение которой является дробным числом, и строим две задачи, аналогичные (I) и (II).
Таким образом, описанный выше итерационный процесс может быть представлен в виде некоторого дерева, на котором исходная вершина отвечает оптимальному плану Х0 задачи (1)-(3), а каждая соединенная с ней ветвью вершина отвечает оптимальным планам задач (I) и (II). Каждая из этих вершин имеет свои ветвления. При этом на каждом шаге выбирается та вершина, для которой значение функции является наибольшим. Если на некотором шаге будет получен план, имеющий целочисленные компоненты, и значение функции на нем окажется больше или равно, чем значение функции в других возможных для ветвления вершинах, то данный план является оптимальным планом исходной задачи целочисленного программирования и значение целевой функции на нем является максимальным.
Итак, процесс нахождения решения задачи целочисленного программирования (1)-(4) методом ветвей и границ включает следующие основные этапы:
1. Находят решение задачи линейного программирования (1)-(3).
2. Составляют дополнительные ограничения для одной из переменных, значение которой в оптимальном плане задачи (1)-(3) является дробным числом.
3. Находят решение задач (I) и (II), которые получаются из задачи (1)-(3) в результате присоединения дополнительных ограничений.
4. В случае необходимости составляют дополнительные ограничения для переменной, значение которой является дробным, формулируют задачи, аналогичные задачам (I) и (II), и находят их решение. Итерационный процесс продолжают до тех пор, пока не будет найдена вершина, соответствующая целочисленному плану задачи (1)-(3) и такая, что значение функции в этой вершине больше или равно значению функции в других возможных для ветвления вершинах.
Описанный выше метод ветвей и границ имеет более простую логическую схему расчетов, чем метод Гомори. Поэтому в большинстве случаев для нахождения решения конкретных задач целочисленного программирования с использованием ЭВМ применяется именно этот метод.
Проиллюстрируем метод ветвей и границ на примере.
Решить задачу
Z = Зх1 + х2 max
при ограничениях:
4xl + Зх2 < 18,
x1 + 2x2 6,
0 x1 5,
0 x2 4,
х1, x2 - целые числа.
Решение. За нижнюю границу линейной функции примем, например, ее значение в точке (0,0), т.е. Z0 = Z (0; 0) = 0.
I этап. Решая задачу симплексным методом, получим Zmax = 13 при Х1*= = (4,5; 0; 0; 1,5; 0,5; 4); так как первая компонента х1* дробная, то из области решения исключается полоса, содержащая дробное оптимальное значение х1*, т.е. 4 < х1 < 5. Поэтому задача 1 разбивается на две задачи 2 и 3:
Задача 2 Задача 3
Z=3x1+x2>max Z=3x1+x2>max
при ограничениях: при ограничениях:
4xl + Зх2 < 18 4x1+3x2<18
x1 + 2x2 6 x1 + 2x2 6
0 x1 4 5 x1 5
0 x2 4 0 x2 4
х1, x2 - целые числа. х1, x2 - целые числа.
Список задач: 2 и 3. Нижняя граница линейной функции не изменилась: Z0=0.
II этап. Решаем (по выбору) одну из задач списка, например задачу 3 симплексным методом.
Получим, что условия задачи 3 противоречивы.
III этап. Решаем задачу 2 симплексным методом. Получим Zmax =14/3 при X3*= (4; 2/3; 0; 2/3; 0; 10/3). Хотя Z(X3*) = 14/3 > Z0 = 0, по-прежнему сохраняется Z0 = 0, ибо план нецелочисленный. Так как х2* - дробное число, из области решений исключаем полосу 0 < x2 < 1 и задачу 2 разбиваем на две задачи 4 и 5.
Задача 4 Задача 5
Z=3x1+x2>max Z=3x1+x2>max
при ограничениях: при ограничениях:
4xl + Зх2 < 18 4xl + Зх2 < 18
x1 + 2x2 6 x1 + 2x2 6
0 x1 4 0 x1 4
0 x2 0 1 x2 4
х1, x2 - целые числа. х1, x2 - целые числа.
Список задач: 4 и 5. Значение Z0 = 0.
IV этап. Решаем задачу 4 симплексным методом.
Получим Zmax = 12 при X4* = (4; 0; 2; 2; 0; 0). Задачу исключаем из списка, но при этом меняем Z0; Z0 = Z(X4*) = 12, ибо план Х4* целочисленный.
V этап. Решаем задачу 5 симплексным методом.
Получим Zmax = 12,25 при X5* = (3,75; 1; 0; 0,25; 0,25; 0; 3). Z 0 не меняется, т.е. Z0 = 12, ибо план X5* нецелочисленный. Так как х1* - дробное, из области решений исключаем полосу 3<x1<4, и задача 5 разбивается на две задачи: 6 и 7.
Задача 6 Задача 7
Z=3x1+x2>max Z=3x1+x2>max
при ограничениях: при ограничениях:
4xl + Зх2 < 18 4xl + Зх2 < 18
x1 + 2x2 6 x1 + 2x2 6
0 x1 3 4 x1 4
1 x2 4 1 x2 4
х1, x2 - целые числа. х1, x2 - целые числа.
Список задач: 6 и 7. Значение Z0 = 12.
VI этап. Решаем одну из задач списка, например задачу 7, симплексным методом.
Получим, что условия задачи 7 противоречивы (рис. 3).
VII этап. Решаем задачу 6 симплексным методом.
Получим Zmax = 10,5,при X6* = (3; 1,5; 1,5; 0; 0; 0,5; 2,5). Так как Z(X6*) = =10,5 < Z0 = 12, то задача исключается из списка.
Итак, список задач исчерпан и оптимальным целочисленным решением исходной задачи будет X* = Х4* = (4; 0; 2; 2; 0; 0), а оптимум линейной функции Zmax = 12.
Рис. 3
Замечание 1. Нетрудно видеть, что каждая последующая задача, составляемая в процессе применения метода ветвей и границ, отличается от предыдущей лишь одним неравенством - ограничением. Поэтому при решении каждой последующей задачи нет смысла решать ее симплексным методом с самого начала (с I шага). А целесообразнее начать решение с последнего шага (итерации) предыдущей задачи, из системы ограничений которой исключить "старые" (одно или два) уравнения - ограничения и ввести в эту систему "новые" уравнения - ограничения.
2.2 Метод Гомори
C помощью отсечений выделяют целочисленные части полиэдров. Метод отсечений был разработан в конце 1950-х годов Гомори для решения целочисленных линейных программ с помощью симплекс-метода. Метод отсечений оказался полезным и с теоретической точки зрения он дает возможность описать целочисленную оболочку полиэдра.
Далее описывается метод отсечений Гомори, дающий алгоритм решения задач целочисленного линейного программирования. Данный метод, который также носит название метода отсекающих плоскостей, предназначен для решения ЦЗЛП (целочисленной задачи линейного программирования) в канонической форме. Описываемая ниже версия алгоритма предназначена для решения полностью целочисленных задач, т.е. таких, у которых все параметры aij, cj, bi - целые.
Описание алгоритма.
Приведем обобщенную схему алгоритма Гомори. Структурно он делится на так называемые большие итерации. Каждая большая итерация содержит этапы:
1. Сначала задача решается методами линейного программирования (малые итерации), обычно симплекс-методом, и анализируется результат, если результатом являются целые числа, то на этом решение заканчивается, а если дробные, то производят следующие операции:
2. В оптимальном плане (симплекс-таблице) выбирают строку, в которой целая часть дробного(!) свободного члена (P0) принимает наибольшее значение.
3. Построение для найденной компоненты условия отсечения. Исходя из уравнения по данной строке xr=P0r - ar,1*x1 - … - ar,n*xn в систему ограничений добавляем неравенство, в котором коэффициенты будут дробными частями коэффициентов данного уравнения: {P0r}-{ ar,1}*x1 -… -{ ar,n}*xn ?0. Переводим к каноническому виду добавляя новую переменную xn+1, получим: {P0r}-{ ar,1}*x1 -… -{ar,n}*xn+xn+1 =0 И соответственно добавляем в симплекс-таблицу новый базисный вектор по новой переменной xn+1.
4. Переход на начало следующей большой итерации.
Замечание:
При добавлении в симплекс-таблицу нового базисного вектора по новой переменной xn+1 мы получаем недопустимое (отрицательное) решение. Для того, чтобы избавиться от недопустимого решения выбираем столбец замещения так, чтобы строкой замещения стала новая добавленная строка по переменной xn+1. Продолжаем пересчет симплекс-таблицы. Если снова получаем дробное решение, то еще вводим дополнительный базисный вектор, и так до получения целочисленного решения. Но следует заметить, что если область допустимых решений очень мала, то она может и не содержать целых значений, это необходимо проверить графически. Если область допустимых решений не содержит целочисленного решения, то в применении метода Гомори нет необходимости, целого решения не будет.
Решить задачу.
Zmin=6*x1 +x2;
при ограничениях:
3*x1 - x2>=92*x1+3*x2=<50- x1+4*x2>=18
x1,x2>=0; x1,x2: целые числа
Математическая модель задачи:
Целевая функция:
S min = 6*x1+1*x2
при ограничениях:3*x1-1*x2>=92*x1+3*x2<=50 -1*x1+4*x2>=18
x1,x2 >=0; - условие не отрицательности переменных.
Решение задачи с использованием метода симплекс-таблиц.
Математическая модель задачи:
Целевая функция: S min = 6*x1+1*x2
при ограничениях: 3*x1-1*x2>=9 2*x1+3*x2<=50 -1*x1+4*x2>=18
x1,x2, >=0; - условие неотрицательности переменных.
Система неравенств приведена к каноническому виду:
Целевая функция: S min = 6*x1+1*x2+0*x3+0*x4+0*x5
Система ограничений: -3*x1+x2+x3=-9 2*x1+3*x2+x4=50 x1-4*x2+x5=-18
Векторный анализ системы ограничений:
Расширенная целевая функция: S min = 6*x1+1*x2+0*x3+0*x4+0*x5
Вектора:
P0 |
P1(x1) |
P2(x2) |
P3(x3) |
P4(x4) |
P5(x5) |
|
-9 |
-3 |
1 |
1 |
0 |
0 |
|
50 |
2 |
3 |
0 |
1 |
0 |
|
-18 |
1 |
-4 |
0 |
0 |
1 |
|
Базис: Базисный вектор №1: P3(x3)
Базисный вектор №2: P4(x4)
Базисный вектор №3: P5(x5)
Расширенная целевая функция: S min = 6*x1+1*x2+0*x3+0*x4+0*x5
Заполним первую таблицу:
№ |
Base |
CBase |
P0 |
6 |
1 |
0 |
0 |
0 |
|
P1 |
P2 |
P3 |
P4 |
P5 |
|||||
1 |
P3 |
0 |
-9 |
-3 |
1 |
1 |
0 |
0 |
|
2 |
P4 |
0 |
50 |
2 |
3 |
0 |
1 |
0 |
|
3 |
P5 |
0 |
-18 |
1 |
-4 |
0 |
0 |
1 |
|
S min = |
0 |
-6 |
-1 |
0 |
0 |
0 |
|||
Невозможно выбрать столбец замещения, так как нет положительных dj! Выберем столбец таким образом. Чтобы избавиться от недопустимого решения, т.е. от отрицательных значений в столбце свободных членов (Р0). Замещаемый базисный вектор: P3 (1-я строка) Новый базисный вектор: P1 (1-й столбец) Заменяем базисный вектор P3 на P1.
№ |
Base |
CBase |
P0 |
6 |
1 |
0 |
0 |
0 |
|
P1 |
P2 |
P3 |
P4 |
P5 |
|||||
1 |
P1 |
6 |
3 |
1 |
-0,3333 |
-0,3333 |
0 |
0 |
|
2 |
P4 |
0 |
44 |
0 |
3,6667 |
0,6667 |
1 |
0 |
|
3 |
P5 |
0 |
-21 |
0 |
-3,6667 |
0,3333 |
0 |
1 |
|
S min = |
18 |
0 |
-3 |
-2 |
0 |
0 |
|||
Невозможно выбрать столбец замещения, так как нет положительных dj! Выберем столбец таким образом. Чтобы избавиться от недопустимого решения, т.е. от отрицательных значений в столбце свободных членов (Р0). Замещаемый базисный вектор: P5 (3-я строка) Новый базисный вектор: P2 (2-й столбец) Заменяем базисный вектор P5 на P2.
№ |
Base |
CBase |
P0 |
6 |
1 |
0 |
0 |
0 |
|
P1 |
P2 |
P3 |
P4 |
P5 |
|||||
1 |
P1 |
6 |
4,9091 |
1 |
0 |
-0,3636 |
0 |
-0,0909 |
|
2 |
P4 |
0 |
23 |
0 |
0 |
1 |
1 |
1 |
|
3 |
P2 |
1 |
5,7273 |
0 |
1 |
-0,0909 |
0 |
-0,2727 |
|
S min = |
35,1818 |
0 |
0 |
-2,2727 |
0 |
-0,8182 |
|||
Решение не целочисленное. Применим метод Гомори: выберем в таблице строку, в которой целая часть дробного свободного члена (P0) принимает наибольшее значение. Макс. целая часть дробного свободного члена при базисном векторе P2 (3-я строка). Составим уравнение ограничения и добавим в таблицу новый базисный вектор по новому уравнению и новой переменной. Добавляем базисный вектор: P6 (6-й столбец).
№ |
Base |
CBase |
P0 |
6 |
1 |
0 |
0 |
0 |
0 |
|
P1 |
P2 |
P3 |
P4 |
P5 |
P6 |
|||||
1 |
P1 |
6 |
4,9091 |
1 |
0 |
-0,3636 |
0 |
-0,0909 |
0 |
|
2 |
P4 |
0 |
23 |
0 |
0 |
1 |
1 |
1 |
0 |
|
3 |
P2 |
1 |
5,7273 |
0 |
1 |
-0,0909 |
0 |
-0,2727 |
0 |
|
4 |
P6 |
0 |
-0,7273 |
0 |
0 |
-0,9091 |
0 |
-0,7273 |
1 |
|
S min = |
35,1818 |
0 |
0 |
-2,2727 |
0 |
-0,8182 |
0 |
|||
Невозможно выбрать столбец замещения, так как нет положительных dj! Выберем столбец таким образом. Чтобы избавиться от недопустимого решения, т.е. от отрицательных значений в столбце свободных членов (Р0). Замещаемый базисный вектор: P6 (4-я строка) Новый базисный вектор: P5 (5-й столбец) Заменяем базисный вектор P6 на P5.
№ |
Base |
CBase |
P0 |
6 |
1 |
0 |
0 |
0 |
0 |
|
P1 |
P2 |
P3 |
P4 |
P5 |
P6 |
|||||
1 |
P1 |
6 |
5 |
1 |
0 |
-0,25 |
0 |
0 |
-0,125 |
|
2 |
P4 |
0 |
22 |
0 |
0 |
-0,25 |
1 |
0 |
1,375 |
|
3 |
P2 |
1 |
6 |
0 |
1 |
0,25 |
0 |
0 |
-0,375 |
|
4 |
P5 |
0 |
1 |
0 |
0 |
1,25 |
0 |
1 |
-1,375 |
|
S min = |
36 |
0 |
0 |
-1,25 |
0 |
0 |
-1,125 |
|||
Невозможно выбрать столбец замещения, так как нет положительных dj! Получено оптимальное решение!
Из таблицы получим значения переменных целевой функции:
x1 |
x2 |
x3 |
x4 |
x5 |
p6 |
|
5 |
6 |
0 |
22 |
1 |
0 |
Целевая функция: S min = 6*5+1*6 И в результате: S min = 36; Задача решена.
2.3 Циклический алгоритм целочисленного программирования
Рассмотрим следующую задачу линейного программирования:
Максимизировать
X0=a00-a01x1-a02x2-……..-a0nxn,
при условии
xn+1=an+1,0-an+1,1x1-an+1,2x2-…….-an+1,nxn,
xn+m=an+m,0- an+m,1x1-an+m,2x2-…….-an+m,nxn,
xj?0 (j=1,…….,n+1,…….,n+m).
Заметим, что xn+1,.., хn+m - слабые переменные, a x1...., хn - исходные переменные задачи (1). Если наряду с ограничениями (1) потребовать, чтобы все хj, (j'=1,..., т) были целыми, то задача будет называться задачей целочисленного программирования. Существует большое количество задач, особенно комбинаторных, которые можно сформулировать как задачи целочисленного программирования.
Ограничения (1) определяют выпуклую область OABCD в n-мерном пространстве, как показано на рис. 13.1. Узлы целочисленной решетки на рис. 13.1 изображены точками. Такие точки, расположенные внутри области OABCD, являются допустимыми решениями задачи целочисленного программирования. Оптимальные решения задачи линейного программирования всегда располагаются на границе области решений. В данном случае граничные точки не являются даже допустимыми решениями, поскольку ни одна из них не целочисленна. Предположим, что область допустимых решений сужена до выпуклой оболочки допустимых целых точек внутри допустимой области. На рис. 13.1 эта выпуклая оболочка показана затененной областью OEFGH. Эту затененную область можно рассматривать как область допустимых решений некоторой другой задачи линейного программирования. Действительно, если к задаче линейного программирования, определяющей допустимую область OABCD, добавить ограничение типа RR', как показано на рис. 13.1, то вновь полученная задача будет иметь OEFGH в качестве области допустимых решений. Такая вновь полученная область обладает двумя важными свойствами: во-первых, она содержит все допустимые целочисленные точки исходной задачи линейного программирования (поскольку она является выпуклой оболочкой этих точек), во-вторых, все крайние точки новой области - целочисленны. Поэтому любое базисное оптимальное решение модифицированной задачи линейного программирования имеет своими компонентами целые числа и является оптимальным решением исходной задачи целочисленного программирования.
Именно алгоритмы целочисленного программирования, которые будут описаны ниже, реализуют методы систематического введения дополнительных ограничений с целью сведения исходной допустимой области к выпуклой оболочке ее допустимых целочисленных точек.
Как только это будет сделано, можно решать модифицированную задачу линейного программирования любым обычным методом, и полученное базисное оптимальное решение автоматически будет целочисленным. Представленный ниже целочисленный алгоритм обладает следующими свойствами: 1) все дополнительные ограничения сохраняют допустимые точки исходной целочисленной задачи; 2) за конечное число шагов создается достаточное количество дополнительных ограничений для того, чтобы оптимальное решение модифицированной задачи было целочисленным; 3) дополнительные ограничения (гиперплоскости) проходят, по крайней мере через одну целочисленную точку, хотя и не обязательно находящуюся внутри выпуклой оболочки; 4) каждое новое ограничение сокращает область допустимых решений исходной задачи целочисленного программирования. Следует подчеркнуть, что оптимальное решение исходной задачи может быть получено прежде, чем допустимая область сократится до размеров выпуклой оболочки. К тому же, поскольку оптимальное целочисленное решение определяется пересечением п гиперплоскостей, таких гиперплоскостей существует не более, чем это необходимо; некоторые из них могут быть ограничениями исходной задачи (рис. 4).
Рис. 4
Обычно в ограничения задачи (1) включаются в тривиальные соотношения xj=-(-Xj) (j'=1,...,n), а задача в матричной форме принимает вид
х = А (-хn), (2)
где х - вектор-столбец с компонентами Х0, x1,..., xn, xn+1,...,xn+m А - соответствующая матрица размера (п + т + 1) * (n + 1) и (-хn) - вектор с компонентами (1, -x1,-x2,..., -xn), представляющими собой небазисные переменные исходной таблицы. Задачу целочисленного программирования также можно записать в виде таблицы.
Причины представления переменных в виде (-x1), (-x2,......, (-xn)) - чисто исторические, но это стало обычной практикой в целочисленном программировании. Будем использовать бj(j = 0, 1,..., п) для обозначения j-го столбца текущей таблицы и aij (i = 0, 1,..., п + т; j = 0, 1,..., n) для обозначения элемента 1-й строки и 7-го столбца таблицы. Предполагается, что все a,ij в исходной таблице целые. Следовательно, все слабые переменные xn+1,..., Хn+m должны быть также неотрицательными целыми числами.
При изложении алгоритма для решения целочисленных задач будем следовать работе Гомори. Вначале задача целочисленного программирования рассматривается как линейная программа и алгоритм решает ее с помощью прямого или двойственного симплекс-метода. В конце работы алгоритма аij?0 (i = 1,......, п + т) и a0j? 0 (j' = 1,..., n). (Для получения исходного двойственного допустимого решения введем дополнительное ограничение xn+m+1 == М - X1 -x2 -... - xn? 0, где M - достаточно большая константа, и проделаем одну итерацию с этой строкой и лексикографически минимальным столбцом в качестве ведущего.) Если аi0? 0 и целые для всех i, то получено оптимальное решение целочисленной задачи. В этом случае решение получается сразу, без использования ограничений целочисленности. Если аi0? 0, но не все целые, добавим к ограничениям (1) еще одно. Новое ограничение записывается внизу таблицы так, чтобы она перестала быть прямо допустимой, т. е. аi0<О для i == п + т + 1. Затем используется двойственный симплекс-метод с целью сделать все аi0? 0. Если аi0 получаются нецелыми, в таблицу добавляются новые ограничения до тех пор, пока аi0 (i = 1,..., n,..., n + m) не станут все целыми и неотрицательными.
Если после введения дополнительного ограничения текущая таблица перестает быть прямо допустимой, то текущее решение, представляющее собой вершину многогранника решений, не удовлетворяет этому дополнительному ограничению. Другими словами, дополнительное ограничение отсекает часть пространства решений. Если дополнительные ограничения не отсекают ни одной целочисленной точки пространства решений исходной задачи, то, вполне вероятно, после введения достаточного числа дополнительных ограничений вершины суженного множества решений будут целочисленными. Тогда, используя симплекс-метод, можно получить оптимальное целочисленное решение. Трудность состоит в систематическом получении дополнительных ограничений и доказательстве конечности алгоритма.
Каждый раз после проведения итерации симплекс-метода происходит изменение множества небазисных переменных. Таблица также меняется. Будем использовать t для обозначения t-й. таблицы. Матричное уравнение (2) запишется как
Хt = Аt (-хtn), (3)
где х° - вектор-столбец с n + т + 1 компонентами, А° - матрица размера (п + т + 1)*(n + 1) и (-х0n) - вектор с компонентами (1, -x1,..., -xn), представляющими собой текущие небазисные переменные, взятые со знаком минус. Если в матрице А а0i?0 (j = 1,..., n), а00 ? 0 (mod 1) 1} и аi0 ? 0 (i=1,..., п+т) - целые неотрицательные числа, то получено оптимальное решение целочисленной задачи. Если аi0 не все целые, введем дополнительное ограничение. Рассмотрим такое уравнение из (3), в котором аi0m нецелое. Опуская индексы строки, имеем
(4) x=a0+?aj(-xj)
где xj в правой части - текущие небазисные переменные и a0 - нецелое. Поскольку требуется, чтобы х было целым, или х ?0 (mod1), правая часть уравнения (4) также должна удовлетворять условию
0?a0+?aj(-xj) (mod1). (5)
Это условие должно выполняться при допустимом целочисленном решении. Поскольку требуется, чтобы xj,были целыми, можно алгебраически складывать с (5) отношения 0?f0+?jfi(-xi) (mod1) (0<f0<1, 0?fj<1). (6)
Условие (6) эквивалентно следующему:
?fjxj?f0 (mod1). (7)
В соотношении (7) f0 - константа, меньшая единицы,и поскольку fj?0 и xj?, левая часть всегда положительна. Т.к. (7) - отношение сравнения по модулю 1, левая часть может принрмать только значения вида f0, f0+1,……, т.е.
?fjxj?f0 (8)
Неравенство (8) можно представить в виде уравнения с помощью введения неотрицательной целочисленности слабой переменной
S=-f0+?fjxj?0. (9)
Это уравнение можно приписать внизу таблицы и использовать в качестве ведущей строки. Таким образом, переменная s войдет в базис с отрицательным значением (-fо)- После итерации слабая переменная s станет небазисной с нулевым значением. Ведущая строка превратится в тождество s ? (-1) (-s) и может быть исключена. Будем называть переменную s в уравнении (9) слабой переменной Гомори. Ниже будет обсуждено, что произойдет, если сохранять все дополнительные строки, соответствующие слабым переменным Гомори.
Дадим доказательство конечности алгоритма. Доказательство будет проведено в предположении, что известна некоторая нижняя граница значения Х0, т. е. если существует целочисленное решение, то оно больше, чем наперед заданная величина М (М может быть достаточно большой по абсолютной величине отрицательной константой). Такое предположение не слишком обременительно и всегда выполняется, если выпуклое множество, определяемое условиями (2), ограничено. Сначала изложим сам алгоритм.
Шаг 1. Решить задачу целочисленного программирования так, как если бы это была линейная программа, т. е. с помощью прямого или двойственного симплекс-метода. Если получено оптимальное решение задачи линейного программирования, то ai0?0 (i=1,..., m + n) и a0i?0(j = 1,..., n). Требуется также, чтобы аtj > 0 (j = 1,..., n).
Шаг 2. Если аi0 - все целые, то задача решена, и решение получено без использования дополнительных ограничений. В противном случае пусть аti0 - первая нецелочисленная компонента в бt0. Тогда i-я строка называется производящей строкой. Записать внизу таблицы уравнение
s=-fti0-?ftij(-xtj). (10)
Уравнение (10) называется отсечением Гомори. Проделать шаг двойственного симплекс-метода, используя в качестве ведущей строки отсечение Гомори (10). При этом таблица останется двойственно допустимой. Повторять до тех пор, пока все аi0 (i = 1,..., m+n) не станут целыми неотрицательными. Если аi0 на некотором шаге остается отрицательным, следующий шаг двойственного метода производится без введения отсечения Гомори. (Если аi0 становится отрицательным, нулевая строка не выбирается в качестве производящей. Если a00 становится нецелым, следует выбрать нулевую строку в качестве производящей.)
Изменение элементов аij (i = 0, 1,..., n+m; j = 0,......, n) в таблице за одну итерацию называется циклом. Для обозначения циклов используется буква t. Для доказательства конечности не достаточно условий бt0 >б0 t+1 >М, поскольку a00 может изменяться каждый раз на е(t), а ? е (t) = с.
Примером этого может служить е (t) =1/2t. Другой возможностью является то, что а00 остается равным фиксированному значению, большему нижней границы, в то время как некоторое аi0 неограниченно уменьшается. Чтобы увидеть, как преодолеваются эти трудности, необходимо в деталях рассмотреть шаги итерации.
При доказательстве будет показано, что либо после конечного числа шагов все компоненты 0-го столбца становятся неотрицательными целыми, либо не существует целого решения. Если a00 остается постоянным для всех t ? t0, то at00 должно быть целым.
Предположим, что аt00-нецелое. Пусть аt00 =nt00+ft00,где nt00- целое и 0 < ft00 < 1. Тогда 0-я строка становится производящей и требуется ввести дополнительное ограничение
S=-ft00-?ft0(-xtj).
Если s-й столбец является ведущим, то
at+100=at00-at0s* ft00/ftos
или
Другими словами, a00 уменьшится по крайней мере до ближайшего целого. Следовательно, a00 не может уменьшаться на е(t) при
?е (t)<c
Если a00 каждый раз уменьшается до ближайшего целого или на целую величину, то после конечного числа шагов оно станет меньше любого наперед заданного М (М - предполагаемая нижняя граница). Если алгоритм бесконечен, то a00 должно оставаться некоторым фиксированным целым числом для t> t0. Предположим, что это произошло. Тогда рассмотрим а10. Так же как и a00, a10 не может оставаться нецелым значением. Если бы это было так, то, поскольку a00 - целое, первая строка стала бы производящей и после введения отсечения Гомори и итерации симплекс-метода мы получили бы
At+110=at10-at1s*ft10/ft1s,
где 0<ft1s<l и 0<ft1s<1. Здесь at1s -неотрицательное число, большее ft1s. (Если at1s-отрицательно и бts-лексикографически положителен, то аt0s положительно и, следовательно, аt00 не может не измениться.) Отсюда
at+110?at10-ft10=[at10],
т.е. а10 уменьшается по крайней мере до ближайшего целого. Поэтому а10 либо будет оставаться некоторым фиксированным целым числом, либо после конечного числа шагов станет отрицательным. Если а10 станет отрицательным, то первая строка будет ведущей и
б0t+1=бt0-a10/a1s*бts,
Из того, что бts > 0 и a1s <. О, следует, что a0s > 0, т. е. значение a00 строго уменьшится, что противоречит допущению о неизменности значения a00. Если a1j? 0 для всех j = 1,..., s,......, n, то задача не имеет допустимых решений. (Заметьте, что ведущий элемент должен быть отрицательным.)
Таким образом, остается единственная возможность-а10 через конечное число шагов должно стать некоторым неотрицательным целым числом и больше не меняться.
Аналогичные рассуждения можно провести и для остальных компонент вплоть до (n+m)-й, что завершит доказательство конечности. Заметим, что нам надо, чтобы только первые n + 1 компонент вектора б0 были целыми неотрицательными числами, a00 <> 0 и aij (i = n+1,…..,n+m) - неотрицательные.
Причем, если неравенства выразить через исходные небазисные переменные, они будут иметь целые коэффициенты.
Если сохранять все строки, соответствующие слабым переменным Гомори, то эти слабые переменные могут становиться базисными, после того как они были небазисными. Если слабая переменная Гомори вошла в базис с неотрицательным значением, то соответствующая строка представляет собой неравенство, справедливое при текущем решении, и эта строка может быть вычеркнута. Если слабая переменная Гомори становится базисной с отрицательным значением, соответствующую строку следует использовать в качестве ведущей. Если сохранять все строки, соответствующие всем отсечениям Гомори, то, вообще говоря, потребуется меньшее число дополнительных ограничений, однако увеличение таблицы много более неприятно, чем введение лишних дополнительных ограничений.
2.4 Полностью целочисленный алгоритм
целочисленный программирование метод гомори
Здесь будет описан другой алгоритм для решения задач целочисленного программирования. Этот алгоритм назван полностью целочисленным, потому что если исходная таблица состоит из целочисленных элементов, то все таблицы, получающиеся в процессе работы алгоритма, содержат только целочисленные элементы. Подобно двойственному симплекс-методу, алгоритм начинает работать с двойственно допустимой таблицы. Если аi0 (i = 1,..., n+m) - неотрицательные целые, то задача решена. Если для какой-нибудь строки аi0 < 0, то составляется новое уравнение и записывается внизу таблицы. Эта строка затем служит ведущей. После этого используется двойственный симплекс-метод. Все элементы дополнительной строки должны быть целыми числами, а ведущий элемент равен -1. Введенная таким образом ведущая строка сохранит таблицу целочисленной. Заметим, что в предыдущем алгоритме в качестве производящей строки выбиралась строка с нецелым аi0. В данном случае производящей строкой становится строка с отрицательным аi0.
Подобные документы
Описание задачи линейного целочисленного программирования. Общий алгоритм решения задач с помощью метода границ и ветвей, его сущность и применение для задач календарного планирования. Пример использования метода при решении задачи трех станков.
курсовая работа [728,8 K], добавлен 11.05.2011Формы задачи линейного программирования, каноническая форма. Симплекс-метод: теоретические основы, прямой алгоритм; метод Гомори. Математическая и техническая постановка задачи, программная реализация: запуск, графический интерфейс и созданные функции.
курсовая работа [578,7 K], добавлен 04.02.2011Оптимальный план прямой задачи. Значения функций целочисленного и нецелочисленного решений. Оптимальное решение двойственной задачи и условия дополняющей нежесткости. Условия канонической задачи линейного программирования. Метод Жордана–Гаусса.
контрольная работа [323,0 K], добавлен 20.01.2011Математическая формализация оптимизационной проблемы. Геометрическая интерпретация стандартной задачи линейного программирования, планирование товарооборота. Сущность и алгоритм симплекс-метода. Постановка транспортной задачи, последовательность решения.
учебное пособие [126,0 K], добавлен 07.10.2014Цель работы: изучить и научиться применять на практике симплекс - метод для решения прямой и двойственной задачи линейного программирования. Математическая постановка задачи линейного программирования. Общий вид задачи линейного программирования.
реферат [193,4 K], добавлен 28.12.2008Теоретические основы экономико-математических методов. Этапы принятия решений. Классификация задач оптимизации. Задачи линейного, нелинейного, выпуклого, квадратичного, целочисленного, параметрического, динамического и стохастического программирования.
курсовая работа [2,3 M], добавлен 07.05.2013История создания средств цифровой вычислительной техники. Методы и модели линейного программирования. Экономическая постановка задачи. Выбор метода реализации задачи. Особенности выбора языка программирования. Решение задачи сетевым методом планирования.
курсовая работа [842,1 K], добавлен 19.02.2015Математическая формулировка задачи линейного программирования. Применение симплекс-метода решения задач. Геометрическая интерпретация задачи линейного программирования. Применение методов линейного программирования к экстремальным задачам экономики.
курсовая работа [106,0 K], добавлен 05.10.2014Виды задач линейного программирования и формулировка задачи. Сущность оптимизации как раздела математики и характеристика основных методов решения задач. Понятие симплекс-метода, реальные прикладные задачи. Алгоритм и этапы решения транспортной задачи.
курсовая работа [268,0 K], добавлен 17.02.2010Геометрический способ решения стандартных задач линейного программирования с двумя переменными. Универсальный метод решения канонической задачи. Основная идея симплекс-метода, реализация на примере. Табличная реализация простого симплекс-метода.
реферат [583,3 K], добавлен 15.06.2010