Файл: пк для решения задач линейного программирования симплексным методом.doc
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 09.11.2023
Просмотров: 57
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Для выполнения курсового проекта я выбрала язык Object Pascal и среду разработки Delphi. Delphi сочетает в себе удобство визуальных методов разработки, производительность оптимизирующего компилятора и мощность. Delphi позволяет многократно использовать однажды созданный код, уменьшая время, потраченное на разработку. Это мощный язык программирования, включающий обработку ошибочных ситуаций, позволяющих повысить надежность программ. Новые и улучшенные способы доступа к данным, увеличение вероятности повторного использования кода, благодаря наследованию визуальных форм и другие возможности этого инструмента.
3.2 Модули и их взаимодействие между собой
В рамках поставленной задачи был разработан программный модуль, осуществляющий решение задачи линейного программирования на основе начального допустимого базисного решения.
Входными данными является текстовый файл, содержащий начальное допустимое базисное решение (на входные данные накладываются следующие ограничения: максимальное количество свободных и базисных переменных).
Выходными данными является полученный вектор решения, максимальное или минимальное значение функции, а также сообщение о состоянии выполнения программы (произведенные итерации).
SDT-диаграмма (диаграмма переходов состояний) демонстрирует поведение разрабатываемой программной системы при получении управляющих воздействий (извне), как показано на Рисунке 5.
Рисунок – 5 Диаграмма переходов состояний (STD)
3.3 Описание ПК для решения задач линейного программирования симплексным методом
Разработанная программа решает задачи линейного программирования симплексным методом и выдает на экран результат, а именно – максимальное или минимальное значение функции, количество итераций с промежуточными результатами и значения X.
Для работы с программой необходимо открыть exe-файл под названим LP. После чего нужно запустить программу и получить окно следующего вида, показанного на Рисунке 6.
Рисунок 6 – Окно начала работы программы
Для того чтобы создать задачу, нужно нажать на кнопку «Создать новую задачу», которая находится на панели инструментов. Вы увидите на экране окно, изображенное на Рисунке 7, где будут отображаться вводимые пользователем параметры задачи.
Рисунок 7 – Окно для вводимых параметров задачи
После чего на панели инструментов выбрать кнопку «Параметры задачи», где задаются значения функции, ее ограничения, как изображено на Рисунках 8-9.
Рисунок 8 – Задание функции и поиска решений
Рисунок 9 – Задание ограничений задачи
После создания задачи линейного программирования, сохраняем ее, используя кнопку на панели инструментов под названием «Сохранить».
Чтобы решить данную задачу симплекс-методом, выбираем на панели кнопку «Решить задачу симплекс-методом» и получаем исход решения: количество итераций с результатами, а также максимальное значение функции и вектор функции, то есть значения параметров Х, как показано на Рисунке 10.
Рисунок 10 – Полученный результат реализации решения задачи ПК
Для вызова справки необходимо выбрать кнопку на панели инструментов «Справка», после чего на экране отобразиться окно с руководством по эксплуатации разработанного ПК (Рисунок 11).
Рисунок 11 – Вызов справки
Операции добавления ограничений, удаления и редактирования других параметров могут производиться по необходимости неопределенное количество раз.
ВЫВОДЫ
программа линейный симплекс модуль
В курсовой работе был рассмотрен и проанализирован алгоритм симплекс метода, а также разработана программа для решения разного рода задач линейного программирования, был составлен текстовый пример, показывающий не только простоту и экономичность работы, но и подтверждающий правильность реализации расчетов задачи в ПК.
Разработанная программа в среде Delphi имеет простой и удобный интерфейс для любого пользователя, не требует дополнительных ресурсов в виде свободного места на диске, так как вычисления производятся только в оперативной памяти.
ЛИТЕРАТУРА
1 http://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%BC%D0%BF%D0% BB% D0%B5%D0%BA%D1%81%D0%
BC%D0%B5%D1%82%D0%BE%D0%B4
2 http://saim.ts6.ru/pages/8.htm
3 Г. Жимерин, В.А. Мясников – «Автоматизированные и автоматические системы уравнения» – 1975г.
4 Е.С. Венцель – «Исследование операций» – 1972г.
5 http://math.semestr.ru/simplex/primersolve.php
6 МУ к ЛР " Методы условной оптимизации " по дисциплине "Методы синтеза и оптимизации"/Сост.: Г.Б. Билык, О.В. Веремей. - Краматорск: ДГМА, 2000. - 56с.
7 Мину М. Математическое программирование. - М.: Наука, 1990. – 488 с.
ПРИЛОЖЕНИЕ А
Листинг программы:
private
{ Private declarations }
procedure CreateChild(const Name: String);
public
{ Public declarations }
end;
var
MainForm: TMainForm;
ItemDel:integer;
implementation
uses Parameters, About;
{$R *.DFM}
procedure TMainForm.CreateChild(const Name: String);
var
Child: TChildForm;
begin
Child:=TChildForm.Create(Application);
child.Caption:=Name;
end;
procedure TMainForm.ExitPClick(Sender: TObject);
begin
Close;
end;
procedure TMainForm.NewClick(Sender: TObject);
begin
CreateChild('Задача '+IntToStr(MDIChildCount+1));
end;
procedure TMainForm.FileMenuClick(Sender: TObject);
begin
if ActiveMDIChild<>nil then
begin
MainForm.CloseChild.Enabled:=true;
MainForm.Save.Enabled:=true;
MainForm.SaveAs.Enabled:=true;
MainForm.Print.Enabled:=true
end
else
begin
MainForm.CloseChild.Enabled:=false;
MainForm.Save.Enabled:=false;
MainForm.SaveAs.Enabled:=false;
MainForm.Print.Enabled:=false
end
end;
procedure TMainForm.CloseChildClick(Sender: TObject);
begin
if ActiveMDIChild<>nil then ActiveMDIChild.Close;
end;
procedure TMainForm.EditClick(Sender: TObject);
begin
if ActiveMDIChild<>nil then
begin
MainForm.ChangeFun.Enabled:=true;
MainForm.AddLim.Enabled:=true;
MainForm.DelLim.Enabled:=true;
MainForm.N8.Enabled:=true;
MainForm.N20.Enabled:=true;
MainForm.N22.Enabled:=true;
MainForm.N24.Enabled:=true;
MainForm.N25.Enabled:=true;
end
else
begin
MainForm.ChangeFun.Enabled:=false;
MainForm.AddLim.Enabled:=false;
MainForm.DelLim.Enabled:=false;
MainForm.N8.Enabled:=false;
MainForm.N20.Enabled:=false;
MainForm.N22.Enabled:=false;
MainForm.N24.Enabled:=false;
MainForm.N25.Enabled:=false;
end
end;
procedure TMainForm.ChangeFunClick(Sender: TObject);
begin
ParametersForm.PageControl1.ActivePageIndex:=0;
ParametersForm.ShowModal;
end;
procedure TMainForm.AddLimClick(Sender: TObject);
begin
ParametersForm.PageControl1.ActivePageIndex:=1;
ParametersForm.ShowModal;
end;
procedure TMainForm.N2Click(Sender: TObject);
begin
MainForm.Enabled:=False;
AboutForm.Visible:=true;
end;
procedure TMainForm.N14Click(Sender: TObject);
begin
Cascade
end;
procedure TMainForm.N15Click(Sender: TObject);
begin
Tile
end;
procedure TMainForm.N16Click(Sender: TObject);
begin
ArrangeIcons
end;
procedure TMainForm.N18Click(Sender: TObject);
var i: integer;
begin
for i:=mdichildcount-1 downto 0 do
mdichildren[i].WindowState:=wsminimized;
end;
procedure TMainForm.N5Click(Sender: TObject);
begin
if ActiveMDIChild<>nil then
begin
MainForm.N6.Enabled:=true;
MainForm.N7.Enabled:=true;
MainForm.N30.Enabled:=true
end
else
begin
MainForm.N6.Enabled:=false;
MainForm.N7.Enabled:=false;
MainForm.N30.Enabled:=false;
end
end;
procedure TMainForm.N13Click(Sender: TObject);
begin
if ActiveMDIChild<>nil then
begin
MainForm.N14.Enabled:=true;
MainForm.N15.Enabled:=true;
MainForm.N16.Enabled:=true;
MainForm.N18.Enabled:=true;
end
else
begin
MainForm.N14.Enabled:=false;
MainForm.N15.Enabled:=false;
MainForm.N16.Enabled:=false;
MainForm.N18.Enabled:=false;
end;
end;
procedure TMainForm.N4Click(Sender: TObject);
begin
Application.HelpCommand(3, 0);
end;
//Симплекс-метод
procedure TMainForm.N6Click(Sender: TObject);
var
SimplexTable,SimplexTableNew:array of array of extended;
GoalFun:array of extended;
ArtFun:array of extended;
ExtrEstimation:extended;
k,i,j,MoreCount,LessCount,EquallyCount,extrItem,WLine,IterCount: integer;
Art,bil:boolean;
label fin,up;
begin
Art:=true;bil:=false;IterCount:=0;
SimplexTable:=nil;
MoreCount:=0;LessCount:=0;EquallyCount:=0;
{1}//Сортировка ограничений: 1) >=; 2) =; 3) <=.
{2}//Порождение начального базиса
{3}//Итерационное построение симплекс-таблиц
{1}//---------------------------------------------------------------------------
//Сортировка "Больше"
with MainForm.ActiveMDIChild as TChildForm do
begin
//строки в таблицах дочернего окна нумеруются с 1
//нулевая строка резервная
for i:=1 to SignsChild.RowCount-1 do
begin
if (SignsChild.Cells[0,i]='>') or (SignsChild.Cells[0,i]='>=') then
begin
inc(MoreCount);
SetLength(SimplexTable,LimChild.ColCount+2,MoreCount);
//коэффициенты
for j:=0 to LimChild.ColCount-1 do
SimplexTable[j+2,MoreCount-1]:=StrToFloat(LimChild.cells[j,i]);
//Пока нули (потом базис...)
SimplexTable[0,MoreCount-1]:=0;
//Значение (B i-ый)
SimplexTable[1,MoreCount-1]:=StrToFloat(BChild.cells[0,i]);
end;
end;
//Сортировка "Равно"
for i:=1 to SignsChild.RowCount-1 do
begin
if SignsChild.Cells[0,i]='=' then
begin
inc(EquallyCount);
SetLength(SimplexTable,LimChild.ColCount+2,MoreCount+EquallyCount);
//коэффициенты
for j:=0 to LimChild.ColCount-1 do
SimplexTable[j+2,MoreCount+EquallyCount-1]:=StrToFloat(LimChild.cells[j,i]);
//Пока нули (потом базис...)
SimplexTable[0,MoreCount+EquallyCount-1]:=0;
//Значение (B i-ый)
SimplexTable[1,MoreCount+EquallyCount-1]:=StrToFloat(BChild.cells[0,i]);
end;
end;
//Сортировка "Меньше"
for i:=1 to SignsChild.RowCount-1 do
begin
if (SignsChild.Cells[0,i]='<') or (SignsChild.Cells[0,i]='<=') then
begin
inc(LessCount);
SetLength(SimplexTable,LimChild.ColCount+2,MoreCount+EquallyCount+LessCount);
//коэффициенты
for j:=0 to LimChild.ColCount-1 do
SimplexTable[j+2,MoreCount+EquallyCount+LessCount-1]:=StrToFloat(LimChild.cells[j,i]);
//Пока нули (потом базис...)
SimplexTable[0,MoreCount+EquallyCount+LessCount-1]:=0;
//Значение (B i-ый)
SimplexTable[1,MoreCount+EquallyCount+LessCount-1]:=StrToFloat(BChild.cells[0,i]);
end;
end;
end;
{2}//---------------------------------------------------------------------------
//Порождение начального базиса
//2.1 Добавить коэф. -1 (>=)
for j:=0 to MoreCount-1 do
begin
Setlength(SimplexTable,length(SimplexTable)+1,MoreCount+EquallyCount+LessCount);
for i:=length(SimplexTable)-MoreCount+1 to length(SimplexTable)-1 do
SimplexTable[i,j]:=0;
SimplexTable[length(SimplexTable)-1,j]:=-1;
end;
//2.2 Добавить коэф. 1 (<=)
for j:=MoreCount+EquallyCount to MoreCount+EquallyCount+LessCount-1 do
begin
Setlength(SimplexTable,length(SimplexTable)+1,MoreCount+EquallyCount+LessCount);
for i:=length(SimplexTable)-LessCount+2 to length(SimplexTable)-1 do
SimplexTable[i,j]:=0;
SimplexTable[length(SimplexTable)-1,j]:=1;
end;
//2.3 Добавить искусственные коэф. (>= и =)