Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП_самостійне_опрацюв.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.22 Mб
Скачать

3. Пошук найкоротшого шляху.|колії|

Зазвичай|звично| завдання|задача| пошуку шляху|колії| на графі формулюється таким чином: знайти якнайкращий|щонайкращий| маршрут. Під якнайкращим|щонайкращим| маршрутом, як правило, розуміють найкоротший. Знайти найкоротший маршрут можна вибором зі|із| всіх знайдених. Проте|однак| зовсім не обов'язково шукати всі маршрути.

Можна поступити|вчинити| інакше: під час вибору чергової крапки|точки| перевірити, чи не перевищить довжина формованого маршруту довжину вже знайденого шляху|колії|, якщо ця крапка|точка| буде включена в маршрут; якщо перевищить, то цю крапку|точку| слід пропустити і вибрати іншу.

Таким чином, після того, як буде знайдений перший маршрут, програма вестиме пошук тільки|лише| по тих гілках графа, які можуть поліпшити знайдене рішення|розв'язання|, відсікаючи|відсікати| шляхи|колії|, що роблять|чинять| формований маршрут довше вже знайденого.

У лістингу нижче приведена процедура, яка використовує процедуру step|, що виконує вибір чергової точки маршруту таким чином, що забезпечується пошук шляху|колії| мінімальної довжини.

Лістинг. Пошук найкоротшого шляху|колії|

procedure TForm1.Button1Click(Sender: TObject);

const|

N=10;{ к-ть вершин графа}

var

map:array|[1..N,1..N]of| integer|;

// Карта.map[i,j|] не 0, якщо|

// точки i і j сполучені|з'єднані|

road:array|[1..N]of| integer|;

// Дорога|люба| – номери точок карти

incl:array|[1..N]of| boolean|; // incl|[1]рівний TRUE, якщо крапка|точка|

// з|із| номером i включена в road|

start|, finish:integer|;

// Початкова і кінцева|скінченна| точки

found:boolean|; len:integer|; // довжина знайденого (мінімального)

// маршруту } c_len:integer|; // довжина поточного (формованого)

// маршруту i,j:integer|;

// вибір чергової крапки|точки|

procedure step(s,f,p:integer);

var|

с:integer|; { Номер крапки|точки|, в яку робимо|чинимо| черговий крок }

i:integer; begin

if s=f then begin

len:=c_len|;{ збережемо довжину знайденого маршруту }

{ виведення знайденого маршруту }

for i:=1 to p-1 do

Label1|.caption:=Label1.caption+' '+IntToStr|(road|[i]);

Label1|.caption:=Label1.caption

+', довжина:'+IntToStr(len|)+#13;

end|

else|

{ вибираємо чергову крапку|точку| }

for c:=l to N do { перевіряємо всі вершини }

if(map[s,c]<> 0)and(NOT incite])

and((len=0)or(c_len+map[s,c]< len)) then begin

// крапка|точка| сполучена|з'єднана| з|із| поточною, але|та| не включена в

// маршрут

roadtp|]:=c;{ додамо|добавлятимемо| вершину в шлях|колію| }

incl|[c]:=TRUE;{ помітимо|позначимо| вершину як включену }

c_len:=c_len+map|[s,с|];

step|(с,f,p+l|);

incite|]:=FALSE; roadtp|]:=0;

c_len:=c_len-map|[s,с|];

end|;

end|;

{ кінець процедури step| }

begin|

Labell|.caption:='';

{ ініціалізація масивів }

for i: =1 to N do road [ i ] : =0;

for i:=l to N do incl[i]:=FALSE;

{ введення опису карти з|із| SrtingGrid|.Cells}

for i:=l to N do

for j:=1 to N do

if StringGridl.Cells[i, j] <> "

then mapti,j]:=StrToInt(StringGridl.Cells[i,j])

else mapti,j]:=0;

len:=0|; // довжина знайденого (мінімального) маршруту з|із|

len:=0|, - // довжина поточного (формованого) маршруту

start:=StrToInt|(Edit1|.text);

finish:=StrToInt|(Edit2|.text);

road|[1]:=start;{ внесемо крапку|точку| до маршруту }

incl|[start|]:=TRUE;{ помітимо|позначимо| її як включену }

step|(start,finish,2|);{шукаємо другу точку маршруту }

// перевіримо, чи знайдений хоч би|хоча би| один шлях|колія|

if not found

then Label1.caption:='Вказані крапки не сполучені!';

end|;

Питання для самоконтролю:

  1. Який алгоритм викреслювання кривої Гільберта?

  2. Коли ефективний механізм рекурсії у програмуванні?

  3. Що таке граф?

  4. Як здійснюється пошук найкоротшого шляху?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]