Автор работы: Пользователь скрыл имя, 06 Июня 2012 в 10:39, курсовая работа
Симплекс-метод - это характерный пример итерационных вычислений. используемых при решении большинства оптимизационных задач. Во всех таких задачах требуется найти максимум или минимум линейной функции при условии, что её переменные принимают неотрицательные значения и удовлетворяют некоторой системе линейных уравнений или линейных неравенств либо системе, содержащей как линейные уравнения, так и линейные неравенства. Каждая из этих задач является частным случаем общей задачи линейного программирования.
Введение… …..3
1. Теоретическая часть
1.1 Линейное программирование …..3
1.2 Табличный симплекс-метод …..4
2. Вычислительная процедура симплекс-метода
2.1 Нахождение исходного опорного решения общей задачи линейного программирования (I часть симплекса )……………………………………………5
2.2 Переход от найденного опорного решения к лучшему опорному решению (II часть симплекса)……………………………………………………...7
2.3 Метод искусственного базиса……………………………………………....9
3. Программная реализация
3.1. Блок-схема алгоритма ЗЛП …12
3.2. Описание основных процедур и функций …13
3.3 Листинг программы…………………………………………………………15
4. Контрольный пример …26
5.Руководство пользователя……………………………………………………….29
Заключение …32
Список использованной литературы …32
3.3.Листинг программы
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus, ImgList, Child, StdCtrls, ComCtrls, Buttons, ExtCtrls, ToolWin;
type
TMainForm = class(TForm)
ImageList1: TImageList;
SaveDialog1: TSaveDialog;
StatusBar1: TStatusBar;
OpenDialog1: TOpenDialog;
MainMenu1: TMainMenu;
FileMenu: TMenuItem;
New: TMenuItem;
Open: TMenuItem;
CloseChild: TMenuItem;
N9: TMenuItem;
Save: TMenuItem;
SaveAs: TMenuItem;
N10: TMenuItem;
N11: TMenuItem;
N1Name1: TMenuItem;
N2Name1: TMenuItem;
N3Name1: TMenuItem;
N4Name1: TMenuItem;
N12: TMenuItem;
ExitP: TMenuItem;
Edit: TMenuItem;
N20: TMenuItem;
N21: TMenuItem;
N23: TMenuItem;
ChangeFun: TMenuItem;
AddLim: TMenuItem;
DelLim: TMenuItem;
N8: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N29: TMenuItem;
N30: TMenuItem;
N1: TMenuItem;
N4: TMenuItem;
N3: TMenuItem;
N2: TMenuItem;
procedure ExitPClick(Sender: TObject);
procedure NewClick(Sender: TObject);
procedure FileMenuClick(Sender: TObject);
procedure CloseChildClick(Sender: TObject);
procedure EditClick(Sender: TObject);
procedure ChangeFunClick(Sender: TObject);
procedure AddLimClick(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure N6Click(Sender: TObject);
procedure SaveAsClick(Sender: TObject);
procedure OpenClick(Sender: TObject);
procedure SaveClick(Sender: TObject);
procedure DelLimClick(Sender: TObject);
procedure N8Click(Sender: TObject);
procedure N1Name1Click(Sender: TObject);
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(
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(
begin
if ActiveMDIChild<>nil then
begin
MainForm.CloseChild.Enabled:=
MainForm.Save.Enabled:=true;
MainForm.SaveAs.Enabled:=true;
end
else
begin
MainForm.CloseChild.Enabled:=
MainForm.Save.Enabled:=false;
MainForm.SaveAs.Enabled:=
end
end;
procedure TMainForm.CloseChildClick(
begin
if ActiveMDIChild<>nil then ActiveMDIChild.Close;
end;
procedure TMainForm.EditClick(Sender: TObject);
begin
if ActiveMDIChild<>nil then
begin
MainForm.ChangeFun.Enabled:=
MainForm.AddLim.Enabled:=true;
MainForm.DelLim.Enabled:=true;
MainForm.N8.Enabled:=true;
MainForm.N20.Enabled:=true;
end
else
begin
MainForm.ChangeFun.Enabled:=
MainForm.AddLim.Enabled:=
MainForm.DelLim.Enabled:=
MainForm.N8.Enabled:=false;
MainForm.N20.Enabled:=false;
end
end;
procedure TMainForm.ChangeFunClick(
begin
ParametersForm.PageControl1.
ParametersForm.ShowModal;
end;
procedure TMainForm.AddLimClick(Sender: TObject);
begin
ParametersForm.PageControl1.
ParametersForm.ShowModal;
end;
procedure TMainForm.N2Click(Sender: TObject);
begin
MainForm.Enabled:=False;
AboutForm.Visible:=true;
end;
procedure TMainForm.N5Click(Sender: TObject);
begin
if ActiveMDIChild<>nil then
begin
MainForm.N6.Enabled:=true;
MainForm.N30.Enabled:=true
end
else
begin
MainForm.N6.Enabled:=false;
MainForm.N30.Enabled:=false;
end
end;
procedure TMainForm.N4Click(Sender: TObject);
begin
Application.HelpCommand(3, 0);
end;
//Ñèìïëåêñ-ìåòîä
procedure TMainForm.N6Click(Sender: TObject);
var
SimplexTable,SimplexTableNew:
GoalFun:array of extended;
ArtFun:array of extended;
ExtrEstimation:extended;
k,i,j,MoreCount,LessCount,
Art,bil:boolean;
label fin,up;
begin
Art:=true;bil:=false;
SimplexTable:=nil;
MoreCount:=0;LessCount:=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,
//êîýôôèöèåíòû
for j:=0 to LimChild.ColCount-1 do
SimplexTable[j+2,MoreCount-1]:
//Ïîêà íóëè (ïîòîì áàçèñ...)
SimplexTable[0,MoreCount-1]:=
//Çíà÷åíèå (B i-ûé)
SimplexTable[1,MoreCount-1]:=
end;
end;
//Ñîðòèðîâêà "Ðàâíî"
for i:=1 to SignsChild.RowCount-1 do
begin
if SignsChild.Cells[0,i]='=' then
begin
inc(EquallyCount);
SetLength(SimplexTable,
//êîýôôèöèåíòû
for j:=0 to LimChild.ColCount-1 do
SimplexTable[j+2,MoreCount+
//Ïîêà íóëè (ïîòîì áàçèñ...)
SimplexTable[0,MoreCount+
//Çíà÷åíèå (B i-ûé)
SimplexTable[1,MoreCount+
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,
//êîýôôèöèåíòû
for j:=0 to LimChild.ColCount-1 do
SimplexTable[j+2,MoreCount+
//Ïîêà íóëè (ïîòîì áàçèñ...)
SimplexTable[0,MoreCount+
//Çíà÷åíèå (B i-ûé)
SimplexTable[1,MoreCount+
end;
end;
end;
{2}//-------------------------
//Ïîðîæäåíèå íà÷àëüíîãî áàçèñà
//2.1 Äîáàâèòü êîýô. -1 (>=)
for j:=0 to MoreCount-1 do
begin
Setlength(SimplexTable,length(
for i:=length(SimplexTable)-
SimplexTable[i,j]:=0;
SimplexTable[length(
end;
//2.2 Äîáàâèòü êîýô. 1 (<=)
for j:=MoreCount+EquallyCount to MoreCount+EquallyCount+
begin
Setlength(SimplexTable,length(
for i:=length(SimplexTable)-
SimplexTable[i,j]:=0;
SimplexTable[length(
end;
//2.3 Äîáàâèòü èñêóññòâåííûå êîýô. (>= è =)
for j:=0 to MoreCount+EquallyCount-1 do
begin
Setlength(SimplexTable,length(
for i:=length(SimplexTable)-
SimplexTable[i,j]:=0;
SimplexTable[length(
end;
//Öåëåâàÿ ôóíêöèÿ GoalFun
GoalFun:=nil;
with MainForm.ActiveMDIChild as TChildForm do
begin
SetLength(GoalFun,GoalChild.
for i:=1 to GoalChild.ColCount do
begin
if parametersForm.Min.Checked then
GoalFun[i]:=StrToFloat(
else GoalFun[i]:=-1*StrToFloat(
end;
end;
//Èñêóññòâåííàÿ ôóíêöèÿ ArtFun
ArtFun:=nil;
SetLength(ArtFun,length(
//i=1 - Çíà÷åíèå èñê. ôóíêöèè
for i:=1 to length(SimplexTable)-3 do
for j:=0 to MoreCount-1 do ArtFun[i-1]:=ArtFun[i-1]-
//----------------------------
//Ìèíèìèçàöèÿ èñêóññòâåííîé
//Áàçèñ
if MoreCount>0 then
begin
for j:=0 to MoreCount-1 do
SimplexTable[0,j]:=length(
for i:=MoreCount to length(simplexTable[0])-1 do
SimplexTable[0,i]:=length(
end
else
for i:=0 to LessCount+EquallyCount-1 do
SimplexTable[0,i]:=length(
//2 íèæíèå ñòðîêè äëÿ îöåíîê
SetLength(SimplexTable,length(
for i:=0 to length(GoalFun)-1 do SimplexTable[i+1,length(
for i:=0 to length(ArtFun)-1 do SimplexTable[i+1,length(
SimplexTableNew:=nil;
SetLength(SimplexTableNew,
//èòåðàöèè...
up:
repeat
if not art then inc(IterCount);
if IterCount=Parametersform.
begin
with MainForm.ActiveMDIChild as TChildForm do
begin
task.Items.Add('');
task.Items.Add('Äîñòèãíóòî ïðåäåëüíîå ÷èñëî èòåðàöèé. Ðåøåíèå íå íàéäåíî');
exit;
end;
end;
//Ìîæåò ôóíêöèÿ íå îãðàíè÷åíà?
=> ïîèñê ñòîëáöà ñ
k:=0;
if art then
for i:=2 to length(simplexTable)-1 do
begin
if simplexTable[i,length(
begin
// k:=0;
for j:=0 to length(SimplexTable[0])-3 do
if simplexTable[i,j]<=0 then inc(k);
if k=length(SimplexTable[0])-2 then
begin
with MainForm.ActiveMDIChild as TChildForm do
begin
task.Items.Add('');
task.Items.Add('Íåâîçìîæíî íàéòè íà÷àëüíûé áàçèñ');
exit;
end;
k:=0;
end;
end;
end;
k:=0;
if not art then
for i:=2 to length(simplexTable)-1 do
begin
if simplexTable[i,length(
begin
k:=0;
for j:=0 to length(SimplexTable[0])-2 do
if simplexTable[i,j]<=0 then inc(k);
if k=length(SimplexTable[0])-1 then
begin
with MainForm.ActiveMDIChild as TChildForm do
begin
task.Items.Add('');
task.Items.Add('Öåëåâàÿ ôóíêöèÿ íå îãðàíè÷åíà');
exit;
end;
end;
end;
end;
//ïîèñê ïåðâîé ìèíèìàëüíîé èç
îòðèöàòåëüíûõ îöåíêè
ExtrEstimation:=100000;
extrItem:=0;
for i:=2 to length(simplexTable)-1 do
if (SimplexTable[i,length(
begin
extrItem:=i-1;{íîâûé áàçèñ}
ExtrEstimation:=SimplexTable[
end;
if ExtrEstimation=100000 then goto fin;
//âûáîð ðàáî÷åé ñòðîêè (ïîèñê ìèíèìàëüíîãî èç ïîëîæèòåëüíûõ)
ExtrEstimation:=100000;
WLine:=0;
for j:=0 to length(simplexTable[0])-2 do
begin
if SimplexTable[extrItem+1,j]<>0 then
if (SimplexTable[1,j]/
begin
WLine:=j;
ExtrEstimation:=SimplexTable[
end;
end;
//íîâûé áàçèñ
for i:=0 to length(SimplexTable[0])-1 do SimplexTableNew[0,i]:=
SimplexTableNew[0,WLine]:=
//ïåðåðàñ÷åò ðàáî÷åé ñòðîêè
for i:=1 to length(SimplexTable)-1 do SimplexTableNew[i,WLine]:=
//ïåðåðàñ÷åò êîýôôèöèåíòîâ
for i:=1 to length(SimplexTable)-1 do
for j:=0 to length(SimplexTable[0])-1 do
if j<>WLine then
SimplexTableNew[i,j]:=
//êîïèðîâàíèå òàáëèö
for i:=0 to length(SimplexTable)-1 do for j:=0 to
length(SimplexTable[0])-1 do SimplexTable[i,j]:=
//Âûâîä òåêóùåãî ðåøåíèÿ
if ParametersForm.CheckBox1.
bil:=false;
if not art then
with MainForm.ActiveMDIChild as TChildForm do
begin
<Информация о работе Задача линейного программирования (симплекс-метод)