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

 















ТЕМА: «ПК для решения задач линейного программирования симплексным методом»


ВВЕДЕНИЕ


Симплекс-метод - алгоритм решения оптимизационной задачи линейного программирования путём перебора вершин выпуклого многогранника в многомерном пространстве. Метод был разработан советским математиком Канторовичем Л.В. в 1937 году.

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

Идея симплекс-метода заключается в следующем. Сначала нужно найти некоторую (начальную) вершину многогранника допустимых решений (начальное допустимое базисное решение). Затем нужно проверить это решение на оптимальность. Если оно оптимально, то решение найдено; если нет, то перейти к другой вершине многогранника и вновь проверить на оптимальность. Ввиду конечности вершин многогранника (следствие конечности ограничений задачи ЛП) за конечное число "шагов" мы найдем искомую точку минимума или максимума. Надо заметить, что при переходе от одной вершины к другой значение целевой функции убывает (в задаче на минимум) или возрастает (в задаче на максимум).

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

Для выполнения курсовой работы я выбрала язык Object Pascal и среду разработки Delphi. Визуальное построение приложений в Delphi позволяет быстро и качественно создать интерфейс программы, среда разработки имеет низкие требования разработанного приложения к ресурсам компьютера, а также наращиваемость за счет встраивания новых компонент и инструментов в среду Delphi.


1АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ «ПК ДЛЯ РЕШЕНИЯ ЗАДАЧ ЛИНЕЙНОГО ПРОГРАММИРОВАНИЯ СИМПЛЕКСНЫМ МЕТОДОМ»


Линейное программирование представляет собой наиболее часто используемый метод оптимизации. К числу задач линейного программирования можно отнести задачи:

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

оптимизации производственной программы предприятий;

оптимального размещения и концентрации производства;

составления оптимального плана перевозок, работы транспорта;

управления производственными запасами;

и многие другие, принадлежащие сфере оптимального планирования.

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

Первым исследованием по линейному программированию является работа Л.В. Канторовича Математические методы организации и планирования производства, опубликованная в 1939 г. В нем дана постановка задач линейного программирования, разработан метод разрешающих множителей решения задач линейного программирования и дано его теоретическое обоснование.

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

Математическое программирование - это прикладная отрасль математики, которая является теоретической основой решения задач оптимального планирования.

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

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


1.1Постановка задачи линейного программирования


Задача линейного программирования <#"61" src="doc_zip1.jpg" />;(1)

;(2)

.(3)


Симплекс-метод включает в себя:

определение одной из вершин многогранника (исходного опорного плана);

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


1.2 Алгоритм решения задачи линейного программирования симплексным методом


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

Определение 1. Допустимым решением (планом) задачи ЛП называется вектор X=(x1,x2,…,xn), удовлетворяющий всем ее ограничениям (2), (3).

Определение 2. План X=(x1,x2,…,xn) задачи (1) - (3) называется опорным (допустимым базисным решением), если векторы условий Aj=(a1j,a2j,…,amj)T, входящие в разложение вектора A0=(b1,b2,…,bm)T:


(4)


с положительными коэффициентами xj, линейно независимы.

Определение 3. Система m линейно независимых векторов условий {Asi}, , включающая все те Asi, для которых xsi>0, называется базисом опорного плана и обозначается через Бx.

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

Таким образом, если X0=(xs1,xs2,…,xs0,0,…,0) - исходный опорный план задачи с единичным базисом As1,…,Asm и каноническая модель задачи, которая имеет следующий вид


(5)


Из системы (5) следует, что в исходном опорном плане X0 базисные переменные xsi=bi, . Алгоритм симплексного метода начинается с вычисления оптимального решения по такому опорному плану:


X0=(b1,b2,…,bm,0,…,0). (6)


Для исследования X0 на оптимальность необходимо разложить все векторы Aj по векторам базиса Asi:


(7)

и подсчитать разности:


Dj=Zj-cj.(8)


В равенстве (7) xij=aij, поскольку векторы Asi образуют единичный базис.

Записав всю исходную информацию о задаче в таблицу, получим исходную (нулевую) симплексную таблицу (Таблица 1).


Таблица 1 - Нулевая симплексная таблица

iБхСбА0c1…csr…ck…cntA1…Asr…Ak…An1As1cs1xs1xs11…0…x1k…x1nt02As2cs2xs2xs21…0…x2k…x2n……………………………rAsrcsrxsrxr1…1…xrk…xrn……………………………mAsmcsmxsmxm1…0…xmk…xmnm+1--Z0sr=0…kn

Симплекс-таблица заполняется в следующей последовательности: столбец i, строка С, столбец Бx, столбец Сб, столбец A0, столбцы A1,…,An. Так заполняются первые m строк.

В нулевой столбец (m+1)-й строки записывается значение линейной формы для имеющегося опорного плана. Это значение вычисляется по формуле


. (9)


В последующие клетки (m+1)-й строки записываются значения оценок векторов условий Aj (величины Dj), которые вычисляются по формуле

(10)

Базисные разности Dsi=0.

