- •1. Теоретические основы. Двойственный симплекс метод.
- •Алгоритм симплекс-метода:
- •2. Практическая задача
- •2.1 Постановка задачи
- •2.2 Решение задачи
- •3. Разработка программного обеспечения
- •3.1 Входные данные
- •3.2 Выходные данные
- •3.3 Основные функции программного обеспечения
- •3.4 Блок-схема
- •3.5 Интерфейс программы
- •3.6 Руководство по эксплуатации
- •4. Проведение исследования
- •Заключение
- •Список используемой литературы
- •Приложение
4. Проведение исследования
В данной курсовой работе исследованием является решение практической задачи. На странице 12 данной курсовой работы получен аналитический расчет, в результате которого стало известно, что x1=95; x2=210; x3=0; x4=0; x5=85; x6=0; x7=0; L=2115 является решением прямой задачи, y1=0; y2=1.5; y3=2.25 является решением двойственной задачи. Запустив программу, написанную для этой курсовой работы, с данными практической задачи, были получены аналогичные результаты. Считаю, что это говорит о том, что аналитическое решение было проведено верно, и что программа работает корректно.
Заключение
Выполняя данную курсовую работу, мной была решена практическая задача и получены следующие результаты:
Решением прямой задачи является: x1=95; x2=210; x3=0; x4=0; x5=85; x6=0; x7=0; L=2115;
Решением двойственной задачи является: y1=0; y2=1.5; y3=2.25;
Промежуток устойчивости первого ресурса 85;
Промежуток устойчивости второго ресурса (40;400);
Промежуток устойчивости третьего ресурса (420;1140);
Так же мной были закреплены знания по теме линейное программирование и симплекс-метод, и были разобраны способы решения задач линейного программирования с помощью программных средств, в данном случае - это программная среда Delphi.
Список используемой литературы
1. Акулич И.Л. Математическое программирование в примерах и задачах. — М.: Высшая школа, 1986. — 319 с.
2. Томас Х. Кормен Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2006. — С. 1296.
3. Хемди А. Таха Введение в исследование операций— 7-е изд. — М.: «Вильямс», 2007. — С. 95-141.
4. ГОСТ 19.102-77 ЕСПД. Стадии разработки.
5. ГОСТ 19.404-79 ЕСПД. Пояснительная записка. Требования к содержанию и оформлению.
6. ГОСТ РИСО/МЭК 12.207. Процессы жизненного цикла программных средств.
Приложение
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids;
type
TForm3 = class(TForm)
Label1: TLabel;
Label2: TLabel;
rowc: TEdit;
colc: TEdit;
Chng: TButton;
tab: TStringGrid;
Startprop: TButton;
rsch: TButton;
exit: TButton;
Memo1: TMemo;
procedure ChngClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure StartpropClick(Sender: TObject);
procedure rschClick(Sender: TObject);
procedure exitClick(Sender: TObject);
procedure FormClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm3;rowcc,colcc,r,k,erri,epicwin:integer; a1,a2:array [1..50,1..50] of real;
b1,b2,c,d1,d2,bb: array [1..50] of real; but,f:boolean;
l:real;
implementation
{$R *.dfm}
procedure razm;
begin
with form1.tab do begin
defaultcolwidth:=round(width/colcount);
defaultrowheight:=round(height/rowcount);
end;end;
procedure shettab;
var i:integer;
begin
with form1.tab do begin
colcount:=colcc+rowcc+5;
rowcount:=rowcc+2;
cells[0,0]:='I';
cells[1,0]:='Б';
cells[2,0]:='Сб';
for i := 3 to colcount-2 do
cells[i,0]:='P'+inttostr(i-3);
cells[colcount-1,0]:='O';
for I := 1 to rowcount-2 do
cells[0,i]:=inttostr(i);
cells[0,rowcount-1]:='Δ';
end;
razm;
end;
procedure nachtab ;
var i,j:integer;
begin
j:=65;
with form1.tab do begin
colcount:=colcc+2;
rowcount:=rowcc+2;
cells[0,0]:='Тип';
for I := 1 to rowcc do
cells[0,i]:=inttostr(i);
cells[0,rowcc+1]:='Цена';
for i := 1 to colcc do begin cells[i,0]:=char(j);
j:=j+1;
end;
cells[colcc+1,0]:='Нал';
end;
razm;
end;
procedure TForm3.ChngClick(Sender: TObject);
begin
if rowc.Enabled=false then begin
rowc.Enabled:=true;
colc.Enabled:=true;
end
else begin
if rowc.Text<>'' then
rowcc:=strtoint(rowc.Text);
if colc.Text<>'' then
colcc:=strtoint(colc.Text);
rowc.Enabled:=false;
colc.Enabled:=false;
end;end;
procedure TForm3.StartpropClick(Sender: TObject);
var i,j:integer;
begin
nachtab;
for i := 1 to tab.rowcount do
for j:=1 to tab.ColCount do
tab.Cells[j,i]:='';
rsch.Caption:='Рассчитать';
memo1.Clear;
end;
procedure TForm3.rschClick(Sender: TObject);
var i,j:integer;s:string;min:real; f:boolean;
begin
case but of
false: begin
chng.Enabled:=false;
s:='';
for I := 1 to rowcc do
for j := 1 to colcc do
a1[i,j]:=strtoint(tab.cells[j,i]);
for I := 1 to rowcc do
for j := colcc+1 to colcc+rowcc do
if i+colcc=j then a1[i,j]:=1;
for I := 1 to colcc do
c[i]:=strtoint(tab.Cells[i,rowcc+1]);
for i := 1 to rowcc do
b1[i]:=strtoint(tab.cells[colcc+1,i]);
for i := 1 to colcc do
d1[i]:=c[i]*-1;
for i := 1 to colcc do
if i<>colcc then
s:=s+tab.Cells[i,rowcc+1]+'x'+inttostr(i)+'*'
else
s:=s+tab.Cells[i,rowcc+1]+'x'+inttostr(i);
memo1.Lines.Add('Прямая задача:');
memo1.Lines.Add('L='+s+'→max');
s:='';
for I := 1 to rowcc do begin
for j := 1 to colcc do begin
if j<>colcc then
s:=s+tab.Cells[j,i]+'x'+inttostr(j)+'*'
else begin
s:=s+tab.Cells[j,i]+'x'+inttostr(j);
s:=s+'≤'+tab.Cells[colcc+1,i];
end;end;
memo1.Lines.Add(s);
s:='';
end;
shettab;
memo1.Lines.Add('');
memo1.Lines.Add('Двойственная задача:');
for I := 1 to rowcc do
if i<>rowcc then
s:=s+tab.Cells[colcc+1,i]+'y'+inttostr(i)+'*'
else
s:=s+tab.Cells[colcc+1,i]+'y'+inttostr(i);
memo1.Lines.Add('W='+s+'→min');
s:='';
for I := 1 to colcc do begin
for j := 1 to rowcc do begin
if j<>rowcc then
s:=s+tab.Cells[i,j]+'y'+inttostr(j)+'*'
else begin
s:=s+tab.Cells[i,j]+'y'+inttostr(j);
s:=s+'≥'+tab.Cells[i,rowcc+1];
end;
end;
memo1.Lines.Add(s);
s:='';
end;
for i := 1 to rowcc do
for j := 1 to colcc+rowcc do
tab.Cells[j+3,i]:=floattostr(a1[i,j]);
for I := 1 to colcc+rowcc do
tab.Cells[i+3,rowcc+1]:=floattostr(d1[i]);
for I := 1 to rowcc do begin
tab.Cells[2,i]:=floattostr(c[i+colcc]);
tab.Cells[3,i]:=floattostr(b1[i]);
end;
for I := 1 to 3 do
tab.Cells[i,rowcc+1]:='';
min:=0;
for I := 4 to colcc+rowcc do
if strtofloat(tab.Cells[i,rowcc+1])<=min then
begin
k:=i;
min:= strtofloat(tab.Cells[i,rowcc+1]);
end;
memo1.Lines.add('');
memo1.Lines.Add('Разрешающий столбец: '+inttostr(k-3));
for I := 1 to rowcc do
if a1[i,k-3]>0 then
tab.Cells[rowcc+4+colcc,i]:=floattostr(b1[i]/a1[i,k-3])
else
tab.Cells[rowcc+4+colcc,i]:='0';
rsch.Caption:='Следующий шаг';
for I := 1 to rowcc do
if strtofloat(tab.Cells[rowcc+4+colcc,i])>0 then
min:=strtofloat(tab.Cells[rowcc+4+colcc,i]);
for I := 1 to rowcc do
if (strtofloat(tab.Cells[rowcc+4+colcc,i])<=min)
and (strtofloat(tab.Cells[rowcc+4+colcc,i])>0) then begin r:=i;
min:= strtofloat(tab.Cells[rowcc+4+colcc,i]);
end;
memo1.Lines.add('');
memo1.Lines.Add('Разрешающая строка: '+inttostr(r));
for I := 1 to rowcc do begin
tab.Cells[1,i]:='P'+inttostr(colcc+i);
bb[i]:=colcc+i;
end;
but:=true;
end;
true: begin
for I := 1 to colcc do begin
for j := 1 to rowcc do
if a1[j,i]<0 then erri:=erri+1;
if erri=rowcc then begin
memo1.Lines.add('');
memo1.Lines.Add('Решение отсутствует');
end;end;
if erri<>rowcc then begin
erri:=0;
bb[r]:=k-3;
for I := 1 to rowcc do
tab.Cells[1,i]:='P'+floattostr(bb[i]);
for I := 1 to rowcc do
for j := 1 to colcc+rowcc do
a1[i,j]:=strtofloat(tab.cells[j+3,i]);
for i := 1 to rowcc do
b1[i]:=strtofloat(tab.cells[3,i]);
for i := 1 to colcc+rowcc do
d1[i]:=strtofloat(tab.cells[i+3,rowcc+1]);
for i := 1 to rowcc+colcc do
d2[i]:=d1[i]-(a1[r,i]/a1[r,k-3])*d1[k-3];
for I := 1 to rowcc do
if i=r then
b2[i]:=b1[r]/a1[r,k-3]
else
b2[i]:=b1[i]-(b1[r]/a1[r,k-3])*a1[i,k-3];
for i := 1 to rowcc do
for j := 1 to rowcc+colcc do
if i=r then
a2[i,j]:=a1[r,j]/a1[r,k-3]
else
a2[i,j]:=a1[i,j]-(a1[r,j]/a1[r,k-3])*a1[i,k-3];
for i := 1 to rowcc do
for j := 1 to colcc+rowcc do
tab.Cells[j+3,i]:=floattostr(a2[i,j]);
for I := 1 to colcc+rowcc do
tab.Cells[i+3,rowcc+1]:=floattostr(d2[i]);
for I := 1 to rowcc do begin
tab.Cells[3,i]:=floattostr(b2[i]);
tab.Cells[2,i]:=floattostr(c[round(bb[i])]);
end;
l:=l-(b1[r]/a1[r,k-3])*d1[k-3];
memo1.Lines.Add('');
memo1.Lines.Add('L='+floattostr(l));
min:=0;
for I := 1 to colcc+rowcc do
if d2[i]<=min then
begin
k:=i+3;
min:=d2[i];
end;
memo1.Lines.add('');
memo1.Lines.Add('Разрешающий столбец: '+inttostr(k-3));
for I := 1 to rowcc do
tab.Cells[rowcc+colcc+4,i]:='';
for I := 1 to rowcc do
if a2[i,k-3]<>0 then
tab.Cells[rowcc+4+colcc,i]:=floattostr(b2[i]/a2[i,k-3])
else
tab.Cells[rowcc+4+colcc,i]:='0';
rsch.Caption:='Следующий шаг';
for I := 1 to rowcc do
if strtofloat(tab.Cells[rowcc+4+colcc,i])>0 then
min:=strtofloat(tab.Cells[rowcc+4+colcc,i]);
for I := 1 to rowcc do
if (strtofloat(tab.Cells[rowcc+4+colcc,i])<=min)
and (strtofloat(tab.Cells[rowcc+4+colcc,i])>0) then
r:=i;
min:= strtofloat(tab.Cells[rowcc+4+colcc,i]);
end;
memo1.Lines.add('');
memo1.Lines.Add('Разрешающая строка: '+inttostr(r));
for I :=4 to rowcc+colcc do
if strtofloat(tab.Cells[i,rowcc+1])>0 then
epicwin:=epicwin+1;
if epicwin=colcc+rowcc then begin
memo1.Lines.Add('Оптимальное решение прямой задачи: L='+floattostr(l));
for I := 1 to rowcc+colcc do begin
for j := 1 to rowcc do
if i=bb[j] then f:=true;
if f=true then begin
memo1.Lines.Add('X'+floattostr(bb[i])+'='+floattostr(b2[i]));
f:=false;
end
else
memo1.Lines.Add('X'+inttostr(i)+'=0');
end;
rsch.Enabled:=false;
memo1.Lines.Add('Оптимальное решение двойственной задачи: W='+floattostr(l));
for j:= 1 to rowcc do
memo1.Lines.Add('y'+inttostr(j)+'='+floattostr(d1[j+colcc]));
end;end;end;end;end;
procedure TForm3.exitClick(Sender: TObject);
begin
close;
end;
procedure TForm3.FormCreate(Sender: TObject);
begin
colcc:=4;
rowcc:=3;
nachtab;
erri:=0;
but:=false;
epicwin:=0;
l:=0;
f:=false;
end;end.