githubEdit

Implementation

Keling, Dijkstra algoritmini kodda qanday amalga oshirishni ko'rib chiqaylik. Mana misol uchun men foydalanadigan grafik.

image

Ushbu misolni kodlash uchun sizga uchta hash-jadval kerak bo'ladi.

image

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

image

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:

image

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.

image

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.

image

Ushbu tugunning narxini va qo'shnilarini oling.

image

Qo'shnilar orasidan o'ting.

image

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.

image

Keling, ushbu xarajatlarni taqqoslaylik.

image

Siz A tuguniga qisqaroq yo'lni topdingiz! Narxni yangilang.

image

Yangi yo'l B tugunidan o'tadi, shuning uchun B ni yangi ota-ona sifatida belgilang.

image

OK, siz tsiklning yuqori qismiga qaytdingiz. Keyingi qo'shnisi Finish tugunidir.

image

Agar siz B tugunidan o'tsangiz, marraga qancha vaqt ketadi?

image

7 daqiqa davom etadi. Oldingi narx cheksiz daqiqalar edi va 7 daqiqa undan kamroq.

image

Finish tugunining yangi narxini va yangi ota-onani o'rnating.

image

OK, siz B tugunining barcha qoʻshnilari uchun xarajatlarni yangiladingiz. Uni qayta ishlangan deb belgilang.

image

Qayta ishlash uchun keyingi tugunni toping.

image

A tugunining narxini va qo'shnilarini oling.

image

A tugunining faqat bitta qo'shnisi bor: Finish tugun.

image

Hozirda Finish tuguniga borish uchun 7 daqiqa vaqt ketadi. Agar siz A tugunidan o'tsangiz, u erga qancha vaqt ketadi?

image

A tugunidan Finish ga borish tezroq! Narx va ota-onani yangilaymiz.

image

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?

image

Last updated