Для проверки опорного плана на оптимальность просматриваем (m+1)-ю строку. При этом могут встретиться такие случаи:

)Все разности Dj£0. Тогда опорный план X0 является оптимальным и minZ=Z0.

)Для некоторого фиксированного j Dj>0 и все коэффициенты xij£0, . Тогда линейная форма не ограничена множеством допустимых решений задачи. В обоих случаях процесс вычисления на этом заканчивается.

)Для некоторых индексов j имеются Dj>0 и для каждого такого j, по крайней мере, одно из чисел xij>0. Это свидетельствует о том, что опорный план не является оптимальным и его можно улучшить за счет введения в базис вектора, отвечающего одной из таких разностей. В базис необходимо ввести тот вектор, которому отвечает maxDj. Если таких разностей несколько, то берут вектор с меньшим номером.

Пусть . Тогда в базис следует ввести вектор Ak на место вектора, которому отвечает минимальное значение выражения


. (11)


Необходимо вывести из базиса вектор Asr, новый базис будет состоять из векторов: As1,As2,…,Asr-1,Asr+1,…,Asm,Ak. В этом случае xrk называют разрешающим элементом симплексной таблицы. Столбец k и строка r называются разрешающими.

Все элементы новой симплексной таблицы с нулевого столбца по n-й и с первой строки по (m+1)-ю преобразовываются при переходе к новому опорному плану по следующим рекуррентным формулам:


(12)


Обычно симплексную таблицу преобразовывают следующим образом. Направляющую строку r делят на разрешающий элемент xrk. В новой симплексной таблице на месте разрешающего элемента получается единица: x=1, а на месте разрешающего столбца получается единичный вектор с единицей в направляющей строке. Остальные строки преобразовываются так: из той строки исходной таблицы, которую необходимо преобразовать, вычитаем преобразованную направляющую, умноженную на тот элемент строки, на месте которого следует получить нуль.

В результате преобразования нулевой симплекс-таблицы по формулам (12) получаем следующую таблицу, в которой содержится новый опорный план. Опять просматриваем (m+1)-ю строку. Если все Dj£0, то опорный план оптимален. В противном случае переходим к новому опорному плану. Процесс продолжается до тех пор, пока придем либо к оптимальному плану, либо убедимся в неограниченности линейной формы. Алгоритм симплексного метода в виде блок-схемы представлен на Рисунке 1.


Рисунок 1 - Представление симплекс-метода в виде блок-схемы


2. ПРОЕТИРОВАНИЕ ПК ДЛЯ РЕШЕНИЯ ЗАДАЧ ЛИНЕЙНОГО ПРОГРАММИРОВАНИЯ СИМПЛЕКСНЫМ МЕТОДОМ


2.1Тестовый вариант решения задачи линейного программирования симплекс-методом


Условие задачи: для изготовления цемента двух видов используется сырье трех видов. Запасы сырья известны и равны соответственно: 264, 136 и 266 т. Количество сырья каждого вида, необходимое для производства единицы цемента первоговида соответственно равны: 12, 4 и 3. Для цемента второго вида: 3, 5 и 14. Прибыль от реализации цемента первого вида составляет 6 у. е., от цемента второго вида - 4 у. е.

Найти максимальное значение целевой функции F(X) = 6x1 + 4x2.

Составить план, обеспечивающий наибольшую прибыль производству:

-записать математическую модель;

-решить задачу симплекс-методом;

Решение:

Математическая модель.- производство цемента первого вида; - производство цемента второго вида;

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

Определим максимальное значение целевой функции F(X) = 6x1+4x2 при следующих условиях (ограничениях).


x1 + 3x2 ? 264;

x1 + 5x2 ? 136 ;

x1 + 14x2 ? 266.

Для построения первого опорного плана приведем систему неравенств к системе уравнений путем введения дополнительных переменных (переход к канонической форме).


x1 + 3x2 + 1x3 + 0x4 + 0x5 = 264;

x1 + 5x2 + 0x3 + 1x4 + 0x5 = 136;

x1 + 14x2 + 0x3 + 0x4 + 1x5 = 266.


Матрица коэффициентов A = a(ij) этой системы уравнений имеет вид:



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

Решим систему уравнений относительно базисных переменных:

x3, x4, x5.

Полагая, что свободные переменные равны 0, получим первый опорный план: X1 = (0,0,264,136,266)


Таблица 2 - Первый опорный план в виде нулевой таблицы

План Базис В x1 x2 x3 x4 x5 0 x3 264 12 3 1 0 0 x4 136 4 5 0 1 0 x5 266 3 14 0 0 1 Индексная строка F(X0) 0 -6 -4 0 0 0

Переходим к основному алгоритму симплекс-метода.


Таблица 3 - Первая симплекс-таблица

План Базис В x1 x2 x3 x4 x5 min 1 x3 264 12 3 1 0 0 22 x4 136 4 5 0 1 0 34 x5 266 3 14 0 0 1 88.67 Индексная строка F(X1) 0 -6 -4 0 0 0 0

Итерация №0.

Текущий опорный план неоптимален, так как в индексной строке находятся отрицательные коэффициенты.

В качестве ведущего выберем столбец, соответствующий переменной x1, так как это наибольший коэффициент по модулю.

Вычислим значения Di по строкам как частное от деления



и из них выберем наименьшее:

Следовательно, 1-ая строка является ведущей. Разрешающий элемент равен 12 и находится на пересечении ведущего столбца и ведущей строки. Формируем следующую часть симплексной таблицы. Вместо переменной x3 в план 1 войдет переменная x1. Строка, соответствующая переменной x1 в плане 1, получена в результате деления всех элементов строки x3плана 0 на разрешающий элемент, равный 12. На месте разрешающего элемента в плане 1 получаем 1. В остальных клетках столбца x1 плана 1 записываем нули. Таким образом, в новом плане 1 заполнены строка x1 и столбец x1 . Все остальные элементы нового плана 1, включая элементы индексной строки, определяются по правилу прямоугольника <#"justify"> План Базис В x1 x2 x3 x4 x5 min 2 x1 22 1 0.25 0.0833 0 0 88 x4 48 0 4 -0.3333 1 0 12 x5 200 0 13.25 -0.25 0 1 15.09Индексная строка F(X2) 132 0 -2.5 0.5 0 0 0

Итерация №1.

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



Следовательно, 2-ая строка является ведущей. Разрешающий элемент равен 4 и находится на пересечении ведущего столбца и ведущей строки.

Формируем следующую часть симплексной таблицы. Вместо переменной x4 в план 2 войдет переменная x2 . Строка, соответствующая переменной x2 в плане 2, получена в результате деления всех элементов строки x4 плана 1 на разрешающий элемент РЭ=4. На месте разрешающего элемента в плане 2 получаем 1. В остальных клетках столбца x2 плана 2 записываем нули.

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


Таблица 5 - Окончательный вариант симплекс-таблицы

План Базис В x1 x2 x3 x4 x5 3 x1 19 1 0 0.1042 -0.0625 0 x2 12 0 1 -0.0833 0.25 0 x5 41 0 0 0.8542 -3.31 1 Индексная строка F(X3) 162 0 0 0.2917 0.625 0

Оптимальный план можно записать так:

= 19; x2 = 12; (X) = 6*19 + 4*12 = 162.


3. РАЗРАБОТКА ПК ДЛЯ РЕШЕНИЯ ЗАДАЧ ЛИНЕЙНОГО ПРОГРАММИРОВАНИЯ СИМПЛЕКСНЫМ МЕТОДОМ


3.1Выбор языка программирования и среды разработки ПК для решения задач линейного программирования симплексным методом


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


3.2Модули и их взаимодействие между собой


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

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

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


Рисунок - 5 Диаграмма переходов состояний (STD)


3.3Описание ПК для решения задач линейного программирования симплексным методом


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

Для работы с программой необходимо открыть exe-файл под названим LP. После чего нужно запустить программу и получить окно следующего вида, показанного на Рисунке 6.


Рисунок 6 - Окно начала работы программы


Для того чтобы создать задачу, нужно нажать на кнопку «Создать новую задачу», которая находится на панели инструментов. Вы увидите на экране окно, изображенное на Рисунке 7, где будут отображаться вводимые пользователем параметры задачи.


Рисунок 7 - Окно для вводимых параметров задачи


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


Рисунок 8 - Задание функции и поиска решений


Рисунок 9 - Задание ограничений задачи


После создания задачи линейного программирования, сохраняем ее, используя кнопку на панели инструментов под названием «Сохранить».

Чтобы решить данную задачу симплекс-методом, выбираем на панели кнопку «Решить задачу симплекс-методом» и получаем исход решения: количество итераций с результатами, а также максимальное значение функции и вектор функции, то есть значения параметров Х, как показано на Рисунке 10.


Рисунок 10 - Полученный результат реализации решения задачи ПК


Для вызова справки необходимо выбрать кнопку на панели инструментов «Справка», после чего на экране отобразиться окно с руководством по эксплуатации разработанного ПК (Рисунок 11).


Рисунок 11 - Вызов справки


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


ВЫВОДЫ

программа линейный симплекс модуль

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

Разработанная программа в среде Delphi имеет простой и удобный интерфейс для любого пользователя, не требует дополнительных ресурсов в виде свободного места на диске, так как вычисления производятся только в оперативной памяти.


ЛИТЕРАТУРА


1 #"center">ПРИЛОЖЕНИЕ А


Листинг программы:

{ Private declarations }CreateChild(const Name: String);

{ Public declarations }

end;

var: TMainForm;:integer;

uses Parameters, About;

{$R *.DFM}

TMainForm.CreateChild(const Name: String);: TChildForm;:=TChildForm.Create(Application);.Caption:=Name;;

TMainForm.ExitPClick(Sender: TObject);;;

TMainForm.NewClick(Sender: TObject);('Задача '+IntToStr(MDIChildCount+1));;

TMainForm.FileMenuClick(Sender: TObject);ActiveMDIChild<>nil then.CloseChild.Enabled:=true;.Save.Enabled:=true;.SaveAs.Enabled:=true;.Print.Enabled:=true.CloseChild.Enabled:=false;.Save.Enabled:=false;.SaveAs.Enabled:=false;.Print.Enabled:=false;

TMainForm.CloseChildClick(Sender: TObject);ActiveMDIChild<>nil then ActiveMDIChild.Close;;

TMainForm.EditClick(Sender: TObject);ActiveMDIChild<>nil then.ChangeFun.Enabled:=true;.AddLim.Enabled:=true;.DelLim.Enabled:=true;.N8.Enabled:=true;.N20.Enabled:=true;.N22.Enabled:=true;.N24.Enabled:=true;.N25.Enabled:=true;.ChangeFun.Enabled:=false;.AddLim.Enabled:=false;.DelLim.Enabled:=false;.N8.Enabled:=false;.N20.Enabled:=false;.N22.Enabled:=false;.N24.Enabled:=false;.N25.Enabled:=false;;

