Файл: пк для решения задач линейного программирования симплексным методом.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 Добавить искусственные коэф. (>= и =)