RSS    

   Курсовая работа: Транспортная задача по критериям стоимости и времени

12.  Проверяем матрицу С(2) на наличие отрицательных элементов. Если такие элементы присутствуют, то повторяем пункты с 5 по11.

13.  Если во время решения достоверность результатов нарушается, прекращаются дальнейшие вычисления, пользователю выдается информация об ошибке.

14.  Дооптимизация по времени.

14.1.  Ищем отличный от нуля элемент в матрице X(k), которому соответствует наибольший элемент матрицы Т=tmax.

14.2.  Ищем в матице С(k) нули соответствующие таким нулям в матрице X(k), что соответствующие им элементы матрицы Т меньше tmax.

14.3.  Если в предыдущем пункте нашелся хоть один ноль, то производим процедуры пунктов 7-10.

14.4.  Переходим к пункту 14.1.

15.  Вывод результатов.


6. Листинг программы, реализующий алгоритм задачи

const

color=TColor(Clred);

var i,j,v,w:integer;

err,kon:boolean;

str:String;

begin

kon:=true;

Label3.Caption:='';

for j:=1 to StringGrid1.RowCount-1 do

if (StringGrid1.Cells[1,j]='')or(StringGrid1.Cells[0,j]='')then

kon:=false;

for j:=1 to StringGrid2.RowCount-1 do

if (StringGrid2.Cells[1,j]='')or(StringGrid2.Cells[0,j]='')then

kon:=false;

if kon=true then

begin

err:=true;

for j:=1 to StringGrid1.RowCount-1 do

begin

Str:=Trim(StringGrid1.Cells[1,j]);

Recurs(str,1,err);

If err=false then

begin

StringGrid1.Canvas.Brush.color := color;

StringGrid1.canvas.fillRect(StringGrid1.CellRect(1,j));

StringGrid1.canvas.TextOut(StringGrid1.CellRect(1,j).Left,StringGrid1.CellRect(1,j).Top,StringGrid1.Cells[1,j]);

Label3.Caption:= ’Выделенные значения не верны';

end;

Err:=true;

end;

for j:=1 to StringGrid2.RowCount-1 do

begin

Str:=Trim(StringGrid2.Cells[1,j]);

Recurs(str,1,err);

If err=false then

begin

StringGrid2.Canvas.Brush.color := color;

StringGrid2.canvas.fillRect(StringGrid2.CellRect(1,j));

StringGrid2.canvas.TextOut(StringGrid2.CellRect(1,j).Left,StringGrid2.CellRect(1,j).Top,StringGrid2.Cells[1,j]);

Label3.Caption:= ‘Выделенные значения не верны';

end;

Err:=true;

end;

for j:=1 to StringGrid1.RowCount-1 do

begin

Str:=Trim(StringGrid1.Cells[1,j]);

Recurs(str,1,err);

end;

for j:=1 to StringGrid2.RowCount-1 do

begin

Str:=Trim(StringGrid2.Cells[1,j]);

Recurs(str,1,err);

end;

If err=true then

begin

for j:=1 to StringGrid1.RowCount-1 do

begin

If (StrToInt(trim(StringGrid1.Cells[1,j]))<0)or(StrToInt(trim(StringGrid1.Cells[1,j]))>190)

then

begin

StringGrid1.Canvas.Brush.color := color;

StringGrid1.canvas.fillRect(StringGrid1.CellRect(1,j));

StringGrid1.canvas.TextOut(StringGrid1.CellRect(1,j).Left,StringGrid1.CellRect(1,j).Top,StringGrid1.Cells[1,j]);

err:=false;

Label3.Caption:= ‘Выделенные значения не верны';

end;

end;

for j:=1 to StringGrid2.RowCount-1 do

begin

If (StrToInt(trim(StringGrid2.Cells[1,j]))<0)or(StrToInt(trim(StringGrid2.Cells[1,j]))>160)

then

begin

StringGrid2.Canvas.Brush.color := color;

StringGrid2.canvas.fillRect(StringGrid2.CellRect(1,j));

StringGrid2.canvas.TextOut(StringGrid2.CellRect(1,j).Left,StringGrid2.CellRect(1,j).Top,StringGrid2.Cells[1,j]);

err:=false;

Label3.Caption:= ‘Выделенные значения не верны';

end;

end;

if err=true then

begin

w:=0;//ai

v:=0;//bj

SetLength(c,StringGrid2.RowCount-1,StringGrid1.RowCount-1);

SetLength(t,StringGrid2.RowCount-1,StringGrid1.RowCount-1);

SetLength(a,StringGrid1.RowCount-1);

SetLength(b,StringGrid2.RowCount-1);

//Проверка условия баланса

For i:=1 to StringGrid1.RowCount-1 do

w:=w+StrToint(Trim(StringGrid1.cells[1,i]));

For i:=1 to StringGrid2.RowCount-1 do

v:=v+StrToint(Trim(StringGrid2.cells[1,i]));

if w<v then

begin

Setlength(c,(StringGrid2.RowCount-1),(StringGrid1.RowCount));

SetLength(a,StringGrid1.RowCount);

for i:=0 to Length(c)-1 do

begin

c[i,Length(c[1])-1]:=1000;

end;

a[length(a)-1]:=v-w;

end;

if w>v then

begin

Setlength(c,(StringGrid2.RowCount),(StringGrid1.RowCount-1));

SetLength(b,StringGrid2.RowCount);

for i:=0 to Length(c[1])-1 do

begin

c[length(c)-1,i]:=1000;

end;

b[length(b)-1]:=w-v;

end;

For i:=0 to StringGrid1.RowCount-2 do

a[i]:=StrtoInt(Trim(StringGrid1.cells[1,i+1]));

For i:=0 to StringGrid2.RowCount-2 do

b[i]:=StrtoInt(Trim(StringGrid2.Cells[1,i+1]));

For i:=1 to StringGrid1.RowCount-1 do

begin

Form3.StringGrid1.Cells[0,i]:=StringGrid1.cells[0,i];

Form3.StringGrid2.Cells[0,i]:=StringGrid1.cells[0,i];

end;

For i:=1 to StringGrid2.RowCount-1 do

begin

Form3.StringGrid1.Cells[i,0]:=StringGrid2.cells[0,i];

Form3.StringGrid2.Cells[i,0]:=StringGrid2.cells[0,i];

end;

Form3.Show;

Form5.Close;

end;

end;

end

else ShowMessage('Заполните все поля');

procedure Potencial(x:Tmatr; u,v:Tmas; var z:Tmatr );

var

i,j,k,r:integer;

begin

SetLength(u,length(x[1]));

SetLength(v,Length(x));

For r:=0 to Length(x)-1 do

v[r]:=-1000;

for j:=0 to Length(x[1])-1 do

u[j]:=-1000;

u[0]:=0;

For r:=0 to Length(x)-1 do

for j:=0 to Length(x[1])-1 do

begin

for i:=0 to Length(x)-1 do

if (x[i,j]<>0) and (v[i]=-1000)then

if (u[j]<>-1000)then

v[i]:=c[i,j]+u[j];

For i:=0 to Length(x)-1 do

if v[i]<>-1000 then

for k:=0 to Length(x[1])-1 do

if (k<>j)and(x[i,k]<>0)and(u[k]=-1000)then

u[k]:=v[i]-c[i,k];

end;

Setlength(z,Length(c),Length(c[1]));

For i:=0 to Length(x)-1 do

For j:=0 to Length(x[1])-1 do

z[i,j]:=c[i,j]-(v[i]-u[j]);

end;

//Проверкана вырожденость

procedure Virogden(var x:Tmatr);

var i,j,r,k,d:integer;

h,g:boolean;

begin

d:=0;

For i:=0 to Length(x)-1 do

for j:=0 to length(x[1])-1 do

if x[i,j]<>0 then d:=d+1;

if d<Length(x)+Length(x[1])-1 then

For i:=0 to Length(x)-2 do

for j:=0 to Length(x[1])-2 do

begin

if x[i,j]>0 then

begin

h:=true;

