Implementation
Keling, Dijkstra algoritmini kodda qanday amalga oshirishni ko'rib chiqaylik. Mana misol uchun men foydalanadigan grafik.
Ushbu misolni kodlash uchun sizga uchta hash-jadval kerak bo'ladi.
Algoritm rivojlanishi bilan siz xarajatlar va ota-onalarning xesh jadvallarini yangilaysiz. Birinchidan, siz grafikni amalga oshirishingiz kerak. Siz 6-bobdagi kabi xesh jadvalidan foydalanasiz:
Python
Golang
Oxirgi bobda siz tugunning barcha qo'shnilarini xesh jadvalida saqladingiz, masalan:
Python
Golang
Ammo bu safar siz qo'shnilarni saqlashingiz kerak va qo'shniga borish xarajatlari. Misol uchun, Startning ikkita qo'shnisi bor, A va B.
Ushbu qirralarning og'irliklarini qanday ifodalaysiz? Nima uchun boshqa hash jadvalidan foydalanmaslik kerak?
Python
Golang
Demak, graph["start"] hash-jadvaldir. Siz barcha qo'shnilarni olishingiz mumkin
Shunday boshlang:
Boshidan Agacha va boshidan B gacha chekka bor. Agar bu qirralarning og'irliklarini topmoqchi bo'lsangiz-chi?
Keling, qolgan tugunlarni va ularning qo'shnilarini grafikga qo'shamiz:
To'liq grafik xesh jadvali shunday ko'rinadi.
Keyin har bir tugun uchun xarajatlarni saqlash uchun hash jadvali kerak.
Tugunning narxi
bu tugunga boshidan qancha vaqt ketishini anglatadi. Bilasizmi, "Start"dan "B" tuguniga 2 daqiqa ketadi. "A" tuguniga yetib borish uchun 6 daqiqa vaqt ketishini bilasiz (garchi siz kamroq vaqt talab qiladigan yo'lni topishingiz mumkin). Siz tugatishga qancha vaqt ketishini bilmaysiz. Agar siz hali ham narxni bilmasangiz, siz cheksizlikni qo'yasiz. Pythonda cheksizlikni
ifodalay olasizmi? Ma'lum bo'lishicha, siz:
Xarajatlar jadvalini tuzish uchun kod:
Ota-onalar uchun yana bir hash-jadval kerak:
Ota-onalar uchun xesh jadvalini yaratish uchun kod:
Python
Golang
Va nihoyat, siz qayta ishlagan barcha tugunlarni kuzatib borish uchun massiv kerak, chunki tugunni bir necha marta qayta ishlashingiz shart emas:
Python
Golang
Hammasi shu. Endi algoritmni ko'rib chiqaylik.
Men sizga avval kodni ko'rsataman va keyin u orqali o'ting. Mana kod:
Python
Golang
Bu Pythondagi Dijkstra algoritmi! Men sizga funksiya kodini keyinroq ko'rsataman. Birinchidan, ushbu find_lowest_cost_node
algoritm kodini amalda ko'rib chiqaylik.
Eng past narxga ega tugunni toping.
Ushbu tugunning narxini va qo'shnilarini oling.
Qo'shnilar orasidan o'ting.
Har bir tugunning narxi bor. Narx - bu tugunga boshidan qancha vaqt ketishi. Bu yerda siz Start > A tugun o'rniga Start > B tugun > A tuguniga o'tsangiz, A tuguniga qancha vaqt ketishini hisoblayapsiz.
Keling, ushbu xarajatlarni taqqoslaylik.
Siz A tuguniga qisqaroq yo'lni topdingiz! Narxni yangilang.
Yangi yo'l B tugunidan o'tadi, shuning uchun B ni yangi ota-ona sifatida belgilang.
OK, siz tsiklning yuqori qismiga qaytdingiz. Keyingi qo'shnisi Finish tugunidir.
Agar siz B tugunidan o'tsangiz, marraga qancha vaqt ketadi?
7 daqiqa davom etadi. Oldingi narx cheksiz daqiqalar edi va 7 daqiqa undan kamroq.
Finish tugunining yangi narxini va yangi ota-onani o'rnating.
OK, siz B tugunining barcha qoʻshnilari uchun xarajatlarni yangiladingiz. Uni qayta ishlangan deb belgilang.
Qayta ishlash uchun keyingi tugunni toping.
A tugunining narxini va qo'shnilarini oling.
A tugunining faqat bitta qo'shnisi bor: Finish tugun.
Hozirda Finish tuguniga borish uchun 7 daqiqa vaqt ketadi. Agar siz A tugunidan o'tsangiz, u erga qancha vaqt ketadi?
A tugunidan Finish ga borish tezroq! Narx va ota-onani yangilaymiz.
Barcha tugunlarni qayta ishlaganingizdan so'ng, algoritm tugadi. Umid qilamanki, ko'rsatma sizga algoritmni biroz yaxshiroq tushunishga yordam berdi. find_lowest_cost_node
funksiyasi yordamida eng arzon tugunni topish juda oson. Bu kodda:
Python
EXERCISES
7.1 Ushbu grafiklarning har birida boshidan oxirigacha bo'lgan eng qisqa yo'lning og'irligi qancha?