TMainForm.ChangeFunClick(Sender: TObject);.PageControl1.ActivePageIndex:=0;.ShowModal;;

TMainForm.AddLimClick(Sender: TObject);.PageControl1.ActivePageIndex:=1;.ShowModal;;

TMainForm.N2Click(Sender: TObject);.Enabled:=False;.Visible:=true;;

TMainForm.N14Click(Sender: TObject);;

TMainForm.N15Click(Sender: TObject);;

TMainForm.N16Click(Sender: TObject);;

TMainForm.N18Click(Sender: TObject);i: integer;i:=mdichildcount-1 downto 0 do[i].WindowState:=wsminimized;;

TMainForm.N5Click(Sender: TObject);ActiveMDIChild<>nil then.N6.Enabled:=true;.N7.Enabled:=true;.N30.Enabled:=true.N6.Enabled:=false;.N7.Enabled:=false;.N30.Enabled:=false;;

TMainForm.N13Click(Sender: TObject);ActiveMDIChild<>nil then.N14.Enabled:=true;.N15.Enabled:=true;.N16.Enabled:=true;.N18.Enabled:=true;.N14.Enabled:=false;.N15.Enabled:=false;.N16.Enabled:=false;.N18.Enabled:=false;;;TMainForm.N4Click(Sender: TObject);.HelpCommand(3, 0);;


//Симплекс-методTMainForm.N6Click(Sender: TObject);,SimplexTableNew:array of array of extended;:array of extended;:array of extended;:extended;,i,j,MoreCount,LessCount,EquallyCount,extrItem,WLine,IterCount: integer;,bil:boolean;fin,up;:=true;bil:=false;IterCount:=0;:=nil;:=0;LessCount:=0;EquallyCount:=0;

{1}//Сортировка ограничений: 1) >=; 2) =; 3) <=.

{2}//Порождение начального базиса

{3}//Итерационное построение симплекс-таблиц


{1}//---------------------------------------------------------------------------

//Сортировка "Больше"MainForm.ActiveMDIChild as TChildForm do

//строки в таблицах дочернего окна нумеруются с 1

//нулевая строка резервнаяi:=1 to SignsChild.RowCount-1 do(SignsChild.Cells[0,i]='>') or (SignsChild.Cells[0,i]='>=') then(MoreCount);(SimplexTable,LimChild.ColCount+2,MoreCount);

//коэффициентыj:=0 to LimChild.ColCount-1 do[j+2,MoreCount-1]:=StrToFloat(LimChild.cells[j,i]);

//Пока нули (потом базис...)[0,MoreCount-1]:=0;

//Значение (B i-ый)[1,MoreCount-1]:=StrToFloat(BChild.cells[0,i]);;;


//Сортировка "Равно"i:=1 to SignsChild.RowCount-1 doSignsChild.Cells[0,i]='=' then(EquallyCount);(SimplexTable,LimChild.ColCount+2,MoreCount+EquallyCount);

//коэффициентыj:=0 to LimChild.ColCount-1 do[j+2,MoreCount+EquallyCount-1]:=StrToFloat(LimChild.cells[j,i]);

//Пока нули (потом базис...)[0,MoreCount+EquallyCount-1]:=0;

//Значение (B i-ый)[1,MoreCount+EquallyCount-1]:=StrToFloat(BChild.cells[0,i]);;;


//Сортировка "Меньше"i:=1 to SignsChild.RowCount-1 do(SignsChild.Cells[0,i]='<') or (SignsChild.Cells[0,i]='<=') then(LessCount);(SimplexTable,LimChild.ColCount+2,MoreCount+EquallyCount+LessCount);

//коэффициентыj:=0 to LimChild.ColCount-1 do[j+2,MoreCount+EquallyCount+LessCount-1]:=StrToFloat(LimChild.cells[j,i]);

//Пока нули (потом базис...)[0,MoreCount+EquallyCount+LessCount-1]:=0;

//Значение (B i-ый)[1,MoreCount+EquallyCount+LessCount-1]:=StrToFloat(BChild.cells[0,i]);;;;

{2}//---------------------------------------------------------------------------


//Порождение начального базиса

//2.1 Добавить коэф. -1 (>=)j:=0 to MoreCount-1 do(SimplexTable,length(SimplexTable)+1,MoreCount+EquallyCount+LessCount);i:=length(SimplexTable)-MoreCount+1 to length(SimplexTable)-1 do[i,j]:=0;[length(SimplexTable)-1,j]:=-1;;


//2.2 Добавить коэф. 1 (<=)j:=MoreCount+EquallyCount to MoreCount+EquallyCount+LessCount-1 do(SimplexTable,length(SimplexTable)+1,MoreCount+EquallyCount+LessCount);i:=length(SimplexTable)-LessCount+2 to length(SimplexTable)-1 do[i,j]:=0;[length(SimplexTable)-1,j]:=1;;


//2.3 Добавить искусственные коэф. (>= и =)j:=0 to MoreCount+EquallyCount-1 do(SimplexTable,length(SimplexTable)+1,MoreCount+EquallyCount+LessCount);i:=length(SimplexTable)-MoreCount+1 to length(SimplexTable)-1 do[i,j]:=0;[length(SimplexTable)-1,j]:=1;;


