Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Формирование маршрутов в методе Дейкстра [Delphi]

34K
01 мая 2011 года
Skiph
9 / / 05.06.2008
Приветствую! У меня есть уже работающая процедура нахождения кратчайших путей методом Дейкстры, но она неправильно формирует кратчайшие пути, то есть, например из 1 --> 6 --> 5 --> 9

На самом деле эта процедура используется в комплексе который решает транспортную задачу и она справляется с этой задачей. Входная матрица смежности (С) имеет размерность 108х108

Что я делаю не так? Очень нужна ваша помощь, скоро нужно сдавать.

Код:
//
// Вызов процедуры поиска кратчайших расстояний
//
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;


Код:
//
// Процедура нахождения кратчайших расстояний (Дейкстра)
//
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]
34K
01 мая 2011 года
Skiph
9 / / 05.06.2008
Если там что-то сверх сложное готов заплатить за помощь! Ну очень нужно поскорее сделать. У самого уже мозги кипят %)
34K
05 мая 2011 года
Skiph
9 / / 05.06.2008
Кто заинтересован помочь, пишите на мейл skiph [at] i.ua или в аську 481-639-198
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог