//
// Вызов процедуры поиска кратчайших расстояний
//
procedure TMainView.btnFindShortcutsClick(Sender: TObject);
var
i, j: Integer;
begin
for i:=1 to Ai do
begin
Dijkstra(i); //найти кратчайшее расстояние
for j:=1 to Bj do
StGr.Cells[j,i]:=FloatToStr(MatrRas[i,j]);
end;
for i:=1 to Ai do
for j:=1 to bj do
MatrRas[i,j] := StrToFloat(StGr.Cells[j,i]);
btnBasicPlan.Enabled := True;
btnFindShortcuts.Enabled := False;
//btn6.Enabled :=True;
//btnOptimize.Enabled := True;
end;
Формирование маршрутов в методе Дейкстра [Delphi]
На самом деле эта процедура используется в комплексе который решает транспортную задачу и она справляется с этой задачей. Входная матрица смежности (С) имеет размерность 108х108
Что я делаю не так? Очень нужна ваша помощь, скоро нужно сдавать.
Код:
Код:
//
// Процедура нахождения кратчайших расстояний (Дейкстра)
//
procedure TMainView.Dijkstra(Ver: Integer);
var
v, s: array[1..nn] of integer;
d, d2, b: array[1..nn] of real;
k: Array[1..nn,1..nn] of Real;
i, g, z, j, w: integer;
l: Real;
str, str2 ,str3: String;
begin
//---------Начальный шаг------------------
w := 1;
s[ver] := ver; //добавляем вершину источник
str := IntToStr(ver);
// первая строка, первых три столбца
StGD.Cells[0,1]:='Нач.';
StGD.Cells[1,1]:='{'+IntToStr(s[ver])+'}';
StGD.Cells[2,1]:='-';
for i:=1 to n do begin
d:=c[ver,i];
v:=ver;
end;
//----Поиск минимального значения
a := d[1];
For i:=2 To n Do
If (d < a) Then
a := d;
for i:=1 to n do begin
if d=a then begin
w:=i; // № вершины
end;
end;
//---Добавить строку в D
j:=1;
for i:=1 to n do
if i<>ver then begin
if d=sum then StgD.Cells[j+2,1]:=' ~ '
else StgD.Cells[j+2,1]:=FloatToStr(d);
k[1,j+1]:=d;
Inc(j);
end;
//------Cледующий шаг
for g:=1 to n do begin
for i:=1 to n do begin
b:=min(d,(d[w]+c[w,i]));
v[g+1]:=w;
end;
for i:=1 to n do begin
if s=0 then
d2:=b;
end;
s[w]:=w;
str:=str+', '+IntToStr(w);
StGD.Cells[0,g+1]:=IntToStr(g);
StGD.Cells[1,g+1]:='{'+str+'}';
StGD.Cells[2,g+1]:=IntToStr(w);
for i:=1 to n do begin
d:=b;
end;
j:=1;
for i:=1 to n do
if i<>ver then begin
if d = sum then StgD.Cells[j+2,g+1]:=' ~ '
else StgD.Cells[j+2,g+1]:=FloatToStr(d);
k[g+1,j+1]:=d;
Inc(j);
end;
for i:=1 to n do begin
if s<>0 then
d2:=sum;
end;
a := d2[1];
For i:=2 To n Do
If (d2 < a) Then
a := d2;
for i:=1 to n do begin
if s=0 then
if d2=a then begin
w:=i; // № вершины
end;
end;
end; //g
// Записать матрицу кратчайших расстояний
j:=1;
for i:=ai+1 to n do begin
MatrRas[ver,j]:=d;
inc(j);
end;
//последовательность вершин входящих в путь
for j:=1 to n do begin
str2:=IntToStr(ver);
if j<>ver then begin
for i:=1 to n do begin
if k[i,j]=k[i+1,j] then
str2:=str2
else if k[i,j]<>k[i+1,j] then
str2:=str2+' --> '+IntToStr(v[i+1]);
end;
str2:=str2+' --> '+ IntToStr(j);
l:=k[n,j];
if l = 0 then
str3:='нет пути'
else str3:=str2+' = '+FloatToStr(k[n,j]);
LBox1.Items.Add(str3);
end;
end;
end;
// Процедура нахождения кратчайших расстояний (Дейкстра)
//
procedure TMainView.Dijkstra(Ver: Integer);
var
v, s: array[1..nn] of integer;
d, d2, b: array[1..nn] of real;
k: Array[1..nn,1..nn] of Real;
i, g, z, j, w: integer;
l: Real;
str, str2 ,str3: String;
begin
//---------Начальный шаг------------------
w := 1;
s[ver] := ver; //добавляем вершину источник
str := IntToStr(ver);
// первая строка, первых три столбца
StGD.Cells[0,1]:='Нач.';
StGD.Cells[1,1]:='{'+IntToStr(s[ver])+'}';
StGD.Cells[2,1]:='-';
for i:=1 to n do begin
d:=c[ver,i];
v:=ver;
end;
//----Поиск минимального значения
a := d[1];
For i:=2 To n Do
If (d < a) Then
a := d;
for i:=1 to n do begin
if d=a then begin
w:=i; // № вершины
end;
end;
//---Добавить строку в D
j:=1;
for i:=1 to n do
if i<>ver then begin
if d=sum then StgD.Cells[j+2,1]:=' ~ '
else StgD.Cells[j+2,1]:=FloatToStr(d);
k[1,j+1]:=d;
Inc(j);
end;
//------Cледующий шаг
for g:=1 to n do begin
for i:=1 to n do begin
b:=min(d,(d[w]+c[w,i]));
v[g+1]:=w;
end;
for i:=1 to n do begin
if s=0 then
d2:=b;
end;
s[w]:=w;
str:=str+', '+IntToStr(w);
StGD.Cells[0,g+1]:=IntToStr(g);
StGD.Cells[1,g+1]:='{'+str+'}';
StGD.Cells[2,g+1]:=IntToStr(w);
for i:=1 to n do begin
d:=b;
end;
j:=1;
for i:=1 to n do
if i<>ver then begin
if d = sum then StgD.Cells[j+2,g+1]:=' ~ '
else StgD.Cells[j+2,g+1]:=FloatToStr(d);
k[g+1,j+1]:=d;
Inc(j);
end;
for i:=1 to n do begin
if s<>0 then
d2:=sum;
end;
a := d2[1];
For i:=2 To n Do
If (d2 < a) Then
a := d2;
for i:=1 to n do begin
if s=0 then
if d2=a then begin
w:=i; // № вершины
end;
end;
end; //g
// Записать матрицу кратчайших расстояний
j:=1;
for i:=ai+1 to n do begin
MatrRas[ver,j]:=d;
inc(j);
end;
//последовательность вершин входящих в путь
for j:=1 to n do begin
str2:=IntToStr(ver);
if j<>ver then begin
for i:=1 to n do begin
if k[i,j]=k[i+1,j] then
str2:=str2
else if k[i,j]<>k[i+1,j] then
str2:=str2+' --> '+IntToStr(v[i+1]);
end;
str2:=str2+' --> '+ IntToStr(j);
l:=k[n,j];
if l = 0 then
str3:='нет пути'
else str3:=str2+' = '+FloatToStr(k[n,j]);
LBox1.Items.Add(str3);
end;
end;
end;
Последний фрагмент ( //последовательность вершин входящих в путь) по идее выводит все возможные маршруты и пути должны состоять как минимум из 3-5 узлов и максимум из 10-20, но в листбоксе выводится почему то не все вершины, а только первая, предпоследняя и последняя:
[ATTACH=CONFIG]5105[/ATTACH]
Если там что-то сверх сложное готов заплатить за помощь! Ну очень нужно поскорее сделать. У самого уже мозги кипят %)
Кто заинтересован помочь, пишите на мейл skiph [at] i.ua или в аську 481-639-198