//Целевая функция GoalFun:=nil;MainForm.ActiveMDIChild as TChildForm do(GoalFun,GoalChild.ColCount+1);i:=1 to GoalChild.ColCount doparametersForm.Min.Checked then GoalFun[i]:=StrToFloat(goalChild.Cells[i-1,1])GoalFun[i]:=-1*StrToFloat(goalChild.Cells[i-1,1]);;;

//Искусственная функция ArtFun:=nil;(ArtFun,length(SimplexTable)-1-MoreCount);

//i=1 - Значение иск. функцииi:=1 to length(SimplexTable)-3 doj:=0 to MoreCount-1 do ArtFun[i-1]:=ArtFun[i-1]-SimplexTable[i,j];


//------------------------------------------------------------------------------

//Минимизация искусственной функции

//БазисMoreCount>0 thenj:=0 to MoreCount-1 do[0,j]:=length(simplexTable)-MoreCount+j-1;i:=MoreCount to length(simplexTable[0])-1 do[0,i]:=length(simplexTable)-(LessCount+EquallyCount+MoreCount)+(i-MoreCount)-1;i:=0 to LessCount+EquallyCount-1 do[0,i]:=length(simplexTable)-(LessCount+EquallyCount+MoreCount)+i-1;


//2 нижние строки для оценок(SimplexTable,length(SimplexTable),length(SimplexTable[0])+2);i:=0 to length(GoalFun)-1 do SimplexTable[i+1,length(SimplexTable[0])-2]:=goalFun[i];i:=0 to length(ArtFun)-1 do SimplexTable[i+1,length(SimplexTable[0])-1]:=ArtFun[i];

:=nil;(SimplexTableNew,length(SimplexTable),length(SimplexTable[0]));

//итерации...:not art then inc(IterCount);IterCount=Parametersform.CountIteration.Value thenMainForm.ActiveMDIChild as TChildForm do.Items.Add('');.Items.Add('Достигнуто предельное число итераций. Решение не найдено');;;;

{

//Может функция не ограничена? => поиск столбца с отрицательными коэф.:=0;art theni:=2 to length(simplexTable)-1 dosimplexTable[i,length(SimplexTable[0])-1]<0 then

// k:=0;j:=0 to length(SimplexTable[0])-3 dosimplexTable[i,j]<=0 then inc(k);k=length(SimplexTable[0])-2 thenMainForm.ActiveMDIChild as TChildForm do.Items.Add('');.Items.Add('Невозможно найти начальный базис');;;:=0;;;;:=0;not art theni:=2 to length(simplexTable)-1 dosimplexTable[i,length(SimplexTable[0])-1]<0 then:=0;j:=0 to length(SimplexTable[0])-2 dosimplexTable[i,j]<=0 then inc(k);k=length(SimplexTable[0])-1 thenMainForm.ActiveMDIChild as TChildForm do.Items.Add('');.Items.Add('Целевая функция не ограничена');;;;;;

}


//поиск первой минимальной из отрицательных оценки искуственной функции:=100000;:=0;i:=2 to length(simplexTable)-1 do(SimplexTable[i,length(SimplexTable[0])-1]<ExtrEstimation) and (SimplexTable[i,length(SimplexTable[0])-1]<0) then:=i-1;{новый базис}:=SimplexTable[i,length(SimplexTable[0])-1];;ExtrEstimation=100000 then goto fin;


{ВНИМАНИЕ!!! Delphi пропускает не используемые (по мнению Delphi) операторы.}


//выбор рабочей строки (поиск минимального из положительных):=100000;:=0;j:=0 to length(simplexTable[0])-2 doSimplexTable[extrItem+1,j]<>0 then(SimplexTable[1,j]/SimplexTable[extrItem+1,j]<ExtrEstimation) and (SimplexTable[1,j]*SimplexTable[extrItem+1,j]>0) then:=j;:=SimplexTable[1,j]/SimplexTable[extrItem+1,j];;;

//новый базисi:=0 to length(SimplexTable[0])-1 do SimplexTableNew[0,i]:=SimplexTable[0,i];[0,WLine]:=extrItem;

//перерасчет рабочей строкиi:=1 to length(SimplexTable)-1 do SimplexTableNew[i,WLine]:=SimplexTable[I,wlINE]/SimplexTable[extrItem+1,wlINE];

//перерасчет коэффициентовi:=1 to length(SimplexTable)-1 doj:=0 to length(SimplexTable[0])-1 doj<>WLine then[i,j]:=SimplexTable[i,j]-SimplexTable[i,Wline]*SimplexTable[extrItem+1,j]/SimplexTable[extrItem+1,WLine];

//копирование таблицi:=0 to length(SimplexTable)-1 do for j:=0 to length(SimplexTable[0])-1 do SimplexTable[i,j]:=SimplexTableNew[i,j];

//Вывод текущего решенияParametersForm.CheckBox1.Checked then begin:=false;not art thenMainForm.ActiveMDIChild as TChildForm do.Items.Add('');.Items.Add('Итерация '+InttoStr(IterCount));i:=0 to GoalChild.ColCount-1 doj:=0 to length(SimplexTable[0])-1 doi+1=SimplexTable[0,j] then.Items.Add(' '+GoalChild.Cells[i,0]+'='+FloatToStr(SimplexTable[1,j]));:=true;;not bil then task.Items.Add(' '+GoalChild.Cells[i,0]+'=0');:=false;;;;

false;:art then:=false;(SimplexTable,Length(SimplexTable)-MoreCount,Length(SimplexTable[0])-1);up;;

