else
begin
write(f,'min) = ',matrix[n+1,m+y+1]:0:3);
form1.Memo1.Lines.Text:=form1.Memo1.Lines.Text+'min) = ';
form1.Memo1.Lines.Text:=form1.Memo1.Lines.Text+floattostr(matrix[n+1,m+y+1]);
end;
writeln(f,'<br>при значениях:<br>');
form1.Memo1.Lines.Add('');
form1.Memo1.Lines.Add('');
form1.Memo1.Lines.Add('при значениях:');
form1.Memo1.Lines.Add('');
for j:=1 to m do
begin
writeln(f,'x<sub>',j,'</sub> = ');
form1.Memo1.Lines.Text:=form1.Memo1.Lines.Text+'X[';
form1.Memo1.Lines.Text:=form1.Memo1.Lines.Text+inttostr(j);
form1.Memo1.Lines.Text:=form1.Memo1.Lines.Text+'] = ';
written:=false;
for i:=1 to n do
if all_basis[i]=j then
begin
writeln(f,matrix[i,m+y+1]:0:3,'<br>');
form1.Memo1.Lines.Text:=form1.Memo1.Lines.Text+floattostr(matrix[i,m+y+1]);
form1.Memo1.Lines.Add('');
form1.Memo1.Lines.Add('');
written:=true;
end;
if written=false then
begin
writeln(f,'0.000 <br>');
form1.Memo1.Lines.Text:=form1.Memo1.Lines.Text+'0';
form1.Memo1.Lines.Add('');
form1.Memo1.Lines.Add('');
end;
end;
end else
begin
writeln(f,'<P>Решениененайдено.(</P>');
form1.Memo1.Lines.Text:=form1.Memo1.Lines.Text+'Решениененайдено.';
end;
form1.Memo1.ReadOnly:=true;
end;
{/////////////////}
procedure Step2;
{шаг второй: решение задачи и формирование отчета}
var
i,j: integer;
k: integer;
begin
for i:=1 to n+1 do
for j:=1 to m+1 do
begin
matrix[i,j]:=strtofloat(pole[i,j].Text); {Вводимзначениявмассив}
pole[i,j].Enabled:=false; {Блокируемполя}
if i<=n then znak[i].Enabled:=false;{блокируемзнаки}
end;
form1.Extrem.Enabled:=false;
{////////////////////////////////////////////////////////////////////////////}
{ имеемматрицу [ n+1, m+1 ] }
rewrite(f);
writeln(f,'<HTML>');
writeln(f,'<HEAD>');
writeln(f,'<TITLE>Отчет</TITLE>');
writeln(f,'</HEAD>');
writeln(f,'<BODY>');
writeln(f,'<H1>Отчет</H1>');
write(f,'<P><b>Необходимо ');
if form1.Extrem.ItemIndex=0 then write(f,'макс') else write(f,'мин');
writeln(f,'имизировать целевую функцию:</b></P>');
kanon:=false;{еще не в канонической форме}
write_system(n+1,m+1);{Выведем ее в отчет}
{приведем ее к каноническому виду}
writeln(f,'<P><b>Приведем к каноническому виду:</b></P>');
y:=0;{количество дополнительных переменных}
need_basis:=false;
for i:=1 to n do
if znak[i].ItemIndex<>2 then {если ограничение не является равенством}
begin
y:=y+1; {вводим дополнительную переменную, для этого:}
for k:=1 to n+1 do begin {во всех ограничениях и в ЦФ}
{перед правой частью добавляем столбец}
matrix[k,m+y+1]:=matrix[k,m+y];
matrix[k,m+y]:=0;{состоящий из нулей}
end;
{а в текущем ограничении, если знак был > или >=}
if (znak[i].ItemIndex=0) or (znak[i].ItemIndex=1) then
begin
matrix[i,m+y]:=-1;{записываем -1}
need_basis:=true;
end
else {иначе, т.е. в случае < или <=}
matrix[i,m+y]:=1; {записываем 1}
end
else need_basis:=true;
{ЦФ приравнивается к нулю, а свободный член переносится в правую часть:}
matrix[n+1,m+y+1]:=0-matrix[n+1,m+y+1];
{правые части ограничений должны быть неотрицательны, проверим это:}
for i:=1 to n do {для всех ограничений}
if matrix[i,m+y+1]<0 then {если правая часть отрицательна,}
{то отнимаем всю строку от нуля}
for j:=1 to m+y+1 do matrix[i,j]:=(0-matrix[i,j]);
kanon:=true;{система приведена к каноническому виду}
{выведем ее в отчет}
write_system(n+1,m+y+1);
{если ф-ция на минимум, то нужно поменять знаки в последней строке}
if form1.Extrem.ItemIndex=1 then
for j:=1 to m+y+1 do matrix[n+1,j]:=0-matrix[n+1,j];
{////////////////////////////////////////////////////////////////////////////}
{////////////////////////// Тут надо ввести базис ///////////////////////////}
i_basis:=0;
fori:=1 tondo {то во всех ограничениях}
begin
is_basis:=false;
for j:=1 to m+y do
if (matrix[i,j]=1) then
if (is_basis=false) then
begin
all_basis[i]:=j;
is_basis:=true;
for k:=1 to n do
if k<>i then
if (matrix[k,j]<>0) then
if (is_basis=true) then
begin
is_basis:=false;
all_basis[i]:=0;
end;
end;
if is_basis=false then
begin
i_basis:=i_basis+1;
y:=y+1;
for k:=1 to n+1 do
begin {во всех ограничениях и в ЦФ}
{перед правой частью добавляем столбец}
matrix[k,m+y+1]:=matrix[k,m+y];
matrix[k,m+y]:=0;{состоящий из нулей}
end;
matrix[i,m+y]:=1;
all_basis[i]:=m+y;
end;
end;
{//////////////// Закончили ввод искусственного базиса //////////////////////}
{////////////////////////////////////////////////////////////////////////////}
{////////////////////////////////////////////////////////////////////////////}
{//////////////// теперь надо от него избавиться ////////////////////////////}
ifi_basis>0 then
begin
write(f, '<H2>Необходимо ввести искусственный базис</H2>');
zapisat(n+1,m+y+1,-1,-1);
writeln(f, '<P>Искусственный базис введен.<br>');
writeln(f, 'Избавившись от него, получим первое допустимое решение</P>');
iter:=0;repeat
inc(iter);
findved;
preobr;
until (i_basis=0) or (iter=20) or (done=true);
if i_basis=0 then
begin
writeln(f,'<P>Искусственный базис выведен полностью.<br>');
writeln(f,'Получено первое допустимое решение!</P>');
end
else
begin
writeln(f,'<P>Не удалось вывести искусственный базис.<br>');
writeln(f,'Решение не найдено.</P>');
end;
end;
{//////////////////////// попытки избавленя окончены ////////////////////////}
{////////////////////////////////////////////////////////////////////////////}
{/////////////////////////////// SIMPLEX START /////////////////////////////}
if i_basis=0 then
begin
iter:=0;
findved;
if done=false then
begin
writeln(f,'<H2>Применяем симплекс метод</H2>');
repeat
inc(iter);
findved;
preobr;
until (done=true) or (iter=20);
end;
end;
otvet;
{/////////////////////////////// SIMPLEX END ///////////////////////////////}
writeln(f,'</BODY>');
writeln(f,'</HTML>');
CloseFile(f);
{////////////////////////////////////////////////////////////////////////////}
end;
{////////////////////////////////////////////////////////////////////////////}
{///////// все, что ниже, относится к переходам между шагами ////////////////}
{////////////////////////////////////////////////////////////////////////////}
procedure TForm1.ExitClick(Sender: TObject);
begin
Close();
end;
procedure TForm1.Button_NextClick(Sender: TObject);
begin
step:=step+1;
Form1.Button_Prev.Enabled:=true;
case step of
1:Step1;
2:begin
Step2;
Form1.Button_Next.Enabled:=false;
end;
else step:=step-1;
end;
form1.Caption:='Симплекс метод - шаг '+inttostr(step);
end;
procedure TForm1.Button_PrevClick(Sender: TObject);
begin
step:=step-1;
Form1.Button_Next.Enabled:=true;
case step of
0:begin
Init;
Form1.Button_Prev.Enabled:=false;
end;
1:Step1;
else step:=step+1;
end;
form1.Caption:='Симплекс метод - шаг '+inttostr(step);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Init;
end;
В данной курсовой работе было рассмотрено решение задач линейного программирования симплекс методом. Задача была решена симплекс методом, так же задача была решена графически (построен график). Для представленной задачи была составлена программа на языке Delphi, программа находит значения целевой функции при условии максимизации значения.
Таким образом, вычислительная техника в настоящее время находит широкое применение, как в общей математике, так и в одном из её разделов – математических методах.
1. Зайченко Ю.П., Шумилова С.А. Исследование операций.
2. Лищенко «Линейное и нелинейное программирование», М. 2003
3. А.Н. Карасев, Н.Ш. Кремер, Т.Н. Савельева «Математические методы в экономике», М.2000
4. Орлов А.И. Теория принятия решений. Учебное пособие. - М.: Издательство "Март", 2004
5. Интернет