Двоїстість в оптимізаційних задачах

Застосування теорії двоїстості для задач лінійного та нелінійного програмування, теореми двоїстості. Симплексний метод як метод отримання розв’язку прямої та двоїстої задачі. Постановка економіко-математичної задачі із застосуванням теорії двоїстості.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык украинский
Дата добавления 08.03.2015
Размер файла 567,7 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

var s:string;

begin

s:=SGRD_A.Cells[j, i];

if s='=' then ReadZnak:=0

else

if ((s='<') or (s='<=')) then ReadZnak:=1

else

if ((s='>') or (s='>=')) then ReadZnak:=2

else

begin

SGRD_A.Cells[j, i]:='';

ReadZnak:=-1;

ERROR:=true;

ShowMessage('Неправильний ввід знаку у нерівності ' + IntToStr(i-1));

end;

end;

function TForm1.ReadReal_A(i,j:integer):real;

var is_error: boolean;

begin

is_error:=false;

if SGRD_A.Cells[j, i]='' then

begin

SGRD_A.Cells[j, i]:='0';

ReadReal_A:=0;

end

else

begin

try

StrToFloat(SGRD_A.Cells[j, i]);

except

is_error:=true;

SGRD_A.Cells[j, i]:='0';

ERROR:=true;

if i=1 then ShowMessage('Неправильний ввід коефіцієнта ЦФ біля Х' + IntToStr(j))

else

if j=n+2 then ShowMessage('Неправильний ввід коефіцієнта B' + IntToStr(i))

else

ShowMessage('Неправильний ввід коефіцієнта біля Х'+IntToStr(j)+' рівняння '+IntToStr(i-1))

end;

if is_error then ReadReal_A:=0

else ReadReal_A:=StrToFloat(SGRD_A.Cells[j, i]);

end;

end;

procedure TForm1.BtnRozmiryEnterClick(Sender: TObject);

var i:integer;

is_error:boolean;

begin

N4.Enabled:=true; // Робимо доступним пункт меню "Зчитати дані"

N2.Enabled:=false;

STB2.Visible:=false;

is_error:=false;

try

StrToInt(Edit_N.Text);

except

Edit_N.Text:='1';

is_error:=true;

ShowMessage('Неправильний ввід кількості змінних');

end;

try

StrToFloat(Edit_M.Text);

except

Edit_N.Text:='1';

is_error:=true;

ShowMessage('Неправильний ввід кількості рядків');

end;

if not is_error then

begin

//Заблокуємо для редактування поля введення розмірів ЗЛП

Edit_N.Enabled:=false;

Edit_M.Enabled:=false;

CBox_EXTREMUM.Enabled:=false;

BtnRozmiryEnter.Enabled:=false;

//Зчитаємо розміри ЗЛП

n:=StrTOInt(Edit_N.Text);

m:=StrTOInt(Edit_M.Text);

if CBox_EXTREMUM.ItemIndex=1 then extremum_max:=false

else extremum_max:=true;

//Побудова поля введення коефіцієнтів ЗЛП

Panel_A.Visible:=true;

Panel_A.Width:=Form1.Width div 2;

PanelDUO.Width:=Form1.Width div 2;

SGRD_A.Enabled:=true;

SGRD_A.RowCount:=m+3;

SGRD_A.ColCount:=n+3;

for i := 1 to n do

begin

SGRD_A.Cells[i,0]:='X' + IntTOStr(i);

SGRD_A.Cells[i,m+2]:='+';

end;

SGRD_A.Cells[n+1,0]:='знак';

SGRD_A.Cells[n+2,0]:='B';

SGRD_A.Cells[0,1]:='ЦФ';

SGRD_A.Cells[n+1,1]:='Х';

SGRD_A.Cells[n+2,1]:='Х';

for i := 2 to m+1 do

SGRD_A.Cells[0, i]:='(' + IntTOStr(i-1) + ')';

SGRD_A.Cells[0,m+2]:='Xj>0 (+,-)';

end;

end;

procedure TForm1.btn_BuildDuoClick(Sender: TObject);

var i,j:integer;

first_el:boolean;

s:string;

begin

//припустимо відсутність помилок вводу

ERROR:=false;

// Задання розміру масиву коефіцієнтів матриці А

SetLength(A, m+1, n+1);

// Задання розміру масиву коефіцієнтів ЦФ - С, та вектора вільних членів - В

SetLength(C, n+1);

SetLength(B, m+1);

SetLength(Znak, m+1);

SetLength(X_nevid, n+1);

//Зчитування вектора С

for j := 1 to n do

C[j]:= ReadReal_A(1,j);

//зчитування матриці А

for i := 1 to m do

for j := 1 to n do

A[i,j]:= ReadReal_A(i+1,j);

//Зчитування вектора B

for i := 1 to m do

B[i]:= ReadReal_A(i+1,n+2);

//Зчитування знаків нерівностей обмежень

for i := 1 to m do

Znak[i]:= ReadZnak(i+1,n+1);

//Зчитування обмежень на невід'ємність змінних

for j := 1 to n do

if SGRD_A.Cells[j,m+2]='+' then

X_nevid[j]:= true

else X_nevid[j]:= false;

// Побудова двоїстої задачі при відсутності помилок

if not ERROR then

begin

// Зміни в доступності пунктів меню

N_PZ_Standart.Enabled:=true;

N_DZ_standart.Enabled:=true;

N4.Enabled:=false;

// Зробимо видимою панель виводу результатів

PanelDUO.Visible:=true;

SGRD_A.Enabled:=false;

MemoDUO.Lines.Clear;

MemoDUO.Lines.Add(' Введена задача:');

//Вивід ЦФ прямої задачі

first_el := true;

for j := 1 to n do

if C[j]<>0 then

begin

if not first_el then

begin

if C[j]>0 then s:=s+ ' + '

else s:=s+ ' - ';

end

else

begin

first_el:=false;

if C[j]<0 then s:=s+ '-';

end;

s:=s + FloatToStr(Abs(C[j])) + ' X' + FloatToStr(j);

end;

s:=s+' -> ';

if extremum_max then s:=s + 'max'

else s:=s + 'min';

MemoDUO.Lines.Add(s);

//вивід обмежень прямої задачі

for i := 1 to m do

begin

s:='';

first_el := true;

for j := 1 to n do

if A[i,j]<>0 then

begin

if not first_el then

begin

if A[i,j]>0 then s:=s+ ' + '

else s:=s+ ' - ';

end

else

begin

first_el:=false;

if A[i,j]<0 then s:=s+ '-';

end;

s:=s + FloatToStr(ABS(A[i,j])) + ' X' + IntToStr(j);

end;

case Znak[i] of

0:s:=s+' = ';

1:s:=s+' <= ';

2:s:=s+' >= ';

end;

s:=s + FloatToStr(B[i]);

MemoDUO.Lines.Add(s);

end;

// вивід обмежень на невід'ємність змінних

s:='';

first_el := true;

for j := 1 to n do

if X_nevid[j] then

begin

if not first_el then

begin

s:=s+ ', ';

end

else first_el:=false;

s:=s + ' X' + IntToStr(j);

end;

s:=s+' >=0 ';

MemoDUO.Lines.Add(s);

end;

end;

procedure TForm1.FormResize(Sender: TObject);

begin

Panel_A.Width:=Form1.Width div 2;

PanelDUO.Width:=Form1.Width div 2;

end;

procedure TForm1.N2Click(Sender: TObject);

begin

BtnRozmiryEnterClick(Sender);

end;

procedure TForm1.N3Click(Sender: TObject);

begin

Close();

end;

procedure TForm1.N4Click(Sender: TObject);

begin

btn_BuildDuoClick(Sender);

end;

procedure TForm1.N_PSM_DZClick(Sender: TObject);

label 1;

var djmin, iter,i,j,ky,kz,nst,npk,ind,isb,isM, roz_s, roz_r, npk0, minus,

iii,n2,m2:integer;

djmin_z,djM, djmin_c, c_, mina:real;

C_dz,B_dz: array of real;

A_dz: array of array of real;

Znak_dz: array of integer; { масив знаків нерівностей обмежень

0 - рівне (=)

1 - менше рівне (<=)

2 - більше рівне (>=)}

begin

SetLength(A_dz, n+1,m+1);

SetLength(C_dz, m+1);

SetLength(B_dz, n+1);

SetLength(Znak_dz, n+1);

n2:=m;

m2:=n;

for i := 1 to n2 do

for j := 1 to m2 do

A_dz[i,j]:=A[j,i];

for i := 1 to m2 do

begin

B_dz[i]:=C[i];

if X_nevid[i] then Znak_dz[i]:=2

else Znak_dz[i]:=0;

end;

for j := 1 to n2 do

C_dz[j]:=B[j];

with STB2 do

begin

visible:=true;

iter:=0;

colcount:=n2+3;

rowcount:=m2+3;

if n2<10 then Width:=65*(n2+3)

else Width:=65*12+16;

if m2<14 then Height:=25*(m2+3)

else Height:=25*16+16;

cells[0,0]:='Початкова';

cells[1,0]:='таблиця';

cells[0,1]:='Cjб';

cells[1,1]:='Xjб';

cells[2,1]:='Bi';

cells[2,0]:='Cj';

cells[0,m2+2]:='індексний';

cells[1,m2+2]:='рядок';

for j:=1 to n2 do

begin

cells[j+2,1]:='x' + IntToStr(j);

if extremum_max then minus:=1 else minus:=-1;

cells[j+2,0]:=FloatToStr(minus*C_dz[j]);

end;

{сама табличка}

for j:=1 to n2 do

for i:=1 to m2 do

cells[j+2,i+1]:=FloatToStr(A_dz[i,j]);

{вектор B}

for i:=1 to m2 do

begin

cells[2,i+1]:=FloatToStr(B_dz[i]);

if B_dz[i]<0 then

begin

for j:=0 to n2 do

cells[2+j,i+1]:=FloatTostr(-StrToFloat(cells[2+j,i+1]));

if Znak[i]=1 then Znak[i]:=2

else if Znak[i]=2 then Znak[i]:=1;

end;

end;

{зведення до канонічного вигляду}

ky:=0;

kz:=0;

nst:=n2;

for i:=1 to m2 do

begin

if (Znak[i]=1)then

begin

ky:=ky+1;

n2:=n2+1;

colcount:=n2+3;

if n2<12 then Width:=65*(n2+3)

else Width:=65*14+16;

cells[n2+2,0]:='0';

cells[n2+2,1]:='"y'+IntToStr(ky);

for j:=1 to m2 do

if (j<>i) then cells[n2+2,j+1]:='0'

else cells[n2+2,j+1]:='1';

cells[0,i+1]:='0';

cells[1,i+1]:=cells[n2+2,1];

end;

if (Znak[i]=2)then

begin

ky:=ky+1;

n2:=n2+1;

colcount:=n2+3;