//РезультатMainForm.ActiveMDIChild as TChildForm do.Items.Add('');.Items.Add('Результат');i:=0 to GoalChild.ColCount-1 doj:=0 to length(SimplexTable[0])-1 doi+1=SimplexTable[0,j] then.Items.Add(' '+GoalChild.Cells[i,0]+'='+FloatToStr(SimplexTable[1,j]));:=true;;not bil then task.Items.Add(' '+GoalChild.Cells[i,0]+'=0');:=false;;.Items.Add('');parametersForm.Min.Checked then.Items.Add('Минимальное значение функции '+FloatToStr(-1*(SimplexTable[1,length(SimplexTable[0])-1]))).Items.Add('Максимальное значение функции '+FloatToStr(SimplexTable[1,length(SimplexTable[0])-1]));;;

TMainForm.SaveAsClick(Sender: TObject);: String;SaveDialog1 doActiveMDIChild.Caption[1]='З' then:=ActiveMDIChild.Caption+'.tsk':=ActiveMDIChild.Caption;:=ExtractFileExt(FileName);length(Fext)=0 then:='.tsk';:='Files (*'+FExt+')|*'+FExt;Execute thenActiveMDIchild as TChildForm do(FileName);;;

TMainForm.PrintClick(Sender: TObject);.Execute;;

TMainForm.OpenClick(Sender: TObject);:string;,k:integer;OpenDialog1.Execute thenfileMenu donot N11.Visible then N11.Visible:=true;:=IndexOf(N1Name1);i:=count-3 downto k+1 do:=items[i-1].caption;[2]:=chr(ord('0')+(i-k+1));[i].Caption:=S;[i].Visible:=Items[i-1].Visible;;name1.Caption:='&1 '+OpenDialog1.FileName;name1.Visible:=true;;(OpenDialog1.FileName);ActiveMDIChild as TChildForm do(OpenDialog1.FileName);.FormShow(Sender);.Button3Click(Sender);;;

TMainForm.N27Click(Sender: TObject);.checked:=not N27.checked;N27.checked then toolbar1.Visible:=true else toolbar1.Visible:=false;;

TMainForm.N28Click(Sender: TObject);.checked:=not N28.checked;N28.checked then statusbar1.Visible:=true else statusbar1.Visible:=false;;TMainForm.N7Click(Sender: TObject);,SimplexTableNew:array of array of extended;:array of extended;:array of extended;:extended;,i,j,MoreCount,LessCount,EquallyCount,extrItem,WLine,IterCount: integer;,bil:boolean;fin,up,up2;:=true;bil:=false;IterCount:=0;:=nil;:=0;LessCount:=0;EquallyCount:=0;

{1}//Сортировка ограничений: 1) >=; 2) =; 3) <=.

{2}//Порождение начального базиса

{3}//Итерационное построение симплекс-таблиц


{1}//---------------------------------------------------------------------------

//Сортировка "Больше"MainForm.ActiveMDIChild as TChildForm do

//строки в таблицах дочернего окна нумеруются с 1

//нулевая строка резервнаяi:=1 to SignsChild.RowCount-1 do(SignsChild.Cells[0,i]='>') or (SignsChild.Cells[0,i]='>=') then(MoreCount);(SimplexTable,LimChild.ColCount+2,MoreCount);

//коэффициентыj:=0 to LimChild.ColCount-1 do[j+2,MoreCount-1]:=StrToFloat(LimChild.cells[j,i]);

//Пока нули (потом базис...)[0,MoreCount-1]:=0;

//Значение (B i-ый)[1,MoreCount-1]:=StrToFloat(BChild.cells[0,i]);;;


//Сортировка "Равно"i:=1 to SignsChild.RowCount-1 doSignsChild.Cells[0,i]='=' then(EquallyCount);(SimplexTable,LimChild.ColCount+2,MoreCount+EquallyCount);

//коэффициентыj:=0 to LimChild.ColCount-1 do[j+2,MoreCount+EquallyCount-1]:=StrToFloat(LimChild.cells[j,i]);

//Пока нули (потом базис...)[0,MoreCount+EquallyCount-1]:=0;

//Значение (B i-ый)[1,MoreCount+EquallyCount-1]:=StrToFloat(BChild.cells[0,i]);;;


//Сортировка "Меньше"i:=1 to SignsChild.RowCount-1 do(SignsChild.Cells[0,i]='<') or (SignsChild.Cells[0,i]='<=') then(LessCount);(SimplexTable,LimChild.ColCount+2,MoreCount+EquallyCount+LessCount);

//коэффициентыj:=0 to LimChild.ColCount-1 do[j+2,MoreCount+EquallyCount+LessCount-1]:=StrToFloat(LimChild.cells[j,i]);

//Пока нули (потом базис...)[0,MoreCount+EquallyCount+LessCount-1]:=0;

//Значение (B i-ый)[1,MoreCount+EquallyCount+LessCount-1]:=StrToFloat(BChild.cells[0,i]);;;;

{2}//---------------------------------------------------------------------------


//Порождение начального базиса

//2.1 Добавить коэф. -1 (>=)j:=0 to MoreCount-1 do(SimplexTable,length(SimplexTable)+1,MoreCount+EquallyCount+LessCount);i:=length(SimplexTable)-MoreCount+1 to length(SimplexTable)-1 do[i,j]:=0;[length(SimplexTable)-1,j]:=-1;;


