Линейное программирование
Изучение экстремальных задач и поиск их решений. Выбор метода решения и приведения задачи к каноническому виду и к задаче линейного программирования. Метод искусственного базиса. Модифицированный симплекс-метод. Написание программы на языке С++Builder 6.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 28.11.2010 |
Размер файла | 343,0 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Содержание
Содержание
1. Пояснительная записка
1.1.Введение
2. Теоретическая часть
2.1 Элементы теории матричных игр
2.2 Решение матричных игр в чистых стратегиях
2.3 Решение матричных игр в смешанных стратегиях путём сведения к задаче линейного программирования
3. Практическая часть
3.1 Построение математической модели задачи
3.2 Выбор метода решения и привидения задачи к каноническому виду
3.3 Решение задачи путем сведения к задаче линейного программирования
- Блок схема к поставленной задачи
- Программа к поставленной задачи (программный код)
3.4 Анализ результата решения поставленной задачи
4. Вывод курсового проектирования
Заключение
Список основных источников
1. Пояснительная записка курсового проектирования
Цель данного курсового проекта - составить план производства требуемой продукции, обеспечивающий максимальную прибыль от выпускаемой продукции, свести данную задачу к задаче линейного программирования, решить её симплекс - методом и составить программу для решения задачи этим методом на ЭВМ.
1. КРАТКИЙ ОБЗОР АЛГОРИТМОВ РЕШЕНИЯ ЗАДАЧ ДАННОГО ТИПА 1.1 Математическое программирование.
Математическое программирование занимается изучение экстремальных задач и поиском методов их решения. Задачи математического программирования формулируются следующим образом : найти экстремум некоторой функции многих переменных f ( x1, x2, ... , xn ) при ограничениях gi ( x1, x2, ... , xn ) ( bi , где gi - функция, описывающая ограничения, ( - один из следующих знаков ( , ( , ( , а bi - действительное число, i = 1, ... , m. f называется функцией цели ( целевая функция ). Линейное программирование - это раздел математического программирования, в котором рассматриваются методы решения экстремальных задач с линейным функционалом и линейными ограничениями, которым должны удовлетворять искомые переменные. Задачу линейного программирования можно сформулировать так . Найти max [pic] при условии : a11 x1 + a12 x2 + . . . + a1n xn ( b1 ; a21 x1 + a22 x2 + . . . + a2n xn ( b2 ; . . . . . . . . . . . . . . . . . . . . . . . . . . . . am1 x1 + am2 x2 + . . . + amn xn ( bm ; x1 ( 0, x2 ( 0, . . . , xn ( 0 . Эти ограничения называются условиями не отрицательности. Если все ограничения заданы в виде строгих равенств, то данная форма называется канонической. В матричной форме задачу линейного программирования, записывают следующим образом. Найти max cT x при условии A x ( b ; x ( 0 , где А - матрица ограничений размером (m(n), b(m(1) - вектор-столбец свободных членов, x(n ( 1) - вектор переменных, сТ = [c1, c2, ... , cn ] - вектор-строка коэффициентов целевой функции. Решение х0 называется оптимальным, если для него выполняется условие сТ х0 ( сТ х , для всех х ( R(x). Поскольку min f(x) эквивалентен max [ - f(x) ] , то задачу линейного программирования всегда можно свести к эквивалентной задаче максимизации. Для решения задач данного типа применяются методы:
1) графический;
2) табличный ( прямой, простой ) симплекс - метод;
3) метод искусственного базиса;
4) модифицированный симплекс - метод;
5) двойственный симплекс - метод.
1.2 Табличный симплекс - метод Для его применения необходимо, чтобы знаки в ограничениях были вида “ меньше либо равно ”, а компоненты вектора b - положительны. Алгоритм решения сводится к следующему :
1. Приведение системы ограничений к каноническому виду путём введения дополнительных переменных для приведения неравенств к равенствам.
2. Если в исходной системе ограничений присутствовали знаки “ равно ” или “ больше либо равно ”, то в указанные ограничения добавляются искусственные переменные, которые так же вводятся и в целевую функцию со знаками, определяемыми типом оптимума.
3. Формируется симплекс-таблица.
4. Рассчитываются симплекс- разности.
5. Принимается решение об окончании либо продолжении счёта.
6. При необходимости выполняются итерации.
7. На каждой итерации определяется вектор, вводимый в базис, и вектор, выводимый из базиса. Таблица пересчитывается по методу Жордана Гаусса или каким-нибудь другим способом.
1.3 Метод искусственного базиса. Данный метод решения применяется при наличии в ограничении знаков “ равно ”, “ больше либо равно ”, “ меньше либо равно ” и является модификацией табличного метода. Решение системы производится путём ввода искусственных переменных со знаком, зависящим от типа оптимума, т.е. для исключения из базиса этих переменных последние вводятся в целевую функцию с большими отрицательными коэффициентами, а в задачи минимизации с положительными. Таким образом, из исходной получается новая задача. Если в оптимальном решении задачи нет искусственных переменных, это решение есть оптимальное решение исходной задачи. Если же в оптимальном решении задачи хоть одна из искусственных переменных будет отлична от нуля, то система ограничений исходной задачи несовместна и исходная задача неразрешима.
1.4 Модифицированный симплекс-метод. В основу данной разновидности симплекс-метода положены такие особенности линейной алгебры, которые позволяют в ходе решения задачи работать с частью матрицы ограничений. Иногда метод называют методом обратной матрицы. В процессе работы алгоритма происходит спонтанное обращение матрицы ограничений по частям, соответствующим текущим базисным векторам. Указанная способность делает весьма привлекательной машинную реализацию вычислений вследствие экономии памяти под промежуточные переменные и значительного сокращения времени счёта. Хорош для ситуаций, когда число переменных n значительно превышает число ограничений m. В целом, метод отражает традиционные черты общего подхода к решению задач линейного программирования, включающего в себя канонизацию условий задачи, расчёт симплекс -разностей, проверку условий оптимальности, принятие решений о коррекции базиса и исключение Жордана Гаусса. Особенности заключаются в наличии двух таблиц - основной и вспомогательной, порядке их заполнения и некоторой специфичности расчётных формул.
ПОСТАНОВКА ЗАДАЧИ:
Для производства трёх видов продукции используется три вида сырья. Нормы затрат каждого из видов сырья на единицу продукции данного вида, запасы сырья, а также прибыль с единицы продукции.
Определить план выпуска продукции для получения максимальной прибыли. Оценить каждый из видов сырья, используемых для производства продукции.
Соответственно:
1. Первое с чего начинаем, это строим математическую модель задачи;
2. Выбираем метод решения задачи и приводим задачу к каноническому виду;
3. Решаем задачу путём сведения к задаче линейного программирования;
4. Затем строим блок схему к задачи с написанием программы на языке С++Builder 6.;
5. Дальнейшим этапом моей работы будет анализ результата решения выполненной мною задачи.
1.1 Введение
1 Математические методы
Математическое моделирование как инструмент познания завоевывает все новые и новые позиции в различных областях деятельности человека. Оно становится главенствующим направлением в проектировании и исследовании новых систем, анализе свойств существующих систем, выборе и обосновании оптимальных условий их функционирования и т.п.
Изучение математического моделирования открывает широкие возможности для осознания связи информатики с математикой и другими науками. Абстрактное моделирование с помощью компьютеров - вербальное, информационное, математическое - в наши дни стало одной из информационных технологий в познавательном плане исключительно мощной.
Общее в моделях то, что во всех случаях модель в определённом смысле заменяла сам исследуемый объект. Вместо исходного объекта (оригинала) использовалась его модель, модель являлась представлением объекта в некоторой форме, отличной от формы его реального существования.
Модель - это материальный или идеальный объект, который строится для изучения исходного объекта (оригинала) и который отражает наиболее важные качества и параметры оригинала.
Практически во всех науках о природе, живой и неживой, об обществе, построение и использование моделей является мощным орудием познания. Реальные объекты и процессы бывают столь многообразны и сложны, что лучшим способом изучения часто является построение модели, отражающей лишь какую - то часть реальности.
В любом случае модель строится для с целью узнать про объект что - либо новое или сохранить об объекте информацию, которая может стать недоступной в будущем.
Как правило, процесс изучения, связанный с использованием моделей и называемый моделированием не заканчивается созданием одной модели. Построив модель и получив с её помощью, какие - либо результаты, соотносят их с реальностью и если это соотношение даёт неудовлетворительные результаты, то в построенную модель вносят коррективы или даже создают другую модель. В случае достижения хорошего соответствия с реальностью выясняют границы применения модели. Это очень важный вопрос, он решается путём сравнения модели с оригиналом путём сравнения предсказаний, полученных с помощью компьютерной модели. Если это сравнение даёт удовлетворительные результаты, то модель принимают на вооружение, если нет, приходится создавать другую модель.
Математическое моделирование относится к классу знакового моделирования, при этом модели могут создаваться из любых математических объектов, чисел, функций, уравнений, графиков, графов.
Практически во всех науках построение и использование моделей является мощным орудием познания.
В моделировании существует два пути:
Модель может быть похожей копией объекта, выполненной из другого материала и в другом масштабе, с отсутствием ряда деталей.
Модель может отражать реальность более абстрактно - словесным описанием формализованным по каким - то правилам, соотношениям.
Существует следующая классификация абстрактных моделей:
Вербальные
Эти модели используют последовательности предложений на формализованных диалектах естественного языка для описания той или иной области действительности.
Математические
Это очень широкий класс знаковых моделей, основанных на формальных языках над конечными алфавитами, широко использующих те или иные математические методы.
Информационные
Это класс знаковых моделей описывающих информационные процессы в системах самой разнообразной природы.
Граница между вербальными, математическими и информационными моделями может быть проведена весьма условно; можно считать информационные методики подклассом математических моделей.
Математическая модель выражает существенные черты объекта или процесса языком уравнений и других математических средств. Огромный толчок развитию математическому моделированию дало появление ЭВМ, хотя сам метод появился тысячи лет назад.
Понятие «аналитическое» решение и «компьютерное» решение не противостоят друг другу, так как:
Всё чаще компьютеры при математическом моделировании используются не только для численных расчётов, но и для аналитических преобразований.
Результат аналитического исследования часто выражен в столь сложной форме, что при взгляде на неё не складывается восприятие описываемого ею процесса. Эту формулу можно протабулировать, представить графически, проиллюстрировать в динамике, то есть проделать то, что называется визуализацией абстракции.
2 Симплекс метод решения задач линейного программирования
Симплекс метод - универсальный метод для решения линейной системы уравнений или неравенств и линейного функционала.
Для привидения системы ограничений неравенств к каноническому виду, необходимо в системе ограничений выделить единичный базис.
Ограничения вида «?»- ресурсные ограничения. Справа находится то что мы используем на производстве, слева - то что получаем. При таких ограничения вводят дополнительные переменные с коэффициентом «+1», образующие единичный базис. В целевую функцию эти переменные войдут с коэффициентом «0».
Ограничения вида «=». Часто бывает, что несмотря на то что ограничения имеют вид равенства, единичный базис не выделяется или трудно выделяется. В этом случае вводятся искусственные переменные для создания единичного базиса - Yi. В систему ограничений они входят с коэффициентом «1» , а в целевую функцию с коэффициентом «M», стремящимся к бесконечности (при Fmin - «+M», при Fmax - «-M»).
Ограничения вида «?» - Плановые ограничения. Дополнительные переменные (X), несущие определенный экономический смысл - перерасход ресурсов или перевыполнение плана, перепроизводство, добавляются с коэффициентом «-1», в целевую функцию - с коэффициентом «0». А искусственные переменные (Y) как в предыдущем случае.
Алгоритм симплекс метода.
(первая симплекс таблица)
Пусть система приведена к каноническому виду.
X1+ q1,m+1 Xm+1 + …. + q1,m+n Xm+n = h1
X2+ q1,m+1 Xm+1 + …. + q1,m+n Xm+n = h1
X3+ q1,m+1 Xm+1 + …. + q1,m+n Xm+n = h1
……………………………………………………………….
Xm+ qm,m+1 Xm+1 + …. + qm,m+n Xm+n =hm
В ней m базисных переменных, k свободных переменных. m+k=n - всего переменных.
Fmin= C1X1+ C2X2+ C3X3+....+ CnXn
Все hi должны быть больше либо равны нулю, где i=1,2...m. На первом шаге в качестве допустимого решения принимаем все Xj=0 (j=m+1,m+2,...,m+k). При этом все базисные переменные Xi=Hi.
Для дальнейших рассуждений вычислений будем пользоваться первой симплекс таблицей (таблица 3.1).
Таблица 1.
C |
Б |
H |
C1 |
C2 |
… |
Cm |
Cm+1 |
… |
Cm+k |
|
X1 |
X2 |
… |
Xm |
Xm+1 |
… |
Xm+k |
||||
C1C2C3::Cm |
X1X2X3::Xm |
h1h2h3::hm |
100::0 |
010::0 |
:::::: |
000::0 |
q1,m+1q2,m+1q3,m+1::qm,m+1 |
:::::: |
q1,m+kq2,m+kq3,m+k::qm,m+k |
|
F= |
F0 |
?? |
?? |
… |
?m |
?m+1 |
… |
?m+k |
Первый столбец- коэффициенты в целевой функции при базисных переменных.
Второй столбец - базисные переменные.
Третий столбец - свободные члены (hi?0).
Самая верхняя строка - коэффициенты при целевой функции.
Вторая верхняя строка - сами переменные, входящие в целевую функцию и в систему ограничений.
Основное поле симплекс метода - система коэффициентов из уравнения.
Последняя строка - служит для того, чтобы ответить на вопрос: «оптимален план или нет».
Для первой итерации F0= ??ci*hi.
?????????????????m - оценки они рассчитываются по формуле:
??j = ? ciqij-cj.
Индексная строка позволяет нам судить об оптимальности плана:
При отыскании Fmin в индексной строке должны быть отрицательные и нулевые оценки.
При отыскании Fmax в индексной строке должны быть нулевые и положительные оценки.
Переход ко второй итерации:
Для этого отыскиваем ключевой (главный) столбец и ключевую (главную) строку.
Ключевым столбцом является тот в котором находится наибольший положительный элемент индексной строки при отыскании Fmin или наименьший отрицательный элемент при отыскании Fmax.
Ключевой строкой называется та, в которой содержится наименьшее положительное частное от деления элементов столбца H на соответствующие элементы ключевого столбца.
На пересечении строки и столбца находится разрешающий элемент.
На этом этапе осуществляется к переходу к последующим итерациям.
Переход к итерациям:
Выводится базис ключевой строки, уступая место переменной из ключевого столбца со своим коэффициентом.
Заполняется строка вновь введенного базиса путем деления соответствующих элементов выделенной строки предыдущей итерации на разрешающий элемент.
Если в главной строке содержится нулевой элемент, то столбец, в котором находиться этот элемент переноситься в последующую итерацию без изменения.
Если в главном столбце имеется нулевой элемент, то строка, в которой он находиться переноситься без изменения в последующую итерацию.
Остальные элементы переносятся по формуле:
Метод искусственного базиса.(Вторая симплекс таблица)
При использовании искусственного базиса необходимо добиваться выхода искусственных переменных из базиса и введение в него независимых переменных. Для этой цели можно также использовать симплекс метод, причем решение распадается на две фазы:
Построение искусственного базиса и оптимизация функции суммы искусственных переменных, т.е. F0=Y1+Y2+…+Yn = 0 (F?min). Если при этом F0=0, то искусственный базис мы вывели из состава переменных, переходим ко второй фазе - решаем задачу по первой симплекс таблице с действительными переменными. Если же F0?0, т.е. искусственный базис не выведен из состава переменных - ОЗЛП решений не имеет.
Решение преобразованной системы ограничений с заданной целевой функцией и действительными переменными. При этом столбцами искусственных переменных в симплекс методе пренебрегаем.
Замечания:
При решении задач на max с искусственным базисом следует переходить к решению на min, меняя лишь только целевую функцию:
Fmax = - Fmin.
При решении ЗЛП с искусственным базисом особое внимание следует обратить на вычисление элементов индексных строк.
a) Для столбцов X вычисление элементов идет по формулам:
??j = ? qij.
? yi = y1+y2+…+yR.
?Hi=F0.
Примечание: только для строк Y.
б) Для столбцов Y работает старая формула:
??j = ? ciqij-cj.
2. Теоретическая часть
Математические модели
Математическая модель -- приближенное описание объекта моделирования, выраженное с помощью математической символики.
Математические модели появились вместе с математикой много веков назад. Огромный толчок развитию математического моделирования придало появление ЭВМ. Применение вычислительных машин позволило проанализировать и применить на практике многие математические модели, которые раньше не поддавались аналитическому исследованию. Реализованная на компьютере математическая модель называется компьютерной математической моделью, а проведение целенаправленных расчетов с помощью компьютерной модели называется вычислительным экспериментом.
Этапы компьютерного математического моделирования изображены на рисунке (1). Первый этап --определение целей моделирования. Эти цели могут быть различными:
1. модель нужна для того, чтобы понять, как устроен конкретный объект, какова его структура, основные свойства, законы развития и взаимодействия с окружающим миром (понимание);
2. модель нужна для того, чтобы научиться управлять объектом (или процессом) и определить наилучшие способы управления при заданных целях и критериях (управление);
3. модель нужна для того, чтобы прогнозировать прямые и косвенные последствия реализации заданных способов и форм воздействия на объект (прогнозирование).
4. Построение математической модели. На этом этапе происходит переход от абстрактной формулировки модели к формулировке, имеющей конкретное математическое представление. Математическая модель -- это уравнения, системы уравнений, системы неравенств, дифференциальные уравнения или системы таких уравнений .
Классификация математических моделей
В основу классификации математических моделей можно положить различные принципы. Можно классифицировать модели по отраслям наук (математические модели в физике, биологии, социологии и т.д.). Можно классифицировать по применяемому математическому аппарату (модели, основанные на применении обыкновенных дифференциальных уравнений, дифференциальных уравнений в частных производных, стохастических методов, дискретных алгебраических преобразований и т.д.).
Наконец, если исходить из общих задач моделирования в разных науках безотносительно к математическому аппарату, наиболее естественна такая классификация:
? дескриптивные (описательные) модели;
? оптимизационные модели;
? многокритериальные модели;
? игровые модели.
Рис. (1).Блок схема математического моделирования.
2.1 Элементы теории матричных игр
СВЕДЕНИЕ МАТРИЧНОЙ ИГРЫ К ЗАДАЧЕ ЛИНЕЙНОГО ПРОГРАММИРОВАНИЯ
Предположим, что цена игры положительна (u > 0). Если это не так, то согласно свойству 6 всегда можно подобрать такое число с, прибавление которого ко всем элементам матрицы выигрышей даёт матрицу с положительными элементами, и следовательно, с положительным значением цены игры. При этом оптимальные смешанные стратегии обоих игроков не изменяются.
Итак, пусть дана матричная игра с матрицей А порядка m х n. Согласно свойству 7 оптимальные смешанные стратегии х = (х1, ..., хm), y = (y1, ..., yn) соответственно игроков 1 и 2 и цена игры u должны удовлетворять соотношениям.
Разделим все уравнения и неравенства в (1) и (2) на u (это можно сделать, т.к. по предположению u > 0) и введём обозначения :
, ,
Тогда (1) и (2) перепишется в виде :
, , , ,
, , , .
Поскольку первый игрок стремится найти такие значения хi и, следовательно, pi , чтобы цена игры uбыла максимальной, то решение первой задачи сводится к нахождению таких неотрицательных значений pi , при которых
, .
Поскольку второй игрок стремится найти такие значения yj и, следовательно, qj, чтобы цена игры uбыла наименьшей, то решение второй задачи сводится к нахождению таких неотрицательных значений qj, , при которых
, .
Формулы (3) и (4) выражают двойственные друг другу задачи линейного программирования (ЛП).
Решив эти задачи, получим значения pi , qj и u.Тогда смешанные стратегии, т.е. xi и yj получаются по формулам :
Пример. Найти решение игры, определяемой матрицей.
Решение. При решении этой игры к каждому элементу матрицы А прибавим 1 и получим следующую матрицу
Составим теперь пару взаимно-двойственных задач :
Решим вторую из них
Б.п. |
q1 |
q2 |
q3 |
q4 |
q5 |
q6 |
Решение |
a |
Отношение |
|
-1 |
-1 |
-1 |
0 |
0 |
0 |
0 |
-3 |
|||
q4 |
1 |
2 |
0 |
1 |
0 |
0 |
1 |
5 |
-- |
|
q5 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
4 |
||
q6 |
2 |
1 |
0 |
0 |
0 |
1 |
1 |
5 |
-- |
Б.п. |
q1 |
q2 |
q3 |
q4 |
q5 |
q6 |
Решение |
a |
Отношение |
|
0 |
-1 |
0 |
0 |
1 |
0 |
1 |
1 |
|||
q4 |
1 |
2 |
0 |
1 |
0 |
0 |
1 |
5 |
||
q3 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
4 |
-- |
|
q6 |
2 |
1 |
0 |
0 |
0 |
1 |
1 |
5 |
Б.п. |
q1 |
q2 |
q3 |
q4 |
q5 |
q6 |
Решение |
a |
Отношение |
|
0 |
0 |
1 |
0 |
|||||||
q2 |
1 |
0 |
0 |
0 |
||||||
q3 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
4 |
||
q6 |
0 |
0 |
0 |
1 |
Из оптимальной симплекс-таблицы следует, что
(q1, q2, q3) = (0;; 1),
а из соотношений двойственности следует, что
( p1, p2, p3) = (; 1; 0).
Следовательно, цена игры с платёжной матрицей А1 равна
. ,
а игры с платёжной матрицей А :
.
При этом оптимальные стратегии игроков имеют вид:
Х = (х1, х2, х3) = (uр1; uр2; uр3) = =
Y = (y1, y2, y3) = (uq1; uq2; uq3) = = .
2.2 Решение матричных игр в чистых стратегиях
Матричная игра двух игроков с нулевой суммой может рассматриваться как следующая абстрактная игра двух игроков.
Первый игрок имеет m стратегий i = 1,2,...,m, второй имеет n стратегий j = 1,2,...,n. Каждой паре стратегий (i,j) поставлено в соответствие число аij, выражающее выигрыш игрока 1 за счёт игрока 2, если первый игрок примет свою i-ю стратегию, а 2 - свою j-ю стратегию.
Каждый из игроков делает один ход: игрок 1 выбирает свою i-ю стратегию (i=), 2 - свою j-ю стратегию (j=), после чего игрок 1 получает выигрыш аij за счёт игрока 2 (если аij< 0, то это значит, что игрок 1 платит второму сумму | аij | ). На этом игра заканчивается.
Каждая стратегия игрока i=; j = часто называется чистой стратегией.
Если рассмотреть матрицу
А =
то проведение каждой партии матричной игры с матрицей А сводится к выбору игроком 1 i-й строки, а игроком 2 j-го столбца и получения игроком 1 (за счёт игрока 2) выигрыша аij.
Главным в исследовании игр является понятие оптимальных стратегий игроков. В это понятие интуитивно вкладывается такой смысл: стратегия игрока является оптимальной, если применение этой стратегии обеспечивает ему наибольший гарантированный выигрыш при всевозможных стратегиях другого игрока. Исходя из этих позиций, игрок 1 исследует матрицу выигрышей А следующим образом: для каждого значения i (i =) определяется минимальное значение выигрыша в зависимости от применяемых стратегий игрока 2
аij (i = )
т.е. определяется минимальный выигрыш для игрока 1 при условии, что он примет свою i-ю чистую стратегию, затем из этих минимальных выигрышей отыскивается такая стратегия i = iо, при которой этот минимальный выигрыш будет максимальным, т.е. находится
аij = = (1).
Определение. Число , определённое по формуле (1) называется нижней чистой ценой игры и показывает, какой минимальный выигрыш может гарантировать себе игрок 1, применяя свои чистые стратегии при всевозможных действиях игрока 2.
Игрок 2 при оптимальном своём поведении должен стремится по возможности за счёт своих стратегий максимально уменьшить выигрыш игрока 1. Поэтому для игрока 2 отыскивается
аij , т.е. определяется max выигрыш игрока 1, при условии, что игрок 2 применит свою j-ю чистую стратегию,
затем игрок 2 отыскивает такую свою j = j1 стратегию, при которой игрок 1 получит min выигрыш, т.е. находит
aij = = (2).
Определение. Число , определяемое по формуле (2), называется чистой верхней ценой игры и показывает, какой максимальный выигрыш за счёт своих стратегий может себе гарантировать игрок 1.
Другими словами, применяя свои чистые стратегии игрок 1 может обеспечить себе выигрыш не меньше , а игрок 2 за счёт применения своих чистых стратегий может не допустить выигрыш игрока 1 больше, чем .
Определение. Если в игре с матрицей А =, то говорят, что эта игра имеет седловую точку в чистых стратегиях и чистую цену игры
u = =.
Седловая точка - это пара чистых стратегий (iо,jо) соответственно игроков 1 и 2, при которых достигается равенство = . В это понятие вложен следующий смысл: если один из игроков придерживается стратегии, соответствующей седловой точке, то другой игрок не сможет поступить лучше, чем придерживаться стратегии, соответствующей седловой точке. Математически это можно записать и иначе:
где i, j - любые чистые стратегии соответственно игроков 1 и 2; (iо,jо) - стратегии, образующие седловую точку.
Таким образом, исходя из (3), седловой элемент является минимальным в iо-й строке и максимальным в jо-м столбце в матрице А. Отыскание седловой точки матрицы А происходит следующим образом: в матрице А последовательно в каждой строке находят минимальный элемент и проверяют, является ли этот элемент максимальным в своём столбце. Если да, то он и есть седловой элемент, а пара стратегий, ему соответствующая, образует седловую точку. Пара чистых стратегий (iо,jо) игроков 1 и 2, образующая седловую точку и седловой элемент , называется решением игры. При этом iо и jо называются оптимальными чистыми стратегиями соответственно игроков 1 и 2.
2.3 Решение матричных игр в смешанных стратегиях путём сведения к задаче линейного программирования
Исследование в матричных играх начинается с нахождения её седловой точки в чистых стратегиях. Если матричная игра имеет седловую точку в чистых стратегиях, то нахождением этой седловой точки заканчивается исследование игры. Если же в игре нет седловой точки в чистых стратегиях, то можно найти нижнюю и верхнюю чистые цены этой игры, которые указывают, что игрок 1 не должен надеяться на выигрыш больший, чем верхняя цена игры, и может быть уверен в получении выигрыша не меньше нижней цены игры. Улучшение решений матричных игр следует искать в использовании секретности применения чистых стратегий и возможности многократного повторения игр в виде партии. Этот результат достигается путём применения чистых стратегий случайно, с определённой вероятностью.
Определение. Смешанной стратегией игрока называется полный набор вероятностей применения его чистых стратегий.
Таким образом, если игрок 1 имеет m чистых стратегий 1,2,...,m, то его смешанная стратегия x - это набор чисел x = (x1, ..., xm) удовлетворяющих соотношениям
xi >= 0 (i = 1,m), = 1.
Аналогично для игрока 2, который имеет n чистых стратегий, смешанная стратегия y - это набор чисел
y = (y1, ..., yn), yj >= 0, (j = 1,n), = 1.
Так как каждый раз применение игроком одной чистой стратегии исключает применение другой, то чистые стратегии являются несовместными событиями. Кроме того, они являются единственными возможными событиями.
Чистая стратегия есть частный случай смешанной стратегии. Действительно, если в смешанной стратегии какая-либо i-я чистая стратегия применяется с вероятностью 1, то все остальные чистые стратегии не применяются. И эта i-я чистая стратегия является частным случаем смешанной стратегии. Для соблюдения секретности каждый игрок применяет свои стратегии независимо от выбора другого игрока.
Определение. Средний выигрыш игрока 1 в матричной игре с матрицей А выражается в виде математического ожидания его выигрышей
E (A, x, y) == x A yT
Первый игрок имеет целью за счёт изменения своих смешанных стратегий х максимально увеличить свой средний выигрыш Е (А, х, y), а второй - за счёт своих смешанных стратегий стремится сделать Е (А, х, y) минимальным, т.е. для решения игры необходимо найти такие х и y, при которых достигается верхняя цена игры
Е (А, х, y).
Аналогичной должна быть ситуация и для игрока 2, т.е. нижняя цена игры должна быть
Е (А, х, y).
Подобно играм, имеющим седловые точки в чистых стратегиях, вводится следующее определение: оптимальными смешанными стратегиями игроков 1 и 2 называются такие наборы хо, уо соответственно, которые удовлетворяют равенству
Е (А, х, y) = Е (А, х, y) = Е (А, хо, уо).
Величина Е (А, хо ,уо) называется при этом ценой игры и обозначается через u.
Имеется и другое определение оптимальных смешанных стратегий: хо, уо называются оптимальными смешанными стратегиями соответственно игроков 1 и 2, если они образуют седловую точку:
Е (А, х, уо)<= Е (А, хо, уо)<= Е (А, хо, у)
Оптимальные смешанные стратегии и цена игры называются решением матричной игры.
Основная теорема матричных игр имеет вид :
Теорема (о минимаксе). Для матричной игры с любой матрицей А величины
Е (А, х, y) и Е (А, х, y) существуют и равны между собой.
Игра m Ч n в общем случае не имеет наглядной геометрической интерпретации. Ее решение достаточно трудоемко при больших m и n, однако принципиальных трудностей не имеет, поскольку может быть сведено к решению задачи линейного программирования.
Пусть игра m Ч n задана платежной матрицей p = (aij ), i = 1, 2, ..., m; j = 1, 2, ..., n. Игрок А обладает стратегиями A1 , A2 , ..., Am , игрок В -- стратегиями B1 , B2 , ..., Bm . Необходимо определить оптимальные стратегии S*A = ( p*1 , p*2 , ... , p*m ) и S*B = ( q*1 , q*2 , ... , q*n ), где p*i, q*j -- вероятности применения соответствующих чистых стратегий Ai , Bj, p*1 + p*2 +...+ p*m =1, q*1 + q*2 +...+ q*n = 1.
Оптимальная стратегия S*A удовлетворяет следующему требованию. Она обеспечивает игроку А средний выигрыш, не меньший, чем цена игры v, при любой стратегии игрока В и выигрыш, равный цене игры v, при оптимальной стратегии игрока B. Без ограничения общности полагаем v > 0: этого можно добиться, сделав все элементы aij ? 0. Если игрок А применяет смешанную стратегию S*A = ( p*1 , p*2 , ... , p*m ) против любой чистой стратегии Bj игрока В, то он получает средний выигрыш, или математическое ожидание выигрыша aj = a1j p1 + a2j p2 +...+ am j pm , о = 1, 2, ..., n (т.е. элементы j-го столбца платежной матрицы почленно умножаются на соответствующие вероятности стратегий A1 , A2 , ..., Am и результаты складываются).
Для оптимальной стратегии S*A все средние выигрыши не меньше цены игры v, поэтому получаем систему неравенств:
(2.3.1)
Каждое из неравенств можно разделить на число v > 0. Введем новые переменные:
x1 = p1/v, x2 = p2/v , ..., pm/v (2.3.2)
Тогда система (2.3.1) примет вид:
(2.3.3)
Цель игрока А -- максимизировать свой гарантированный выигрыш, т.е. цену игры v.
Разделив на v ? 0 равенство p1 + p2 + ...+ pm = 1 , получаем, что переменные x1 (i = 1, 2, ..., m) удовлетворяют условию: x1 + x2 + ...+ xm = 1/v. Максимизация цены игры v эквивалентна минимизации величины1/v, поэтому задача может быть сформулирована следующим образом: определить значения переменных xi ? 0, i = 1, 2, ..., m, так, чтобы они удовлетворяли линейным ограничениям (2.3.3) и при этом линейная функция
Z = x1 + x2 + ...+ xm, (2.3.4)
обращалась в минимум. Это задача линейного программирования. Решая задачу (2.3.3)--( 2.3.4), получаем оптимальное решение p*1 + p*2 + ...+ p*m и оптимальную стратегию SA .
Для определения оптимальной стратегии S*B = (q*1 + q*2 + ...+ q*n) следует учесть, что игрок В стремится минимизировать гарантированный выигрыш, т.е. найти . Переменные q1 , q2 , ..., qn удовлетворяют неравенствам:
(2.3.5)
которые следуют из того, что средний проигрыш игрока В не превосходит цены игры, какую бы чистую стратегию не применял, игрок А.
Если обозначить
yj = qj/v, j = 1, 2, ..., n, (2.3.6)
то получим систему неравенств:
(2.3.7)
Переменные yj (1, 2, ..., n) удовлетворяют условию .
Игра свелась к следующей задаче
Определить значения переменных yj ? 0, j = 1, 2, ..., n, которые удовлетворяют системе неравенств (2.3.7) и максимизируют линейную функцию
Z' = y1 + y2 + ...+ yn, (2.3.8)
Решение задачи линейного программирования (2.3.6), (2.3.7) определяет оптимальную стратегию S*B = (q*1 + q*2 + ...+ q*n) . При этом цена игры
v = 1 / max, Z' = 1 / min Z (2.3.9)
Составив расширенные матрицы для задач (2.3.3), (2.3.4) и (2.3.7), (2.3.8), убеждаемся, что одна матрица получилась из другой транспонированием:
Таким образом, задачи линейного программирования (2.3.3), (2.3.4) и (2.3.7), (2.3.8) являются взаимно-двойственными. Очевидно, при определении оптимальных стратегий в конкретных задачах следует выбрать ту из взаимно-двойственных задач, решение которой менее трудоемко, а решение другой задачи найти с помощью теорем двойственности.
3. Практическая часть
Постановка задачи: Для производства трёх видов продукции используется три вида сырья. Нормы затрат каждого из видов сырья на единицу продукции данного вида, запасы сырья, а также прибыль с единицы продукции приведены в таблице:
Продукция/сырьё |
А |
В |
С |
Запасы сырья, ед. |
|
I |
4 |
2 |
0 |
? 19 |
|
II |
0 |
1 |
1 |
= 8 |
|
III |
1 |
2 |
0 |
? 24 |
|
Прибыль, ден. ед. |
3 |
7 |
2 |
? max |
Определить план выпуска продукции для получения максимальной прибыли, чтобы сырьё IIвида было израсходовано полностью. Оценить каждый из видов сырья, используемых для производства продукции.
Вид таблицы по заданию поставленной задачи:
Вид сырья |
Нормы затрат сырья (кг) на единицу продукции |
|||
А |
В |
С |
||
I II III |
4 0 1 |
2 1 2 |
0 1 0 |
|
Цена единицы продукции (руб.) |
3 |
7 |
2 |
Решение поставленной задачи:
Предположим, что производится x1 изделий А, изделий В и изделий С. Для определения оптимального плана производства нужно решить задачу, состоящую в максимизации целевой функции
3.1.Построим математическую модель задачи:
тогда функция цели:
Z-0 = 3X1 + 7X2 + 2X3 - совокупная прибыль от продажи произведенной продукции, которую требуется максимизировать.
Подсчитаем затраты сырья:
Сырье 1-го типа: 4 х1 + 2 х2 + 0 х3 , по условию затраты не превосходят 19,
Сырье 2-го типа: 0 х1 + 1 х2 + 1 х3, по условию затраты не превосходят 8,
Сырье 3-го типа: 1x1 + 2x2 + 0x3, по условию затраты не превосходят 24.
при следующих условиях:
4 |
X1 |
+ |
2 |
X2 |
+ |
0 |
X3 |
+ |
X4 |
? |
19 |
|
0 |
X1 |
+ |
1 |
X2 |
+ |
1 |
X3 |
+ |
X5 |
= |
8 |
|
1 |
X1 |
+ |
2 |
X2 |
+ |
0 |
X3 |
+ |
X6 |
? |
24 |
X1, X2, X3 ? 0.
4X1+2X2+X4 ? 19
X2 + X3 +X5 = 8
X1+ 2X2+X6 ?24
3.2 Выбираем метод решения и приводим задачу к каноническому виду:
Пришли к задаче линейного программирования:
припишем каждому из видов сырья, используемых для производства продукции. Тогда общая оценка сырья, используемого на производство продукции, составит:
Получили математическую модель. Необходимо максимизировать функцию цели v
Z-0 (x1, x2, x3) = 3X1 + 7X2 + 2X3 > max
Введем дополнительные переменные X4, X5, X6.
Z-0= |
3 |
X1 |
+ |
7 |
X2 |
+ |
2 |
X3 |
(max) |
|
при системе ограничений: |
Преобразуем первое ограничение:
4 |
X1 |
+ |
2 |
X2 |
+ |
0 |
X3 |
+ |
X4 |
= |
19 |
|
0 |
X1 |
+ |
1 |
X2 |
+ |
1 |
X3 |
+ |
X5 |
= |
8 |
|
1 |
X1 |
+ |
2 |
X2 |
+ |
0 |
X3 |
+ |
X6 |
= |
24 |
Получили задачу:
4X1+2X2+X4 = 19
X2 + X3 +X5 = 8
X1+2X2 +X6 =24
3.3 Решаем задачу путем сведения к задаче линейного программирования:
Xi?0 ; 0-Z= -3X1- -7X2- -2X3
Приведем задачу к канонической форме.
Задача линейного программирования записана в канонической форме, если она формулируется следующим образом.
Требуется найти вектор , доставляющий максимум линейной форме
при условиях
где
Решим задачу симплекс-методом
Строим начальную симплекс-таблицу:
Базисные переменные |
X1 |
X2 |
X3 |
X4 |
X5 |
X6 |
Свободные члены |
|||
X4 |
4 |
2 |
0 |
1 |
0 |
0 |
19 |
|||
X5 |
0 |
1 |
1 |
0 |
1 |
0 |
8 |
|||
X6 |
1 |
2 |
0 |
0 |
0 |
1 |
24 |
|||
0-Z |
-3 |
-7 |
-2 |
0 |
0 |
0 |
0 |
Так как в столбце свободных членов нет отрицательных элементов, то найдено допустимое решение. Так как в строке 0-Z есть отрицательные элементы, то полученное решение не оптимально. Для определения ведущего столбца найдем максимальный по модулю отрицательный элемент в строке 0-Z (-7). А ведущая строка та, у которой наименьшее положительное отношение свободного члена к соответствующему элементу ведущего столбца.
Пересчитаем таблицу:
Базисные переменные |
X1 |
X2 |
X3 |
X4 |
X5 |
X6 |
Свободные члены |
|||
X4 |
4 |
-2 |
-2 |
1 |
0 |
0 |
3 |
|||
X2 |
0 |
1 |
1 |
0 |
1 |
0 |
8 |
|||
X6 |
1 |
-2 |
-2 |
0 |
0 |
1 |
8 |
|||
0-Z |
-3 |
7 |
5 |
0 |
0 |
0 |
56 |
Так как в столбце свободных членов нет отрицательных элементов, то найдено допустимое решение. Так как в строке 0-Z есть отрицательные элементы, то полученное решение не оптимально. Для определения ведущего столбца найдем максимальный по модулю отрицательный элемент в строке 0-Z (-3). А ведущая строка та, у которой наименьшее положительное отношение свободного члена к соответствующему элементу ведущего столбца.
Тогда каноническую форму задачи ЛП можно представить в следующем матричном виде эквивалентном первоначальному:
Z=CX >max,
AX=B,
X?0.
где 0 - нулевая матрица-столбец той же размерности, что и матрица X.
замечание.
Не ограничивая общности, можно полагать, что свободные члены неотрицательны, т.е. b i ? 0, где i =Ї1,m (иначе ограничительные уравнения можно умножить на (-1)).
Пересчитаем таблицу:
Базисные переменные |
X4 |
X5 |
X3 |
Свободные члены |
|
X1 |
1/4 |
-1/2 |
-1/2 |
3/4 |
|
X2 |
0 |
1 |
1 |
0 |
|
X6 |
-1/4 |
-3/2 |
-3/2 |
29/4 |
|
0-Z |
3/4 |
11/2 |
7/2 |
233/4 |
Эта таблица является последней, по ней читаем ответ задачи.
Найдено оптимальное базисное решение:
При котором Z max = 233/4= 58,25 ден. ед.
План производства:
X1 =3/4= 0,75; X2 = 0; X3 = 0; X4 = 3; X5 = 0; X6 = 29/4= 7,25
Соответственно по решению, вычисляем:
Z= 3*0,75+7*0+2*0+3+7,25= 24
Z= 24
Ответ поставленной задачи: План выпуска продукции (Z) для получения максимальной прибыли, при том, что сырьё IIвида было израсходовано полностью равен 24 (Z= 24). Из хода решения задачи по условию мы видим, что оценен каждый из видов сырья, используемых для производства продукции.
Блок-схемы основных процедур при решении и программировании задач
Алгоритм программы > Рис. 1. v
Рисунок 1 -Алгоритм программы для решения ЗЛП (частный случай)
Программа к поставленной задачи (код программы)
Программа - реализующая решение задачи для производства всех видов продукции с использованием всех видов сырья. Нормы затрат каждого из видов сырья на единицу продукции данного вида, запасы сырья, а также прибыль с единицы продукции.
Программа определяет:
План выпуска продукции для получения максимальной прибыли.
1. Описание работы программы, листинг программы
1.1 Обоснование выбора языка
Программа для решения данной задачи составлена на языке C++.C++ представляет собой систему программирования. Как любая подобная система,C++ предназначена для разработки программ и имеет две характерные особенности: создаваемые с ее помощью программы могут работать не только под управлением Windows,но и в системе MS-DOS.
C++ представляет собой наиболее полный пакет объектно-ориентированного программирования. Язык прост в применении и базируется на C#,что упрощает создание программ, людям, знакомым с данным языком.
1.2 Описание работы программы
Программа составлена для общего случая. В первую матрицу вводятся ее члены в обычных дробях. Программа переводит эти дроби в десятичные и составляет каноническую форму. Затем происходит процесс формирования первой симплекс таблицы.
Следующим этапом программа начинает составлять итерации, до тех пор пока не будет найдено оптимальное решение (в данном случае составлено 2 итерации).
Программа выводит данные в строку F/
1.3 Листинг программы
//-------------------------------------------------------------------------------------------
#include <stdio.h>
#include <string.h>
#include <math.h>
#define PRECISION "%6.2f" // формат вывода дробных чисел
#define PRECISION2 "%.2f" // он же только целая часть любой длины
#define MAXDIGIT 1000000 // должно быть очень большое число (больше всех)
typedef enum
{
NEXT_ITERATION, // нужно продолжать итерации
PLAN_OPTIMAL, // найден оптимальный опорный план
ODR_BREAK, // ОДР разомкнута
ODR_EMPTY, // ОДР пустая
DUAL_DONE /* первый этап (построение опорного плана) окончен,
переходим к поиску оптим.оп.плана (обычный Симплекс) */
} plan_t;
int cn=0; // длина вектора исходного ур-я
int cnr=0; /* cn, только без членов == 0 (cnr==cn_real)
нужно только для вывода сокращенной таблицы */
float *c = NULL; // исходное ур-е
int m=0, n=0; // размеры матрицы условий
float **a = NULL; // матрица условий
float *b = NULL; // столбец свободных членов матрицы условий
int *base = NULL; // базовые переменные
float zb=0; // оценки оптимальности b
float *za = NULL; // оценки оптимальности a
int base_column = -1; // разрешающий столбец
int base_row = -1; // разрешающая строка
bool full_table = true; // вид выводимой таблицы: true==полная, false==сжатая
void FreeMem ()
{
delete[] za;
delete[] base;
delete[] b;
for (int i=0; i<m; i++)
delete[] a[i];
delete[] a;
delete[] c;
}
bool ReadInput (char *filename)
{
int i,j;
FILE *f = fopen(filename, "r");
if (NULL == f)
return false;
// исходное ур-е
fscanf(f, "%i", &cn);
c = new float [cn];
cnr=cn;
for (i=0; i<cn; i++)
{
fscanf(f, "%f", &c[i]);
if (0 == c[i]) cnr--;
}
// матрица условий
fscanf(f, "%i %i", &n, &m);
a = new float* [m];
for (i=0; i<m; i++)
a[i] = new float[n];
b = new float [m];
for (j=0; j<m; j++)
{
for (i=0; i<n; i++)
fscanf(f, "%f", &a[j][i]);
fscanf(f, "%f", &b[j]);
}
// базовые переменные
base = new int [m];
for (j=0; j<m; j++)
{
fscanf(f, "%i", &base[j]);
--base[j];
}
// флаг - полную или сжатую таблицу выводить ?
int flag = 1;
fscanf(f, "%i", &flag);
full_table = flag ? true : false;
fclose(f);
za = new float[n];
// for(i=0;i<n;i++)za[i]=0;// !!! только для отладки !!!
return true;
}
// Вычисление оценок оптимальности {za==delta_j[] and zb==Z}
void EvaluationOptimal ()
{
int i,j;
zb=0;
for (i=0; i<n; i++) za[i]=0;
for (j=0; j<m; j++)
{
for (i=0; i<n; i++)
za[i] += c[base[j]]*a[j][i];
zb += c[base[j]]*b[j];
}
for (i=0; i<n; i++)
za[i] -= c[i];
}
// Построение опорного плана (этот этап только в двойственном симплекс-методе)
plan_t BuildPsevdoPlan ()
{
int i,j;
base_column = -1; // разрешающий столбец
base_row = -1; // разрешающая строка
float acc; // временно: аккумулятор - будет хранить min, max, etc.
acc = 0; // min отрицательное значение b
for (j=0; j<m; j++)
if (b[j] < acc)
{
acc = b[j];
base_row = j;
}
if (-1 == base_row)
return DUAL_DONE;
acc = -MAXDIGIT; // max отношение za к отрицат. эл-там в строке base_row
for (i=0; i<n; i++)
{
float temp;
if (a[base_row][i] < 0 && (temp = za[i]/a[base_row][i]) > acc)
{
acc = temp;
base_column = i;
}
}
if (-1 == base_column)
return ODR_EMPTY;
return NEXT_ITERATION;
}
// Проверка опорного плана на оптимальность
plan_t CheckStrongPlan ()
{
int i,j;
float za_min = 0;
base_column = -1; // разрешающий столбец
base_row = -1; // разрешающая строка
// выбор разрешающего столбца
for (i=0; i<n; i++)
{
if (za[i] >= 0)
continue;
else if (za[i] < za_min)
{
za_min = za[i];
base_column = i;
}
}
if (-1 == base_column)
return PLAN_OPTIMAL;
za_min = MAXDIGIT;
// выбор разрешающей строки
for (j=0; j<m; j++)
{
if (a[j][base_column] > 0)
{
float t = b[j]/a[j][base_column];
if (t < za_min)
{
za_min = t;
base_row = j;
}
}
}
if (-1 == base_row)
return ODR_BREAK;
return NEXT_ITERATION;
}
// Преобразование таблицы по ф-лам Жордана-Гаусса
void JGTransformation (int base_row, int base_column)
{
// проверка на всякий случай: чтобы не было деления на нуль
if (0 == a[base_row][base_column]) return;
base[base_row] = base_column;
int i,j;
float **a2 = new float* [m]; // матрица условий
float *b2 = new float [m]; // столбец свободных членов матрицы условий
memcpy(b2,b,m*sizeof(float));
for (j=0; j<m; j++)
{
a2[j] = new float[n];
memcpy(a2[j],a[j],n*sizeof(float));
}
for (j=0; j<m; j++)
{
for (i=0; i<n; i++)
{
if (i == base_column)
{
a2[j][i] = (float) (j == base_row ? 1 : 0);
}
else
{
if (j == base_row)
a2[j][i] = a[j][i]/a[base_row][base_column];
else
a2[j][i] = a[j][i] - a[base_row][i]*a[j][base_column]/
a[base_row][base_column];
}
}
if (j == base_row)
b2[j] = b[j]/a[base_row][base_column];
else
b2[j] = b[j] - b[base_row]*a[j][base_column]/
a[base_row][base_column];
}
memcpy(b,b2,m*sizeof(float));
delete[] b2;
for (j=0; j<m; j++)
{
memcpy(a[j],a2[j],n*sizeof(float));
delete[] a2[j];
}
delete[] a2;
}
// проверка: входит ли номер столбца в число базисных переменных
bool InBase (int num)
{
for (int j=0; j<m; j++)
if (num == base[j])
return true;
return false;
}
// вывод линии символов
void Rule (char c, int amount = full_table ? 5+(n+2)*8 : 5+(cnr+1)*8)
{
for (int i=0; i<amount; i++)
printf("%c", c);
printf("\n");
}
// вывод Симплекс-таблицы
void ShowTable ()
{
int i,j;
static int iteration = 0;
printf("[%i]\n", iteration++);
if (full_table)
// полная таблица
{
Rule('=');
printf("Баз.| | |");
for (i=0; i<cn; i++)
printf(PRECISION " |", c[i]);
printf("\nпер.| Ci | Bi |");
Rule('-', n*8);
printf(" | | |");
for (i=0; i<cn; i++)
printf(" x%i |", i+1);
printf("\n");
Rule('=');
for (j=0; j<m; j++)
{
printf(" x%i |" PRECISION " |" PRECISION " |",
base[j]+1, c[base[j]], b[j]);
for (i=0; i<n; i++)
printf(PRECISION "%c|", a[j][i],
base_column == i && base_row == j ?'*':' ');
printf("\n");
}
Rule('=');
printf(" Z | --- |" PRECISION " |", zb);
for (i=0; i<n; i++)
printf(PRECISION " |", za[i]);
printf("\n");
Rule('-');
}
else
// сжатая таблица
{
Rule('=');
printf("БvС>|");
for (i=0; i<cn; i++)
{
if (!InBase(i))
printf(" x%i |", i+1);
}
printf(" Bi |\n");
Rule('=');
for (j=0; j<m; j++)
{
printf(" x%i |", base[j]+1);
for (i=0; i<n; i++)
{
if (!InBase(i))
printf(PRECISION "%c|", a[j][i],
base_column == i && base_row == j ?'*':' ');
}
printf(PRECISION" |\n", b[j]);
}
Rule('=');
printf(" Z |");
for (i=0; i<n; i++)
{
if (!InBase(i))
printf(PRECISION " |", za[i]);
}
printf(PRECISION " |\n", zb);
Rule('-');
}
if (base_column > -1 && base_row > -1)
printf("Разрешающий столбец:%2i\nРазрешающая строка: %2i\n\nX=(",
base_column+1, base_row+1);
else
printf("\nX=(");
for (i=0; i<n; i++)
{
int basen = -1;
for (j=0; j<m; j++)
if (base[j] == i) {basen = j; break;}
printf(PRECISION2 "%c ", -1==basen?0:b[basen], i!=n-1?',':')');
}
printf("\nZ=" PRECISION2 "\n\n\n", zb);
}
int main (int argc, char *argv[])
{
if (argc < 2)
{
printf("Missing argument\n");
return -1;
}
if (!ReadInput(argv[1]))
{
printf("Error open file %s.\n", argv[1]);
return -1;
}
printf("*** ДВОЙСТВЕННЫЙ СИМПЛЕКС-МЕТОД ***\n\n");
plan_t plan;
bool dual_done = false;
for (int k=0; k<2*m+1; k++)
{
if (k) JGTransformation(base_row, base_column);
EvaluationOptimal();
if (dual_done)
{
plan = CheckStrongPlan();
}
else
{
plan = BuildPsevdoPlan(); // only in dual-simplex
if (DUAL_DONE == plan)
{
dual_done = true;
plan = CheckStrongPlan();
}
}
ShowTable();
if (NEXT_ITERATION != plan)
{
char *s;
switch (plan)
{
case PLAN_OPTIMAL: s="Опорный план оптимальный"; break;
case ODR_BREAK: s="Область допустимых решений разомкнутая"; break;
case ODR_EMPTY: s="Область допустимых решений пустая"; break;
}
printf("\n%s.\n", s);
break;
}
}
FreeMem();
return 0;
}
//-----------------------------------------------------------------------------------------
Результат работы программы
Работу программы мы можем проанализировать по результату . Здесь мы видим первоначальную матрицу, которая представлена в виде симплекс таблицы и результат преобразования таблицы. Результат преобразования таблицы представлен в виде симплекс таблицы, подобной первоначальной.
Проанализировав данные полученные с помощью программы и сравнив их с результатами вычислений можно сделать вывод, что полученные результаты равны между собою, а это значит что программа работает верно.
Подобные документы
Алгоритм решения задач линейного программирования симплекс-методом. Построение математической модели задачи линейного программирования. Решение задачи линейного программирования в Excel. Нахождение прибыли и оптимального плана выпуска продукции.
курсовая работа [1,1 M], добавлен 21.03.2012Общие задачи линейного программирования. Описание алгоритма симплекс-метода, записанного в канонической форме с односторонними ограничениями. Алгоритм построения начального опорного плана для решения задачи. Расширенный алгоритм искусственного базиса.
курсовая работа [142,9 K], добавлен 24.10.2012Особенности метода ветвей и границ как одного из распространенных методов решения целочисленных задач. Декомпозиция задачи линейного программирования в алгоритме метода ветвей и границ. Графический, симплекс-метод решения задач линейного программирования.
курсовая работа [4,0 M], добавлен 05.03.2012Классификация задач математического программирования. Сущность графического метода решения задач линейного программирования, алгоритм табличного симплекс-метода. Описание логической структуры и текст программы по решению задачи графическим методом.
курсовая работа [263,5 K], добавлен 27.03.2011Постановка задачи линейного программирования и формы ее записи. Понятие и методика нахождения оптимального решения. Порядок приведения задач к каноническому виду. Механизмы решения задач линейного программирования аналитическим и графическим способами.
методичка [366,8 K], добавлен 16.01.2010Широкое применение вычислительной техники как в общей математике, так и в одном из её разделов – математических методах. Ознакомление с решением задач линейного программирования симплекс-методом и графически. Составлена программа на языке Delphi.
курсовая работа [57,1 K], добавлен 04.05.2010Задачи оптимизации. Ограничения на допустимое множество. Классическая задача оптимизации. Функция Лагранжа. Линейное программирование: формулировка задач и их графическое решение. Алгебраический метод решения задач. Симплекс-метод, симплекс-таблица.
реферат [478,6 K], добавлен 29.09.2008Анализ метода линейного программирования для решения оптимизационных управленческих задач. Графический метод решения задачи линейного программирования. Проверка оптимального решения в среде MS Excel с использованием программной надстройки "Поиск решения".
курсовая работа [2,2 M], добавлен 29.05.2015Постановка задачи линейного программирования. Решение системы уравнений симплекс-методом. Разработка программы для использования симплекс-метода. Блок-схемы основных алгоритмов. Создание интерфейса, инструкция пользователя по применению программы.
курсовая работа [1,7 M], добавлен 05.01.2015Описание симплекс метода решения задачи линейного программирования. Решение задачи методом Литла на нахождение кратчайшего пути в графе, заданном графически в виде чертежа. Из чертежа записываем матрицу расстояний и поэтапно находим кратчайший путь.
задача [390,4 K], добавлен 10.11.2010