Bellman-Ford algoritmi - Mustaqil ish Graflarda eng qisqa yoʻlni toppish usullari

|
Mustaqil ish Graflarda eng qisqa yoʻlni toppish usullari
|
bet | 4/4 | Sana | 15.05.2024 | Hajmi | 351,26 Kb. | | #234503 |
Bog'liq mumtozali mustaqil ish1Bellman-Ford algoritmi
Algoritm tarixi uchta mustaqil matematiklar bilan bog'liq: Lester Ford, Richard Bellman va Edward Moore. Ford va Bellman algoritmni 1956 va 1958 yillarda nashr etishdi, Moore esa 1957 yilda taqdim qilgan. Va ba'zan uni Bellman-Ford-Moore algoritmi deb ham atashadi. Usul ba'zi vektorli-marshrutlash protokollarida, masalan, RIPda (Routing Information Protocol) qo'llaniladi. Deykstra algoritmi singari, Bellman-Ford algoritmi ham vaznga ega bo’lgan graflarda bitta tugundan qolgan barcha tugunlarga bo’lgan eng qisqa masofani aniqlashda ishlatiladi. Bu algoritm manfiy vaznga ega bo’lgan graflar bilan ishlashda ham qo’llanilishi mumkin (istisno holatlar ham mavjud).
s tugundan qolgan barcha tugunlargacha bo’lgan qisqa masofani Bellman-Ford algoritmidan foydalanib topish dinamik dasturlashtirish usulini qo’llash demakdir, ya’ni uni qism masalalarga ajratib, ularni yechimi orqali umumiy asosiy masalani hal qilishdir. Bunda qism masala bo’lib, bitta alohida qaralayotgan tugundan boshqasigacha eng qisqa yo’lni aniqlash masalasi hisoblanadi. Algoritm natijalarini saqlash uchun d[] bir o’lchovli massiv qabul qilamiz. Uning har bir i-elementida s gundan i-elementgacha qisqa masofa qiymatini saqlanadi (agar mavjud bo’lsa). Dastlab, d[] massiv elementlariga shartli sheksiz katta qiymat berib chiqiladi, d[s] ga 0 o’zlashtiriladi.
G={V, E}, n=|V|, m=|E| graf berilgan bo’lsin. Qo’shni tugunlarni v va u deb, (v,u) orasidagi qirrani w deb belgilab olamiz. Boshqacha aytganda, v tugundan chiquvchi va u tugunga kiruvchi qirra vazni w ga teng. U holda, Bellman-Ford algoritmining muhim qismi quyidagicha ko’rinishga ega bo’ladi:
Floyd-Uorshell algoritmi
Bu usulning nomlanishi 1962 yilda bir vaqtning o'zida kashf etgan ikkita amerikalik tadqiqotchilar Robert Floyd va Stiven Uorshell sharafiga qo’yilgan. Nomlanishning boshqa variantlari kamroq tarqalgan: Roy - Uorshall algoritmi yoki Roy - Floyd algoritmi. Roy - bu algoritmni hamkasblaridan 3 yil oldin (1959 yilda) ishlab chiqqan professorning familiyasidir, ammo uning kashfiyoti nashr qilimay qolgan. Floyd-Uorshell algoritmi – grafning har bir tugunigacha bo’lgan qisqa masofalarni hisoblashning dinamik algoritmidir. Bu metodni musbat va manfiy vaznga ega bo’lgan graflarda qo’llash mumkin, faqat manfiy sikllardan tashqari. Shu sababli oldin ko’rib o’tilgan Deykstra algoritmiga qaraganda umumiyroq hisoblanadi. Floyd-Uorshell algoritmini amalga oshirish uchun har bir tuguni 1 dan |V| gacha nomerlangan G=(V,E) grafning qo’shma matrisasi D[][] ni tashkil etamiz. Bu matrisa |V|x|V| o’lchamga ega bo’ladi va har bir D[i][j] elementga i dan j gacha bo’lgan qirralarning vazni o’zlashtiriladi. Algoritm bajarilishi mobaynida ushbu matrisa qayta yoziladi: uning har bir yacheykasiga i tugundan j tugungacha hisoblangan eng optimal, qisqa masofa yoziladi. Endi algoritmning asosiy qismini tuzishdan oldin, eng qisqa yo'llarning matritsasi tarkibini tushunish kerak. Uning har bir elementi D[i][j] mavjud bo'lgan marshrutlarning eng kichikini o'z ichiga olishi kerakligi sababli, biz darhol ayta olamizki, yagona tugundan uchun u nolga teng, hattoki pastadir (manfiy sikllar hisobga olinmaydi), shuning uchun asosiy diagonalning barcha elementlari (D[i][i]) ni 0 qilish kerak.
Diagonalda bo’lmagan 0 qiymatli elementlar (matrisaning i va j tugunlari o'rtasida bevosita qirra mavjud bo'lmagan joylarida nollar bo'lishi mumkin) ularning qiymatini iloji boricha o'zgartirish uchun biz ularni cheksizlik bilan tenglashtiramiz, bu dasturda bo'lishi mumkin, masalan, grafda mumkin bo'lgan maksimal yo'l, yoki shunchaki katta son. Algoritmning uchta - sikl, ifoda va shartli operatordan iborat asosiy qismi juda ixcham tarzda yoziladi:
k=1 dan |V| gacha bajariladi
i=1 dan |V| gacha bajariladi
j=1 dan |V| gacha bajariladi
agar D[i][k]+D[k][j]
i tugunidan j tugunigacha eng qisqa yo'l ular orqali va boshqa tugunlar to'plamidan o'tishi mumkin k∈(1, ..., |V|). i dan j gacha bo'lgan yo'l k tugundan o’tishi yoki o'tmasligi ham mumkin. Agar boshqa yo'l mavjud bo’lsa, u i dan k ga, keyin k dan j gacha o'tishini anglatadi, shuning uchun u qisqa yo'lning qiymati D[i][j] ni D[i][k] + D[k][j] yig'indi bilan almashtirish kerak.
Floyd-Worshell algoritmining to'liq kodini C ++ va Paskalda ko'rib chiqamiz va keyin u bajaradigan harakatlar ketma-ketligini batafsil tahlil qilamiz.
C++ da dastur kodi:
#include "stdafx.h"
#include
using namespace std;
const int maxV=1000;
int i, j, n;
int GR[maxV][maxV];
//алгоритм Флойда-Уоршелла
void FU(int D[][maxV], int V)
{
int k;
for (i=0; ifor (k=0; kfor (i=0; ifor (j=0; jif (D[i][k] && D[k][j] && i!=j)
if (D[i][k]+D[k][j]D[i][j]=D[i][k]+D[k][j];
for (i=0; i{
for (j=0; jcout<} }
//главная функция
void main()
{
setlocale(LC_ALL, "Rus");
cout<<"Количество вершин в графе > "; cin>>n;
cout<<"Введите матрицу весов ребер:\n";
for (i=0; ifor (j=0; j{
cout<<"GR["< ";
cin>>GR[i][j];
}
cout<<"Матрица кратчайших путей:"<FU(GR, n);
system("pause>>void");
}
Tasavvur qilaylik, har bir elementi vazn haqida ma’lumot saqlovchi qo’shma matritsa quyidagicha berilgan bo’lsin:
Quyidagi grafda tugunlar soni 3 ga teng va u quyidagi matrisa bilan berilgan.
Algoritm masalasi:
Matrisani shunday qayta yozish kerakki, undagi har bir element i va j tugun orasidagi qirra vaznini emas, balki I dan j gacha qisqa yo’l vaznini saqlasin. Misol uchun kichik bir graf olamiz. Shu sababli undagi qiymatlar deyarli o’zgarmasligi ham mumkin. Ammo dastur narijasida unda 2ta element qiymati almashganligini ko’rish mumkin. Quyidagi sxemada buni tahlil qilish mumkin.
Ushbu jadvalda algoritmning asosiy qismini ifodalovchi 27ta bosqichi keltirilgan. Usulning bajarilish vaqti O(|V|3) bo'lganligi sababli bosqichlar soni shunchalik ko'p. Graf 3 ta tugunga ega va 33=27 ga teng. Birinchi o'zgarish k = 1, i = 2 va j = 3 bo’lgandagi iteratsiyada sodir bo'ladi. Bunda D[2][1]=1, D[1][3]=2, D[2][3]=4. Shart to'g'ri, ya'ni D[1][3] + D[3][2] = 3 va 3 <4, shuning uchun D[2][3] matritsa elementi yangi qiymat oladi. Keyingi qadam, shart bajarilganda ikkinchi satr va uchinchi ustunda joylashgan elementga haqiqatan ham o'zgarishlar kiritiladi.
|
| |