//2.2 Добавить коэф. 1 (<=)j:=MoreCount+EquallyCount to MoreCount+EquallyCount+LessCount-1 do(SimplexTable,length(SimplexTable)+1,MoreCount+EquallyCount+LessCount);i:=length(SimplexTable)-LessCount+2 to length(SimplexTable)-1 do[i,j]:=0;[length(SimplexTable)-1,j]:=1;;


//2.3 Добавить искусственные коэф. (>= и =)j:=0 to MoreCount+EquallyCount-1 do(SimplexTable,length(SimplexTable)+1,MoreCount+EquallyCount+LessCount);i:=length(SimplexTable)-MoreCount+1 to length(SimplexTable)-1 do[i,j]:=0;[length(SimplexTable)-1,j]:=1;;


//Целевая функция GoalFun:=nil;MainForm.ActiveMDIChild as TChildForm do(GoalFun,GoalChild.ColCount+1);i:=1 to GoalChild.ColCount doparametersForm.Min.Checked then GoalFun[i]:=StrToFloat(goalChild.Cells[i-1,1])GoalFun[i]:=-1*StrToFloat(goalChild.Cells[i-1,1]);;;

//Искусственная функция ArtFun:=nil;(ArtFun,length(SimplexTable)-1-MoreCount);

//i=1 - Значение иск. функцииi:=1 to length(SimplexTable)-3 doj:=0 to MoreCount-1 do ArtFun[i-1]:=ArtFun[i-1]-SimplexTable[i,j];


//------------------------------------------------------------------------------

//Минимизация искусственной функции

//БазисMoreCount>0 thenj:=0 to MoreCount-1 do[0,j]:=length(simplexTable)-MoreCount+j-1;i:=MoreCount to length(simplexTable[0])-1 do[0,i]:=length(simplexTable)-(LessCount+EquallyCount+MoreCount)+(i-MoreCount)-1;i:=0 to LessCount+EquallyCount-1 do[0,i]:=length(simplexTable)-(LessCount+EquallyCount+MoreCount)+i-1;


//2 нижние строки для оценок(SimplexTable,length(SimplexTable),length(SimplexTable[0])+2);i:=0 to length(GoalFun)-1 do SimplexTable[i+1,length(SimplexTable[0])-2]:=goalFun[i];i:=0 to length(ArtFun)-1 do SimplexTable[i+1,length(SimplexTable[0])-1]:=ArtFun[i];


//итерации...:not art then inc(IterCount);IterCount=Parametersform.CountIteration.Value thenMainForm.ActiveMDIChild as TChildForm do.Items.Add('');.Items.Add('Достигнуто предельное число итераций. Решение не найдено');;;;


//Может функция не ограничена? => поиск столбца с отрицательными коэф.:=0;art theni:=2 to length(simplexTable)-1 dosimplexTable[i,length(SimplexTable[0])-1]<0 then

// k:=0;j:=0 to length(SimplexTable[0])-3 dosimplexTable[i,j]<=0 then inc(k);k=length(SimplexTable[0])-2 thenMainForm.ActiveMDIChild as TChildForm do.Items.Add('');.Items.Add('Невозможно найти начальный базис');;;:=0;;;;:=0;not art theni:=2 to length(simplexTable)-1 dosimplexTable[i,length(SimplexTable[0])-1]<0 then:=0;j:=0 to length(SimplexTable[0])-2 dosimplexTable[i,j]<=0 then inc(k);k=length(SimplexTable[0])-1 thenMainForm.ActiveMDIChild as TChildForm do.Items.Add('');.Items.Add('Целевая функция не ограничена');;;;;;


//поиск первой минимальной из отрицательных оценки искуственной функции:=100000;:=0;i:=2 to length(simplexTable)-1 do(SimplexTable[i,length(SimplexTable[0])-1]<ExtrEstimation) and (SimplexTable[i,length(SimplexTable[0])-1]<0) then:=i-1;{новый базис}:=SimplexTable[i,length(SimplexTable[0])-1];;ExtrEstimation=100000 then goto fin;


{ВНИМАНИЕ!!! Delphi пропускает не используемые (по мнению Delphi) операторы.}


//выбор рабочей строки (поиск минимального из положительных):=100000;:=0;j:=0 to length(simplexTable[0])-2 doSimplexTable[extrItem+1,j]<>0 then(SimplexTable[1,j]/SimplexTable[extrItem+1,j]<ExtrEstimation) and (SimplexTable[1,j]*SimplexTable[extrItem+1,j]>0) then:=j;:=SimplexTable[1,j]/SimplexTable[extrItem+1,j];;;

::=nil;(SimplexTableNew,length(SimplexTable),length(SimplexTable[0]));

//новый базисi:=0 to length(SimplexTable[0])-1 do SimplexTableNew[0,i]:=SimplexTable[0,i];[0,WLine]:=extrItem;

//перерасчет рабочей строкиi:=1 to length(SimplexTable)-1 do SimplexTableNew[i,WLine]:=SimplexTable[I,wlINE]/SimplexTable[extrItem+1,wlINE];

//перерасчет коэффициентовi:=1 to length(SimplexTable)-1 doj:=0 to length(SimplexTable[0])-1 doj<>WLine then[i,j]:=SimplexTable[i,j]-SimplexTable[i,Wline]*SimplexTable[extrItem+1,j]/SimplexTable[extrItem+1,WLine];