if n2<12 then Width:=65*(n2+3)

else Width:=65*14+16;

cells[n2+2,0]:='0';

cells[n2+2,1]:='"y'+IntToStr(ky);

for j:=1 to m2 do

if (j<>i) then cells[n2+2,j+1]:='0'

else cells[n2+2,j+1]:='-1';

Znak[i]:=0;

end;

end;

for i:=1 to m2 do

if (Znak[i]=0)then

begin

kz:=kz+1;

n2:=n2+1;

colcount:=n2+3;

if n2<12 then Width:=65*(n2+3)

else Width:=65*14+16;

cells[n2+2,0]:='-M';

cells[n2+2,1]:='"Z'+IntToStr(kz);

for j:=1 to m2 do

if (j<>i) then cells[n2+2,j+1]:='0'

else cells[n2+2,j+1]:='1';

cells[0,i+1]:='-M';

cells[1,i+1]:=cells[n2+2,1];

end;

npk:=1;

ind:=1;

while ind=1 do

begin

{заповнює індексний рядок}

isM:=0;

For i:= 1 To m2 do

If cells[0,npk + i]='-M' Then isM:= 1;

If isM=0 Then

begin

//memo1.Lines.Add('вітка без М');

For j:=2 To (n2+2)do

if cells[j,0]<>'-M' then

begin

If j=2 Then c_:=0

Else c_:=-StrToFloat(Cells[j,0]);

For i:=1 To m2 do

c_:=c_+StrToFloat(Cells[0,npk+i])*StrToFloat(Cells[j,npk+i]);

Cells[j,npk+m2+1]:=FloatToStr(roundto(c_,-3));

if j=3 then begin djmin_z:=c_; djmin:=j; end;

if (j>3)and(c_<djmin_z) then

begin djmin:=j; djmin_z:=c_; end;

end

else Cells[j,npk+m2+1]:='-';

end

Else

begin {isM=1}

For j:=2 To (n2+2) do

if cells[j,0]<>'-M' then

Begin

djm:=0;

If j=2 Then c_:=0

Else c_:=-StrToFloat(Cells[j,0]);

For i:=1 To m2 do

If Cells[0,npk+i]<>'-M' Then

c_:=c_+StrToFloat(Cells[0,npk + i])*StrToFloat(Cells[j,npk + i])

else djm:=djm-StrToFloat(Cells[j,npk+i]);

if djM=0 then Cells[j,npk + m2+1]:=FloatToStr(roundto(c_,-3))

Else

begin

if c_<0 then Cells[j,npk + m2+1]:=FloatToStr(roundto(djm,-3))+'M'+FloatToStr(roundto(c_,-3));

if c_=0 then Cells[j,npk + m2+1]:=FloatToStr(roundto(djm,-3))+'M';

if c_>0 then Cells[j,npk + m2+1]:=FloatToStr(roundto(djm,-3))+'M+'+FloatToStr(roundto(c_,-3));

end;

if j=3 then begin djmin_z:=djm; djmin_c:=c_; djmin:=j; end;

if (j>3)and((djM<djmin_z)or((djM=djmin_z)and(c_<djmin_c))) then

begin djmin_z:=djm; djmin_c:=c_; djmin:=j; end;

end

else Cells[j,npk + m2+1]:='0';

{next j}

End; {isM=1}

if isM=1 then

if (djmin_z>0)or((djmin_z=0)and(djmin_c>=0)) then

begin

ShowMessage('Функція не має розв"язку через несумісність умов');

goto 1;

end;

if (isM=0)and(djmin_z>=0) then

begin

//виведення результатів

MemoDUO.Lines.Add('');

MemoDUO.Lines.Add('Оптимальний план Двоїстої задачі:');

for iii := 1 to m2 do

MemoDUO.Lines.Add(Cells[1, npk+iii]+ ' = ' + Cells[0, npk+iii]);

MemoDUO.Lines.Add('Оцінки двоїстої задачі:');

for iii := 1 to n2 do

MemoDUO.Lines.Add('d' + Cells[iii+2,1] + ' = ' + Cells[iii+2, npk+m2+1]);

ShowMessage('План оптимальний');

goto 1;

end;

roz_s:=djmin;

ind:=1;

{розв'язковий рядок}

isb:=0;

i:=1;

roz_r:=0;

While ((isb=0) And (i<=m2)) do

begin

If StrToFloat(Cells[roz_s,npk+i])>0 Then

begin

isb:=1;

mina:=StrToFloat(Cells[2,npk+i])/StrToFloat(Cells[roz_s,npk+i]);

roz_r:=i;

end;

i:=i+1;

end;

If isb=0 Then begin showmessage('Функція необмежена'); goto 1; end;

For i:=1 To m2 do

If ((StrToFloat(Cells[roz_s,npk+i])>0)And(isM=0)) Or ((StrToFloat(Cells[roz_s,npk+i])>0)And(isM=1)And(Cells[0,npk+i]='-M')) Then

If (StrToFloat(Cells[2,npk+i])/StrToFloat(Cells[roz_s,npk+i]))<=mina Then

begin

mina:=StrToFloat(Cells[2,npk+i])/StrToFloat(Cells[roz_s,npk+i]);

roz_r:=i;

end;

roz_r:=roz_r+npk;

npk0:=npk;

npk:=npk+m2+2;

{переписуємо і міняємо базову змінну}

rowcount:=npk+m2+2;

if cells[0,roz_r]='-M' then

for j:=1 to n2 do

if (cells[1,roz_r]=cells[j+2,1]) then cells[j+2,npk]:='вибула';

for j:=1 to n2 do

if (cells[j+2,npk0]='вибула') then cells[j+2,npk]:='вибула';

if (npk+m2<14) then Height:=25*(npk+m2+2)

else

begin

height:=13*25;

width:=width+18;

end;

For i:=1 To (m+1) do

If (npk0+i=roz_r) Then

begin

Cells[1,npk+i]:=Cells[roz_s,1];

Cells[0,npk+i]:=Cells[roz_s,0]

end

Else

begin

Cells[1,npk+i]:=Cells[1,npk0+i];

Cells[0,npk+i]:=Cells[0,npk0+i];

end;

iter:=iter+1;

cells[0,npk0+m2+2]:='ітер '+inttostr(iter);

cells[1,npk0+m2+2]:='р.ел ('+Inttostr(roz_r-npk0)+';'+Inttostr(roz_s-2)+')';

{заповнюємо симплекс табличку}

For j:=0 To n2 do

if cells[j+2,npk]<>'вибула' then

begin

For i:=1 To m2 do

If (npk0+i=roz_r) Then

Cells[j+2,npk+i]:=FloatToStr(roundto(StrToFloat(Cells[j+2,npk0+i])/StrToFloat(Cells[roz_s,roz_r]),-3))

Else

Cells[j+2,npk+i]:=FloatToStr(roundto(StrToFloat(Cells[j+2,npk0+i])-StrToFloat(Cells[roz_s,npk0+i])*StrToFloat(Cells[j+2,roz_r])/StrToFloat(Cells[roz_s,roz_r]),-3));

end

else For i:=1 To m2 do Cells[j+2,npk+i]:='-';

end;

end;

1:end;

procedure TForm1.N_PSMClick(Sender: TObject);

label 1;

var djmin, iter,i,j,ky,kz,nst,npk,ind,isb,isM, roz_s, roz_r, npk0, minus,

iii,n2:integer;

djmin_z,djM, djmin_c, c_, mina:real;

Znak_pz : array of integer;

begin

n2:=n;

SetLength(Znak_pz, m+1);

for i := 1 to m do Znak_pz[i]:=Znak[i];

with STB2 do

begin

visible:=true;

iter:=0;

colcount:=n2+3;

rowcount:=m+3;

if n<10 then Width:=65*(n2+3)

else Width:=65*12+16;

if m<14 then Height:=25*(m+3)

else Height:=25*16+16;

cells[0,0]:='Початкова';

cells[1,0]:='таблиця';

cells[0,1]:='Cjб';

cells[1,1]:='Xjб';

cells[2,1]:='Bi';

cells[2,0]:='Cj';

cells[0,m+2]:='індексний';

cells[1,m+2]:='рядок';

for j:=1 to n2 do

begin

cells[j+2,1]:='x' + IntToStr(j);

if extremum_max then minus:=1 else minus:=-1;

cells[j+2,0]:=FloatToStr(minus*C[j]);

end;

{сама табличка}

for j:=1 to n2 do

for i:=1 to m do

cells[j+2,i+1]:=FloatToStr(A[i,j]);

{вектор B}

for i:=1 to m do

begin

cells[2,i+1]:=FloatToStr(B[i]);

if B[i]<0 then

begin

for j:=0 to n2 do

cells[2+j,i+1]:=FloatTostr(-StrToFloat(cells[2+j,i+1]));

if Znak_pz[i]=1 then Znak[i]:=2

else if Znak_pz[i]=2 then Znak_pz[i]:=1;

end;

end;

{зведення до канонічного вигляду}

ky:=0;

kz:=0;

nst:=n2;

for i:=1 to m do

begin

if (Znak_pz[i]=1)then

begin

ky:=ky+1;

n2:=n2+1;

colcount:=n2+3;

if n2<12 then Width:=65*(n2+3)

else Width:=65*14+16;

cells[n2+2,0]:='0';

cells[n2+2,1]:='"y'+IntToStr(ky);

for j:=1 to m do

if (j<>i) then cells[n2+2,j+1]:='0'

else cells[n2+2,j+1]:='1';

cells[0,i+1]:='0';

cells[1,i+1]:=cells[n2+2,1];

end;

if (Znak_pz[i]=2)then

begin

ky:=ky+1;

n2:=n2+1;

colcount:=n2+3;

if n2<12 then Width:=65*(n2+3)

else Width:=65*14+16;

cells[n2+2,0]:='0';

cells[n2+2,1]:='"y'+IntToStr(ky);

for j:=1 to m do

if (j<>i) then cells[n2+2,j+1]:='0'

else cells[n2+2,j+1]:='-1';

Znak_pz[i]:=0;

end;

end;

for i:=1 to m do

if (Znak_pz[i]=0)then

begin

kz:=kz+1;

n2:=n2+1;

colcount:=n2+3;

if n2<12 then Width:=65*(n2+3)

else Width:=65*14+16;

cells[n2+2,0]:='-M';

cells[n2+2,1]:='"Z'+IntToStr(kz);

for j:=1 to m do

if (j<>i) then cells[n2+2,j+1]:='0'

else cells[n2+2,j+1]:='1';

cells[0,i+1]:='-M';

cells[1,i+1]:=cells[n2+2,1];

end;

npk:=1;

ind:=1;

isb:=1;

while ind=1 do

begin

{заповнює індексний рядок}

isM:=0;

For i:= 1 To m do

If cells[0,npk + i]='-M' Then isM:= 1;

If isM=0 Then

begin

For j:=2 To (n2+2)do

if cells[j,0]<>'-M' then

begin

If j=2 Then c_:=0

Else c_:=-StrToFloat(Cells[j,0]);

For i:=1 To m do

c_:=c_+StrToFloat(Cells[0,npk+i])*StrToFloat(Cells[j,npk+i]);

Cells[j,npk+m+1]:=FloatToStr(roundto(c_,-3));

if j=3 then begin djmin_z:=c_; djmin:=j; end;

if (j>3)and(c_<djmin_z) then

begin djmin:=j; djmin_z:=c_; end;

end

else Cells[j,npk+m+1]:='-';

end

Else

begin {isM=1}

For j:=2 To (n2+2) do

if cells[j,0]<>'-M' then

Begin

djm:=0;

If j=2 Then c_:=0

Else c_:=-StrToFloat(Cells[j,0]);

For i:=1 To m do

If Cells[0,npk+i]<>'-M' Then

c_:=c_+StrToFloat(Cells[0,npk + i])*StrToFloat(Cells[j,npk + i])

else djm:=djm-StrToFloat(Cells[j,npk+i]);

if djM=0 then Cells[j,npk + m+1]:=FloatToStr(roundto(c_,-3))

Else

begin

if c_<0 then Cells[j,npk + m+1]:=FloatToStr(roundto(djm,-3))+'M'+FloatToStr(roundto(c_,-3));

if c_=0 then Cells[j,npk + m+1]:=FloatToStr(roundto(djm,-3))+'M';

if c_>0 then Cells[j,npk + m+1]:=FloatToStr(roundto(djm,-3))+'M+'+FloatToStr(roundto(c_,-3));

end;

if j=3 then begin djmin_z:=djm; djmin_c:=c_; djmin:=j; end;

if (j>3)and((djM<djmin_z)or((djM=djmin_z)and(c_<djmin_c))) then

begin djmin_z:=djm; djmin_c:=c_; djmin:=j; end;

end

else Cells[j,npk + m+1]:='0';

{next j}

End; {isM=1}

if isM=1 then

if (djmin_z>0)or((djmin_z=0)and(djmin_c>=0)) then

begin

ShowMessage('Функція не має розв"язку через несумісність умов');

goto 1;

end;

if (isM=0)and(djmin_z>=0) then

begin

//виведення результатів

MemoDUO.Lines.Add('');

MemoDUO.Lines.Add('Оптимальний план прямої задачі:');

for iii := 1 to m do

MemoDUO.Lines.Add(Cells[1, npk+iii]+ ' = ' + Cells[0, npk+iii]);

MemoDUO.Lines.Add('Оцінки прямої задачі:');

for iii := 1 to n2 do

MemoDUO.Lines.Add('d' + Cells[iii+2,1] + ' = ' + Cells[iii+2, npk+m+1]);

ShowMessage('План оптимальний');

goto 1;

end;

roz_s:=djmin;

ind:=1;

{розв'язковий рядок}

isb:=0;

i:=1;

roz_r:=0;

While ((isb=0) And (i<=m)) do

begin

If StrToFloat(Cells[roz_s,npk+i])>0 Then

begin

isb:=1;

mina:=StrToFloat(Cells[2,npk+i])/StrToFloat(Cells[roz_s,npk+i]);

roz_r:=i;

end;

i:=i+1;

end;

If isb=0 Then begin showmessage('Функція необмежена'); goto 1; end;

For i:=1 To m do

If ((StrToFloat(Cells[roz_s,npk+i])>0)And(isM=0)) Or ((StrToFloat(Cells[roz_s,npk+i])>0)And(isM=1)And(Cells[0,npk+i]='-M')) Then

If (StrToFloat(Cells[2,npk+i])/StrToFloat(Cells[roz_s,npk+i]))<=mina Then

begin

mina:=StrToFloat(Cells[2,npk+i])/StrToFloat(Cells[roz_s,npk+i]);

roz_r:=i;

end;

roz_r:=roz_r+npk;

npk0:=npk;

npk:=npk+m+2;

{переписуємо і міняємо базову змінну}

rowcount:=npk+m+2;

if cells[0,roz_r]='-M' then

for j:=1 to n2 do

if (cells[1,roz_r]=cells[j+2,1]) then cells[j+2,npk]:='вибула';

for j:=1 to n2 do

if (cells[j+2,npk0]='вибула') then cells[j+2,npk]:='вибула';

if (npk+m<14) then Height:=25*(npk+m+2)

else

begin

height:=13*25;

width:=width+18;

end;

For i:=1 To (m+1) do

If (npk0+i=roz_r) Then

begin

Cells[1,npk+i]:=Cells[roz_s,1];

Cells[0,npk+i]:=Cells[roz_s,0]

end

Else

begin

Cells[1,npk+i]:=Cells[1,npk0+i];

Cells[0,npk+i]:=Cells[0,npk0+i];

end;

iter:=iter+1;

cells[0,npk0+m+2]:='ітер '+inttostr(iter);

cells[1,npk0+m+2]:='р.ел ('+Inttostr(roz_r-npk0)+';'+Inttostr(roz_s-2)+')';

{заповнюємо симплекс табличку}

For j:=0 To n2 do

if cells[j+2,npk]<>'вибула' then

begin

For i:=1 To m do

If (npk0+i=roz_r) Then

Cells[j+2,npk+i]:=FloatToStr(roundto(StrToFloat(Cells[j+2,npk0+i])/StrToFloat(Cells[roz_s,roz_r]),-3))

Else

Cells[j+2,npk+i]:=FloatToStr(roundto(StrToFloat(Cells[j+2,npk0+i])-StrToFloat(Cells[roz_s,npk0+i])*StrToFloat(Cells[j+2,roz_r])/StrToFloat(Cells[roz_s,roz_r]),-3));

end

else For i:=1 To m do Cells[j+2,npk+i]:='-';

end;

end;

1:end;

procedure TForm1.N_DZ_standartClick(Sender: TObject);

var i,j:integer;

first_el:boolean;

s:string;

begin

begin

// Зміни в доступності пунктів меню

N_makeDZ.Enabled:=false;

N_makePZ.Enabled:=true;

N4.Enabled:=false;

// Зведення задачі до стандартизованого вигляду ПЗ

if extremum_max then

begin

extremum_max:=false;

for j := 1 to n do

C[j]:=-1*C[j];

end;

for i := 1 to m do

if Znak[i]=1 then

begin

Znak[i]:=2;

for j := 1 to n do

A[i,j]:=-1*A[i,j];

B[i]:=-1*B[i];

end;

// Зробимо видимою панель виводу результатів

PanelDUO.Visible:=true;

SGRD_A.Enabled:=false;

MemoDUO.Lines.Add('');

MemoDUO.Lines.Add(' Стандартизований вигляд (Двоїста задача):');

//Вивід ЦФ прямої задачі

first_el := true;

for j := 1 to n do

if C[j]<>0 then

begin

if not first_el then

begin

if C[j]>0 then s:=s+ ' + '

else s:=s+ ' - ';

end

else

begin

first_el:=false;

if C[j]<0 then s:=s+ '-';

end;

s:=s + FloatToStr(ABS(C[j])) + ' y' + FloatToStr(j);

end;

s:=s+' -> ';

if extremum_max then s:=s + 'max'

else s:=s + 'min';

MemoDUO.Lines.Add(s);

//вивід обмежень прямої задачі

for i := 1 to m do

begin

s:='';

first_el := true;

for j := 1 to n do

if A[i,j]<>0 then

begin

if not first_el then

begin

if A[i,j]>0 then s:=s+ ' + '

else s:=s+ ' - ';

end

else

begin

first_el:=false;

if A[i,j]<0 then s:=s+ '-';

end;

s:=s + FloatToStr(Abs(A[i,j])) + ' y' + FloatToStr(j);

end;

case Znak[i] of

0:s:=s+' = ';

1:s:=s+' <= ';

2:s:=s+' >= ';

end;

s:=s + FloatToStr(B[i]);

MemoDUO.Lines.Add(s);

end;

// вивід обмежень на невід'ємність змінних

s:='';

first_el := true;

for j := 1 to n do

if X_nevid[j] then

begin

if not first_el then

begin

s:=s+ ', ';

end

else first_el:=false;

s:=s + 'y' + FloatToStr(j);

end;

s:=s+' >= 0 ';

MemoDUO.Lines.Add(s);

end;

end;

procedure TForm1.N_makeDZClick(Sender: TObject);

var i,j:integer;

first_el:boolean;

s:string;

begin

begin

// Зміни в доступності пунктів меню

N_DZ_standart.Enabled:=true;

N_PZ_standart.Enabled:=true;

N4.Enabled:=false;

// Зробимо видимою панель виводу результатів

PanelDUO.Visible:=true;

SGRD_A.Enabled:=false;

MemoDUO.Lines.Add('');

MemoDUO.Lines.Add(' ДВОЇСТА ЗАДАЧА');

//Вивід ЦФ прямої задачі

first_el := true;

for i := 1 to m do

if B[i]<>0 then

begin

if not first_el then

begin

if B[i]>0 then s:=s+ ' + '

else s:=s+ ' - ';

end

else

begin

first_el:=false;

if B[i]<0 then s:=s+ '-';

end;

s:=s + FloatToStr(ABS(B[i])) + ' y' + FloatToStr(i);

end;

s:=s+' -> min';

MemoDUO.Lines.Add(s);

//вивід обмежень прямої задачі

for j := 1 to n do

begin

s:='';

first_el := true;

for i := 1 to m do

if A[i,j]<>0 then

begin

if not first_el then

begin

if A[i,j]>0 then s:=s+ ' + '

else s:=s+ ' - ';

end

else

begin

first_el:=false;

if A[i,j]<0 then s:=s+ '-';

end;

s:=s + FloatToStr(Abs(A[i,j])) + ' y' + FloatToStr(i);

end;

if X_nevid[j] then s:=s+' >= '

else s:=s+' = ';

s:=s + FloatToStr(C[j]);

MemoDUO.Lines.Add(s);

end;

// вивід обмежень на невід'ємність змінних

s:='';

first_el := true;

for i := 1 to m do

if Znak[i]<>0 then

begin

if not first_el then

begin

s:=s+ ', ';

end

else first_el:=false;

s:=s + 'y' + FloatToStr(i);

end;

s:=s+' >= 0 ';

MemoDUO.Lines.Add(s);

end;

end;

procedure TForm1.N_makePZClick(Sender: TObject);

var i,j:integer;

first_el:boolean;

s:string;

begin

begin

// Зміни в доступності пунктів меню

N_DZ_standart.Enabled:=true;

N_PZ_standart.Enabled:=true;

N4.Enabled:=false;

// Зробимо видимою панель виводу результатів

PanelDUO.Visible:=true;

SGRD_A.Enabled:=false;

MemoDUO.Lines.Add('');

MemoDUO.Lines.Add(' ПРЯМА ЗАДАЧА');

//Вивід ЦФ прямої задачі

first_el := true;

for i := 1 to m do

if B[i]<>0 then

begin

if not first_el then

begin

if B[i]>0 then s:=s+ ' + '

else s:=s+ ' - ';

end

else

begin

first_el:=false;

if B[i]<0 then s:=s+ '-';

end;

s:=s + FloatToStr(ABS(B[i])) + ' х' + FloatToStr(i);

end;

s:=s+' -> max';

MemoDUO.Lines.Add(s);

//вивід обмежень прямої задачі

for j := 1 to n do

begin

s:='';

first_el := true;

for i := 1 to m do

if A[i,j]<>0 then

begin

if not first_el then

begin

if A[i,j]>0 then s:=s+ ' + '

else s:=s+ ' - ';

end

else

begin

first_el:=false;

if A[i,j]<0 then s:=s+ '-';

end;

s:=s + FloatToStr(Abs(A[i,j])) + ' х' + FloatToStr(i);

end;

if X_nevid[j] then s:=s+' <= '

else s:=s+' = ';

s:=s + FloatToStr(C[j]);

MemoDUO.Lines.Add(s);

end;

// вивід обмежень на невід'ємність змінних

s:='';

first_el := true;

for i := 1 to m do

if Znak[i]<>0 then

begin

if not first_el then

begin

s:=s+ ', ';

end

else first_el:=false;

s:=s + 'х' + FloatToStr(i);

end;

s:=s+' >= 0 ';

MemoDUO.Lines.Add(s);

end;

end;

procedure TForm1.N_PZ_StandartClick(Sender: TObject);

var i,j:integer;

first_el:boolean;

s:string;

begin

begin

// Зміни в доступності пунктів меню

N_makeDZ.Enabled:=true;

N_makePZ.Enabled:=false;

N4.Enabled:=false;

// Зведення задачі до стандартизованого вигляду ПЗ

if not extremum_max then

begin

extremum_max:=true;

for j := 1 to n do

C[j]:=-1*C[j];

end;

for i := 1 to m do

if Znak[i]=2 then

begin

Znak[i]:=1;

for j := 1 to n do

A[i,j]:=-1*A[i,j];

B[i]:=-1*B[i];

end;

// Зробимо видимою панель виводу результатів

PanelDUO.Visible:=true;

SGRD_A.Enabled:=false;

MemoDUO.Lines.Add('');

MemoDUO.Lines.Add(' Стандартизований вигляд (Пряма задача):');

//Вивід ЦФ прямої задачі

first_el := true;

for j := 1 to n do

if C[j]<>0 then

begin

if not first_el then

begin

if C[j]>0 then s:=s+ ' + '

else s:=s+ ' - ';

end

else

begin

first_el:=false;

if C[j]<0 then s:=s+ '-';

end;

s:=s + FloatToStr(ABS(C[j])) + ' X' + FloatToStr(j);

end;

s:=s+' -> ';

if extremum_max then s:=s + 'max'

else s:=s + 'min';

MemoDUO.Lines.Add(s);

//вивід обмежень прямої задачі

for i := 1 to m do

begin

s:='';

first_el := true;

for j := 1 to n do

if A[i,j]<>0 then

begin

if not first_el then

begin

if A[i,j]>0 then s:=s+ ' + '

else s:=s+ ' - ';

end

else

begin

first_el:=false;

if A[i,j]<0 then s:=s+ '-';

end;

s:=s + FloatToStr(Abs(A[i,j])) + ' X' + FloatToStr(j);

end;

case Znak[i] of

0:s:=s+' = ';

1:s:=s+' <= ';

2:s:=s+' >= ';

end;

s:=s + FloatToStr(B[i]);

MemoDUO.Lines.Add(s);

end;

// вивід обмежень на невід'ємність змінних

s:='';

first_el := true;

for j := 1 to n do

if X_nevid[j] then

begin

if not first_el then

begin

s:=s+ ', ';

end

else first_el:=false;

s:=s + ' X' + FloatToStr(j);

end;

s:=s+' >= 0 ';

MemoDUO.Lines.Add(s);

end;

end;

procedure TForm1.N_VVIDClick(Sender: TObject);

begin

Panel_ROZMIRU.Visible:=true;

Edit_N.Enabled:=true;

Edit_M.Enabled:=true;

CBox_EXTREMUM.Enabled:=true;

BtnRozmiryEnter.Enabled:=true;

Panel_A.Visible:=false;

N2.Enabled:=true;

N_PZ_Standart.Enabled:=false;

N_DZ_standart.Enabled:=false;

end;

end.

Размещено на Allbest.ru

...

Подобные документы

  • Початковий опорний план, перехід від одного до іншого. Оптимальний розв’язок, його головні критерії. Знаходження опорного плану задачі, складання симплексної таблиці. Приклад оформлення першої та другої таблиці для розв’язку задач лінійного програмування.

    лекция [479,7 K], добавлен 10.10.2013

  • Лінійне програмування як один з найбільш популярних апаратів математичної теорії оптимального управління рішень. Опис існуючих методів розв’язку задач лінійного програмування. Завдання, основні принципи, алгоритми і головна мета лінійного програмування.

    курсовая работа [363,8 K], добавлен 03.12.2009

  • Задача лінійного програмування. Розв’язання задачі геометричним методом. Приведення системи рівнянь до канонічного вигляду. Розв’язання симплекс-методом. Розв’язок двоїстої задачі. Задача цілочислового програмування і дробово-лінійного програм.

    контрольная работа [385,2 K], добавлен 04.06.2009

  • Застосування симплекс-методу для розв’язання оптимізаційних задач лінійного програмування, що містять три змінні. Функції ітераційної обчислювальної процедури, що виконують приведення до зручного для розв’язання оптимального вигляду ЗЛП за кілька кроків.

    курсовая работа [359,5 K], добавлен 18.09.2013

  • Використання мови програмуванння Java при виконанні "задачі лінійного програмування": її лексична структура і типи даних. Методи розв’язання задачі. Особливості логічної структури програми, побудова її зручного інтерфейсу за допомогою симплекс методу.

    курсовая работа [437,9 K], добавлен 24.01.2011

  • Відомості з теорії графів, методи отримання точних розв'язків задачі їх розфарбування. Алгоритм розфарбування графу методом неявного перебору. Комп'ютерна реалізація розв’язку задачі розфарбування графів. Типові задачі та існуючі програмні продукти.

    курсовая работа [335,6 K], добавлен 15.06.2015

  • Класифікація економіко-математичних моделей. Математична модель оптимізаційної задачі. Локальний критерій оптимальності. Поняття теорії ігор. Матричні ігри двох осіб. Гра зі змішаними стратегіями. Зведення матричної гри до задачі лінійного програмування.

    дипломная работа [2,9 M], добавлен 22.10.2012

  • Теоретичні основи та приклади економічних задач лінійного програмування. Розробка математичної моделі задачі (запис цільової функції і системи обмежень) і програмного забезпечення її вирішення за допомогою "Пошуку рішень" в Excel симплекс-методом.

    курсовая работа [993,9 K], добавлен 10.12.2010

  • Розв’язок багатокритеріальної задачі лінійного програмування з отриманням компромісного рішення (для задач з кількома функціями мети) за допомогою теоретико-ігрового підходу. Матриця мір неоптимальності та рядок функції мети. Модуль опису класу.

    курсовая работа [588,8 K], добавлен 15.05.2011

  • Приклади застосування цілочисельних задач лінійного програмування у плануванні та управлінні виробництвом, геометрична інтерпретація їх розв’язків на площині. Завдання складання розкладу занять на математичному факультеті. Математична модель розкладу.

    дипломная работа [933,1 K], добавлен 23.09.2012

  • Постановка задачі багатокритеріальної оптимізації та її та математична модель. Проблеми і класифікація методів вирішення таких задач, способи їх зведення до однокритеріальних. Метод послідовних поступок. Приклад розв'язування багатокритеріальної задачі.

    курсовая работа [207,3 K], добавлен 22.12.2013

  • Постановка та описання алгоритму розв’язання задачі про оптимальне призначення, формулювання вимог. Обґрунтування вибору засобів програмування. Розробка структури програми та системи її візуалізації, тестування та верифікація, оцінка ефективності.

    курсовая работа [1,1 M], добавлен 12.05.2013

  • Види рівнянь та методи їх розв’язань. Чисельні методи уточнення коренів, постановка задачі. Рішення нелінійного рівняння методом простих та дотичних ітерацій. Використання програмних засобів. Алгоритми розв’язку задач. Програми мовою С++, їх тестування.

    курсовая работа [232,2 K], добавлен 12.02.2013

  • Технологія візуального проектування. Аналітичне розв’язання задачі в загальному вигляді. Програмування в консольному режимі. Сценарій розв’язання задачі в Delphi та блок-схема алгоритму. Програмний код додатку та опис інтерфейсу з екранними копіями.

    курсовая работа [2,4 M], добавлен 22.06.2009

  • Системи автоматичного керування. Описання методу стикування розв'язків на основі теореми по n-інтервалів. Застосування методу динамічного програмування (рівняння Р. Белмана). Моделювання задачі синтезу та аналізу на електронній обчислювальній машині.

    контрольная работа [632,5 K], добавлен 31.03.2014

  • Формулювання умови задачі в термінах теорії графів. Метод вирішення задачі й алгоритм написання програми на мові C++. Розробка інструкції користувача, розрахунок контрольних прикладів й аналіз результатів. Приклади практичного застосування програми.

    курсовая работа [526,2 K], добавлен 31.01.2014

  • Розповсюдження об'єкно-орієнтованих мов програмування. Моделювання предметної області. Постановка задачі. Інформаційне забезпечення. Алгоритм розв'вязання задачі. Пограмне забезпечення. Основні задачі при моделюванні предметної області. Стан сутностей.

    курсовая работа [772,8 K], добавлен 03.10.2008

  • Метод розв’язків рівнянь більш високих порядків. Вибір методу розв'язання задачі Коші. Методи розв'язання крайових задач розглядаються на прикладі звичайного диференціального рівняння другого порядку. Вибір методу інструментальних засобів вирішення задач.

    курсовая работа [132,0 K], добавлен 03.12.2009

  • Основні визначення дослідження операцій. Модель "затрати-випуск" В.В. Леонтьєва. Загальний вигляд задачі лінійного програмування. Розв'язання за допомогою симплекс-методу. Економічна інтерпретація основної та спряженої задач. Поліпшення плану перевезень.

    учебное пособие [1,1 M], добавлен 27.12.2010

  • Дискретизація задачі із закріпленим лівим і вільним правим кінцем. Необхідні умови оптимальності. Ітераційний метод розв’язання дискретної задачі оптимального керування з двійним перерахуванням. Оптимальне стохастичне керування. Мінімаксне керування.

    контрольная работа [221,8 K], добавлен 19.12.2010

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.