Bellman Ford's
Algorithm
Bellman-Ford alqoritmi bir başlanğıc nöqtəsindən bütün digər nöqtələrə qədər
ən qısa yolları tapmaq üçün istifadə edilən yol tapma alqoritmidir. O, həmçinin
mənfi çəkili kənarları olan qraflar üzərində işləyə və hətta mənfi çəkili dövrləri
aşkar edə bilər.
Alqoritmin əsas prinsipi başlanğıc nöqtədən bütün digər nöqtələrə qədər ən
qısa yolları tapmaqdır. Alqoritm hər bir nöqtəyə məsafə dəyəri təyin edir və
daha yaxşı marşrutlar tapıldıqca bu dəyərləri təkrar-təkrar yeniləyir. Başlanğıcda
başlanğıc nöqtəsinin məsafəsi 0, digər nöqtələrin məsafələri isə sonsuz olaraq
təyin edilir. Sonra, mövcud məsafələrin yenilənməsinin lazım olub-olmadığını
yoxlayaraq nəticəni yenilənir. Mövcud olan ən qısa məsafələr seçilir.
Bellman-Ford və Floyd –Warshal alqortimləri arasındakı fərq ondan ibarətdir ki,
Bellman-Ford alqoritmi bir başlanğıc nöqtəsindən bütün digər nöqtələrə ən qısa
yolları tapmaq üçün istifadə olunur. Floyd-Warshall alqoritmi bütün cütlər
arasında ən qısa yolları tapmaq üçün istifadə olunur. Yəni istənilən iki nöqtə
arasında ən qısa yolu tapır.
Bellman-Ford alqoritmi mənfi çəkili kənarları idarə edə və hətta mənfi çəkili
dövrləri aşkar edə bilər. Bu xüsusiyyətə görə, Bellman-Ford alqoritmi mənfi çəkili
kənarları olan qraflarda istifadə edilə bilər.Dijkstra alqoritmi mənfi çəkilmiş
kənarları idarə edə bilməz. Mənfi çəkili kənarları olan graflar istifadə edildikdə,
Dijkstra alqoritmi yanlış nəticələr verə bilər. Lakin bellman –ford alqoritmi belə
çəkili qrafların səhv nəticə verməsini və qrafın sonsuz döngülərə girməsinin
qarşısını alır. Bundan başqa Bellman-Ford alqoritmi daha yavaş işləyir.
İşləmə prinsipi
Burada A çəkisindən digər bütün çəkilərə ən qısa məsafəni tapmaq üçün iterasiyadan istifadə edilir.
Bellman-Ford alqoritminin əsas prinsipi ondan ibarətdir ki, o, bir mənbədən başlayır və hər bir qovşaq
üçün məsafəni hesablayır. Məsafə ilkin olaraq bilinmir və sonsuz olduğu güman edilir, lakin zaman
keçdikcə alqoritm bir neçə qısa yol müəyyən edərək bu yollardan ən qısa olanlarını seçir.
∞
0 ∞
∞
∞
Loop A B C D E
i=0 0 ∞ ∞ ∞ ∞
i=0 i=1 i=2 i=3 i=4 i=5 i=6
A-dan B-ə 0 AB ABDB ABEDB ∞ ∞ ∞
A-dan C-ə ∞ AC ABC ABDC ABDBC ABEDC ABEDBC
A-dan D-ə ∞ ABD ABED ∞ ∞ ∞ ∞
A-dan E-ə ∞ ABE ∞ ∞ ∞ ∞ ∞
i=1
AB 0-1=-1 i1(AB)=-1
AC 0+4=4 i1(AC)=4
ABD 0 -1+2 = 1 i1(AD)=1
ABE 0 -1+2 = 1 i1(AE)=1
0
A B C D E
i=0 0 ∞ ∞ ∞ ∞
i=1 0 -1 4 1 1
i=0 i=1 i=2 i=3 i=4 i=5 i=6
A-dan B-ə 0 AB ABDB ABEDB ∞ ∞ ∞
A-dan C-ə ∞ AC ABC ABDC ABDBC ABEDC ABEDBC
A-dan D-ə ∞ ABD ABED ∞ ∞ ∞ ∞
A-dan E-ə ∞ ABE ∞ ∞ ∞ ∞ ∞
i=2
ABDB 0-1+2+1=2 i2(AB)=2
ABC 0-1+3=2 i2(AC)=2
ABED 0-1+2-3 = -2 i2(AD)=-2
0
A B C D E
i=0 0 ∞ ∞ ∞ ∞
i=1 0 -1 4 1 1
i=2 0 2 2 -2 ∞
i=0 i=1 i=2 i=3 i=4 i=5 i=6
A-dan B-ə 0 AB ABDB ABEDB ∞ ∞ ∞
A-dan C-ə ∞ AC ABC ABDC ABDBC ABEDC ABEDBC
A-dan D-ə ∞ ABD ABED ∞ ∞ ∞ ∞
A-dan E-ə ∞ ABE ABE ∞ ∞ ∞ ∞
i=3
ABEDB 0-1+2-3+1=-1 i3(AB)=-1
ABDC 0-1+2+5=6 i3(AC)=6
0 A B C D E
i=0 0 ∞ ∞ ∞ ∞
i=1 0 -1 4 1 1
i=2 0 -1 2 -2 ∞
i=3 0 -1 6 ∞ ∞
i=0 i=1 i=2 i=3 i=4 i=5 i=6
A-dan B-ə 0 AB ABDB ABEDB ∞ ∞ ∞
A-dan C-ə ∞ AC ABC ABDC ABDBC ABEDC ABEDBC
A-dan D-ə ∞ ABD ABED ∞ ∞ ∞ ∞
A-dan E-ə ∞ ABE ABE ∞ ∞ ∞ ∞
i=4
ABDBC 0-1+2+1+3=5
0 A B C D E
i=0 0 ∞ ∞ ∞ ∞
i=1 0 -1 4 1 1
i=2 0 -1 2 -2 ∞
i=3 0 -1 6 ∞ ∞
i=4 0 ∞ 5 ∞ ∞
i=0 i=1 i=2 i=3 i=4 i=5 i=6
A-dan B-ə 0 AB ABDB ABEDB ∞ ∞ ∞
A-dan C-ə ∞ AC ABC ABDC ABDBC ABEDC ABEDBC
A-dan D-ə ∞ ABD ABED ∞ ∞ ∞ ∞
A-dan E-ə ∞ ABE ABE ∞ ∞ ∞ ∞
i=5
ABEDC 0-1+2-3+5=3
0 A B C D E
i=0 0 ∞ ∞ ∞ ∞
i=1 0 -1 4 1 1
i=2 0 -1 2 -2 ∞
i=3 0 -1 6 ∞ ∞
i=4 0 ∞ 5 ∞ ∞
i=5 0 ∞ 3 ∞ ∞
i=0 i=1 i=2 i=3 i=4 i=5 i=6
A-dan B-ə 0 AB ABDB ABEDB ∞ ∞ ∞
A-dan C-ə ∞ AC ABC ABDC ABDBC ABEDC ABEDBC
A-dan D-ə ∞ ABD ABED ∞ ∞ ∞ ∞
A-dan E-ə ∞ ABE ABE ∞ ∞ ∞ ∞
i=5
ABEDBC 0-1+2-3+1+3=2
A B C D E
0 i=0 0 ∞ ∞ ∞ ∞
i=1 0 -1 4 1 1
i=2 0 -1 2 -2 ∞
i=3 0 -1 6 ∞ ∞
i=4 0 ∞ 5 ∞ ∞
i=5 0 ∞ 3 ∞ ∞
i=6 0 ∞ 2 ∞ ∞
A B C D E
i=0 0 ∞ ∞ ∞ ∞
i=1 0 -1 4 1 1
i=2 0 -1 2 -2 ∞
i=3 0 -1 6 ∞ ∞
i=4 0 ∞ 5 ∞ ∞
i=5 0 ∞ 3 ∞ ∞ AB -1
AC 2
i=6 0 ∞ 2 ∞ ∞ AD -2
AE 1
A B C D E
0 -1 2 -2 1