//копирование таблицi:=0 to length(SimplexTable)-1 do for j:=0 to length(SimplexTable[0])-1 do SimplexTable[i,j]:=SimplexTableNew[i,j];

//Вывод текущего решенияParametersForm.CheckBox1.Checked then begin:=false;not art thenMainForm.ActiveMDIChild as TChildForm do.Items.Add('');.Items.Add('Итерация '+InttoStr(IterCount));i:=0 to GoalChild.ColCount-1 doj:=0 to length(SimplexTable[0])-1 doi+1=SimplexTable[0,j] then.Items.Add(' '+GoalChild.Cells[i,0]+'='+FloatToStr(SimplexTable[1,j]));:=true;;not bil then task.Items.Add(' '+GoalChild.Cells[i,0]+'=0');:=false;;;;

until false;:art then:=false;(SimplexTable,Length(SimplexTable)-MoreCount,Length(SimplexTable[0])-1);up;;

//Если среди базисных переменных нет дробных то конец...:=false;i:=0 to ParametersForm.dim1.Value-1 do(SimplexTable[0,i]<=ParametersForm.dim1.Value) and (SimplexTable[1,i]<>trunc(SimplexTable[1,i])) then bil:=true;not bil then

//РезультатMainForm.ActiveMDIChild as TChildForm do.Items.Add('');.Items.Add('Результат');i:=0 to GoalChild.ColCount-1 doj:=0 to length(SimplexTable[0])-1 doi+1=SimplexTable[0,j] then.Items.Add(' '+GoalChild.Cells[i,0]+'='+FloatToStr(SimplexTable[1,j]));:=true;;not bil then task.Items.Add(' '+GoalChild.Cells[i,0]+'=0');:=false;;.Items.Add('');parametersForm.Min.Checked then.Items.Add('Минимальное значение функции '+FloatToStr(-1*(SimplexTable[1,length(SimplexTable[0])-1]))).Items.Add('Максимальное значение функции '+FloatToStr(SimplexTable[1,length(SimplexTable[0])-1]));;;;

//Дополнительная строка и столбец(SimplexTable,Length(SimplexTable)+1,Length(SimplexTable[0])+1);i:=0 to Length(SimplexTable)-1 do[i,Length(SimplexTable[0])-1]:=SimplexTable[i,Length(SimplexTable[0])-2];i:=0 to Length(SimplexTable[0])-1 do SimplexTable[Length(SimplexTable)-1,i]:=0;[Length(SimplexTable)-1,Length(SimplexTable[0])-2]:=1;

//поиск максимальной дробной части:=0;:=0;i:=0 to Length(SimplexTable[0])-3 do(abs(SimplexTable[1,i]-trunc(SimplexTable[1,i]))>ExtrEstimation) and (abs(SimplexTable[1,i]-round(SimplexTable[1,i]))>0.001) then:=abs(SimplexTable[1,i]-trunc(SimplexTable[1,i]));:=i;;;(goalfun,Length(goalfun)+1);[Length(goalfun)-1]:=0;[0,Length(SimplexTable[0])-2]:=Length(SimplexTable)-2;[1,Length(SimplexTable[0])-2]:=-ExtrEstimation/ExtrEstimation;i:=2 to Length(SimplexTable)-2 do[i,Length(SimplexTable[0])-2]:=-(abs(SimplexTable[i,WLine]-trunc(SimplexTable[i,WLine])))/ExtrEstimation;;[round(SimplexTable[0,WLine])+1,Length(SimplexTable[0])-2]:=0;


//поиск первой минимальной из положительных оценки искуственной функции:=100000;:=0;i:=2 to length(simplexTable)-1 do(SimplexTable[i,length(SimplexTable[0])-1]<ExtrEstimation) and (SimplexTable[i,length(SimplexTable[0])-1]>0) then:=i-1;{новый базис}:=SimplexTable[i,length(SimplexTable[0])-1];

;

//??? if ExtrEstimation=-100000 then goto fin;:=length(SimplexTable[0])-2;up2;

;

TMainForm.SaveClick(Sender: TObject);pos('Задача',activemdichild.caption)=1 then(Sender) else with activemdichild as TChildForm do(Caption);;

TMainForm.DelLimClick(Sender: TObject);i:byte;ActiveMDIChild as TChildForm doItemDel<4 then MessageDlg('Ограничение не выбрано',mtWarning,[mbOK],0) else.FormShow(Sender);i:=0 to ItemDel-5 do ParametersForm.BitBtn3Click(Sender);.BitBtn1Click(Sender);.Button3Click(Sender);;;;

TMainForm.N8Click(Sender: TObject);i:byte;Mainform.ActiveMDIChild as TChildForm do.ColCount:=2;.ColCount:=2;.RowCount:=1;.RowCount:=1;.RowCount:=1;i:=0 to 1 do.Cells[i,1]:='0';.Cells[0,0]:='X1';.Cells[1,0]:='X2';.Clear;;;

TMainForm.N1Name1Click(Sender: TObject);FileName:string;sender as TMenuItem do:=caption;.Delete(FileName,1,2);;(OpenDialog1.FileName);ActiveMDIChild as TChildForm do(OpenDialog1.FileName);.FormShow(Sender);.Button3Click(Sender);;


end.


ТЕМА: «ПК для решения задач линейного программирования симплексным методом» ВВЕДЕНИЕ

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