g:=true;

for r:=i+1 to Length(x)-1 do

if x[r,j]>0 then

h:=false;

for k:=j+1 to Length(x[1])-1 do

if x[i,k]>0 then

g:=false;

if(h=true)and(g=true) then

x[i,j+1]:=-2;

end;

end;

end;

procedure Opornplan(StringGrid1:TStringGrid; var x,z:Tmatr);

var i,j:integer;

c1:TMatr;

begin

Setlength(x,Length(c),Length(c[1]));

Setlength(c1,Length(x)*Length(x[1]),3);

For i:=0 to Length(x)-1 do

for j:=0 to Length(x[1])-1 do

begin

c1[(Length(x[1]))*i+j,0]:=c[i,j];

c1[(Length(x[1]))*i+j,1]:=i;

c1[(Length(x[1]))*i+j,2]:=j;

end;

Setlength(z,1,3);

//Сортировка

For i:=0 to Length(c1)-2 do

for j:=0 to Length(c1)-2 do

if c1[j,0]>c1[j+1,0] then

begin

z[0]:=c1[j+1];

c1[j+1]:=c1[j];

c1[j]:=z[0];

end;

for i:=0 to Length(x)-1 do

for j:=0 to Length(x[1])-1 do

x[i,j]:=-1;

For i:=0 to Length(x)*Length(x[1])-1 do

if x[c1[i,1],c1[i,2]]=-1 then

begin

//Если à>b

If a[c1[i,2]]>b[c1[i,1]] then

begin

x[c1[i,1],c1[i,2]]:=b[c1[i,1]];

For j:=0 to Length(x[1])-1 do

If x[c1[i,1],j]=-1 then

x[c1[i,1],j]:=0;

a[c1[i,2]]:=a[c1[i,2]]-b[c1[i,1]];

b[c1[i,1]]:=0;

end;

//Если b>a

If a[c1[i,2]]<b[c1[i,1]] then

begin

x[c1[i,1],c1[i,2]]:=a[c1[i,2]];

For j:=0 to Length(x)-1 do

if x[j,c1[i,2]]=-1 then

x[j,c1[i,2]]:=0;

b[c1[i,1]]:=b[c1[i,1]]-a[c1[i,2]];

a[c1[i,2]]:=0;

end;

//Если равны

If a[c1[i,2]]=b[c1[i,1]] then

begin

x[c1[i,1],c1[i,2]]:=a[c1[i,2]];

For j:=0 to Length(x[1])-1 do

if x[c1[i,1],j]=-1 then

x[c1[i,1],j]:=0;

For j:=0 to Length(x)-1 do

If x[j,c1[i,2]]=-1 then

x[j,c1[i,2]]:=0;

a[c1[i,2]]:=0;

b[c1[i,1]]:=0;

end;

end;

//Проверка на вырожденность

Virogden(x);

potencial(x,u,v,z);

end;

procedure Vicherk(var z:TMatr;var err:boolean);

var i,j,min,k:integer;

w,d:Tmas;

begin

SetLength(w,Length(z));

SetLength(d,Length(z[1]));

min:=z[0,0];

k:=0;

For i:=0 to length(w)-1 do

for j:=0 to length(d)-1 do

if z[i,j]<min then

begin

min:=z[i,j];

k:=j;

end;

for i:=0 to length(w)-1 do

if (z[i,k]=0)and(x[i,k]<>0) then

w[i]:=5;

d[k]:=-1;

For k:=0 to length(d)*Length(w)-2 do

begin

for i:=0 to Length(w)-1 do

if w[i]>0 then

begin

for j:=0 to Length(d)-1 do

if (z[i,j]=0)and(x[i,j]<>0)and(d[j]<>-1) then

d[j]:=5;

w[i]:=-1;

end;

For j:=0 to Length(d)-1 do

if d[j]>0 then

begin

for i:=0 to Length(w)-1 do

if (z[i,j]=0)and(x[i,j]<>0)and(w[i]<>-1) then

Страницы: 1, 2, 3, 4


Новости


Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

                   

Новости

© 2010.