A-Star (A*) yo'nalishni topish algoritmini amaliy misollar va turli sohalardagi real hayotdagi ilovalarga e'tibor qaratgan holda o'rganing.
Yo'l rejalashtirish: A-Star (A*) algoritmini amalga oshirish bo'yicha keng qamrovli qo'llanma
Yo'l rejalashtirish robototexnika, o'yin ishlab chiqish, logistika va avtonom transport vositalari kabi ko'plab sohalarda asosiy muammo hisoblanadi. Maqsad - boshlang'ich nuqta va maqsad nuqtasi o'rtasida optimal (yoki yaqin-optimal) yo'lni topish, yo'lda to'siqlardan qochish. Turli yo'nalishni topish algoritmlari orasida A-Star (A*) algoritmi o'zining samaradorligi va ko'p qirraliligi bilan ajralib turadi.
A-Star (A*) algoritmi nima?
A* - bu axborot qidiruv algoritmi, ya'ni u berilgan har qanday tugundan maqsadga erishish xarajatini taxmin qilish uchun geyristik funktsiyadan foydalanadi. U Deykstra algoritmining afzalliklarini (qisqa yo'lni topishni kafolatlaydi) va ochko'z eng yaxshi qidiruvni (tezroq, lekin har doim optimal yo'lni topmaydi) birlashtiradi. A* algoritmi quyidagi baholash funksiyasiga asoslanib tugunlarga ustuvorlik beradi:
f(n) = g(n) + h(n)
f(n):ntugunidan o'tuvchi eng arzon yechimning taxminiy qiymati.g(n): Boshlang'ich tugundanntuguniga yetib borishning haqiqiy qiymati.h(n):ntugunidan maqsad tuguniga yetib borishning taxminiy qiymati (geyristik).
Geyristik funktsiya, h(n), A* ning ishlashi uchun juda muhimdir. Yaxshi tanlangan geyristik qidiruv jarayonini sezilarli darajada tezlashtirishi mumkin. Biroq, geyristik ruxsat etilgan bo'lishi kerak, ya'ni maqsadga erishish xarajatini hech qachon ortiqcha baholamaydi. Ruxsat etilmaydigan geyristik suboptimal yo'lga olib kelishi mumkin.
A-Star algoritmi qanday ishlaydi: Qadam-baqadam
- Initsializatsiya:
- Baholash kerak bo'lgan tugunlarni saqlash uchun ochiq ro'yxat yarating.
- Baholangan tugunlarni saqlash uchun yopiq ro'yxat yarating.
- Boshlang'ich tugunni ochiq ro'yxatga qo'shing.
g(start) = 0vah(start) = boshlang'ichdan maqsadga taxminiy xarajatni o'rnating.f(start) = g(start) + h(start)ni o'rnating.
- Iteratsiya:
Ochiq ro'yxat bo'sh bo'lmaguncha:
- Ochiq ro'yxatdan eng kam
f(n)qiymatiga ega bo'lgan tugunni oling. Keling, bu tugunni joriy tugun deb ataylik. - Joriy tugunni ochiq ro'yxatdan olib tashlang va uni yopiq ro'yxatga qo'shing.
- Agar joriy tugun maqsad tuguni bo'lsa, yo'lni qayta tiklang va uni qaytaring.
- Joriy tugunning har bir qo'shnisi uchun:
- Agar qo'shni o'tilmaydigan bo'lsa yoki yopiq ro'yxatda bo'lsa, uni e'tibordan chetda qoldiring.
- Qo'shni uchun taxminiy
g(n)qiymatini hisoblang (g(neighbor) = g(current) + cost(current to neighbor)). - Agar qo'shni ochiq ro'yxatda bo'lmasa yoki taxminiy
g(n)qiymati qo'shnining joriyg(n)qiymatidan past bo'lsa: - Qo'shnining
g(n)qiymatini taxminiyg(n)qiymatiga o'rnating. - Qo'shnining
h(n)qiymatini qo'shnidan maqsadga taxminiy xarajatga o'rnating. - Qo'shnining
f(n)qiymatinig(n) + h(n)ga o'rnating. - Qo'shnining ota-onasini joriy tugunga o'rnating.
- Agar qo'shni ochiq ro'yxatda bo'lmasa, uni ochiq ro'yxatga qo'shing.
- Ochiq ro'yxatdan eng kam
- Yo'q yo'l:
Agar ochiq ro'yxat bo'sh bo'lib qolsa va maqsad tuguniga erishilmagan bo'lsa, boshlang'ich tugundan maqsad tuguniga yo'l yo'q.
- Yo'lni qayta tiklash:
Maqsad tuguniga yetgach, maqsad tugunidan boshlang'ich tugunga qaytib, ota-ona ko'rsatkichlarini kuzatib yo'lni qayta tiklash mumkin.
To'g'ri geyristik funktsiyani tanlash
Geyristik funktsiyani tanlash A* algoritmining ishlashiga sezilarli ta'sir qiladi. Mana bir nechta umumiy geyristik funktsiyalar:
- Manxetten masofasi: Koordinatalarning mutlaq farqlarining yig'indisini hisoblaydi. Harakat gorizontal va vertikal yo'nalishlarga cheklangan gridga asoslangan muhitlar uchun mos keladi. Formula:
h(n) = |x1 - x2| + |y1 - y2|, bunda(x1, y1)joriy tugunning koordinatalari va(x2, y2)maqsad tugunining koordinatalari. Misol: Nyu-Yorkdagi Manxetten shaharchalarida navigatsiya qilish. - Evklid masofasi: Ikki nuqta orasidagi to'g'ri chiziq masofasini hisoblaydi. Harakat cheklanmagan muhitlar uchun mos keladi. Formula:
h(n) = sqrt((x1 - x2)^2 + (y1 - y2)^2). Misol: Ochiq maydonda dron uchun eng qisqa yo'lni topish. - Diagonal masofa: Diagonal harakatni hisobga oladi. Diagonal harakatga ruxsat berilgan gridga asoslangan muhitlar uchun mos keladi. Misol: Ko'pgina real vaqt rejimida strategiya o'yinlari diagonal harakatdan foydalanadi.
- Chebishev masofasi: Koordinatalarning mutlaq farqlarining maksimalini hisoblaydi. Diagonal harakat ortogonal harakat bilan bir xil narxga ega bo'lganda mos keladi. Formula:
h(n) = max(|x1 - x2|, |y1 - y2|). Misol: Har qanday o'q bo'ylab harakat bir xil qimmatga tushadigan robototexnika ilovalari.
Ruxsat etilgan geyristikni tanlash juda muhim. Ruxsat etilmaydigan geyristikdan foydalanish algoritmning suboptimal yo'lni topishiga olib kelishi mumkin. Misol uchun, agar siz Evklid masofasidan foydalanayotgan bo'lsangiz, uni 1 dan katta konstantaga ko'paytira olmaysiz.
A-Star algoritmini amalga oshirish: Amaliy misol (Python)
Mana A* algoritmining Python implementatsiyasi. Ushbu misol gridga asoslangan muhitdan foydalanadi.
import heapq
def a_star(grid, start, goal):
"""A* yo'nalishni topish algoritmisni amalga oshiradi.
Arguments:
grid: Muhitni ifodalovchi 2D ro'yxati.
0: o'tiladigan, 1: to'siq
start: Boshlang'ich nuqtani ifodalovchi tuple (qator, ustun).
goal: Maqsad nuqtasini ifodalovchi tuple (qator, ustun).
Returns:
Boshlang'ichdan maqsadga yo'lni ifodalovchi tuples ro'yxati,
yoki yo'l mavjud bo'lmasa, None.
"""
rows, cols = len(grid), len(grid[0])
def heuristic(a, b):
# Manxetten masofasi geyristikasi
return abs(a[0] - b[0]) + abs(a[1] - b[1])
def get_neighbors(node):
row, col = node
neighbors = []
for dr, dc in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
new_row, new_col = row + dr, col + dc
if 0 <= new_row < rows and 0 <= new_col < cols and grid[new_row][new_col] == 0:
neighbors.append((new_row, new_col))
return neighbors
open_set = [(0, start)] # Ustuvorlik navbati (f_score, tugun)
came_from = {}
g_score = {start: 0}
f_score = {start: heuristic(start, goal)}
while open_set:
f, current = heapq.heappop(open_set)
if current == goal:
path = []
while current in came_from:
path.append(current)
current = came_from[current]
path.append(start)
path.reverse()
return path
for neighbor in get_neighbors(current):
tentative_g_score = g_score[current] + 1 # Qo'shniga o'tish uchun 1 xarajatini taxmin qiling
if neighbor not in g_score or tentative_g_score < g_score[neighbor]:
came_from[neighbor] = current
g_score[neighbor] = tentative_g_score
f_score[neighbor] = tentative_g_score + heuristic(neighbor, goal)
heapq.heappush(open_set, (f_score[neighbor], neighbor))
return None # Yo'l topilmadi
# Misoldan foydalanish:
grid = [
[0, 0, 0, 0, 0],
[0, 1, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 0, 0],
]
start = (0, 0)
goal = (4, 4)
path = a_star(grid, start, goal)
if path:
print("Yo'l topildi:", path)
else:
print("Yo'l topilmadi.")
Izoh:
a_starfunktsiyasi grid, start va goal ni kirish sifatida oladi.heuristicfunktsiyasi Manxetten masofasini hisoblaydi.get_neighborsfunktsiyasi to'g'ri qo'shni tugunlarni qaytaradi.open_set- baholanishi kerak bo'lgan tugunlarni saqlaydigan ustuvorlik navbati.came_fromlug'ati yo'ldagi har bir tugunning ota-onasini saqlaydi.g_scorelug'ati boshlang'ichdan har bir tugunga erishish narxini saqlaydi.f_scorelug'ati har bir tugundan maqsadga erishishning taxminiy narxini saqlaydi.- Asosiy tsikl maqsad topilguncha yoki ochiq to'plam bo'sh bo'lguncha iteratsiya qiladi.
A* ning optimallashtirish va o'zgarishlari
A* kuchli algoritm bo'lsa-da, uning ishlashini ma'lum ssenariylarda yaxshilaydigan bir nechta optimallashtirish va o'zgarishlar mavjud:
- Sakrash nuqtasi qidiruvi (JPS): Gridning to'g'ri chiziq segmentlaridan "sakrab" o'tish orqali o'rganilgan tugunlar sonini kamaytiradi. Bir xil narxdagi grid muhitida samarali.
- Theta*: Grid chekkalari bilan cheklanmagan yo'nalishni topishga imkon beradi. Tugunlar orasidagi ko'rish chizig'ini hisobga olib, qisqaroq va realroq yo'llarni topishi mumkin.
- Iterativ chuqurlashtirish A* (IDA*): Xotiradan foydalanishni cheklash uchun narx chegarasi bilan chuqurlikdan birinchi qidiruvdan foydalanadi. Juda katta qidiruv joylari uchun foydalidir.
- Vaznlangan A*: Geyristik funktsiyani uni og'irlikga ko'paytirish orqali o'zgartiradi. Maqsadga tomon tadqiqotni qo'llab-quvvatlash orqali suboptimal yo'llarni tezroq topishi mumkin. Agar eng qisqa yo'lni topishdan ko'ra, yaxshi yo'lni tezda topish muhim bo'lsa, foydalidir.
- Dinamik A* (D*): Dastlabki yo'l hisoblab chiqilgandan keyin muhitdagi o'zgarishlarni boshqaradi. To'siqlar paydo bo'lishi yoki yo'q bo'lib ketishi mumkin bo'lgan dinamik muhitlar uchun mos keladi. Ko'pincha robototexnikada oldindan aytib bo'lmaydigan muhitlarda avtonom navigatsiya uchun ishlatiladi.
- Ierarxik A*: Qidiruv maydonini kamaytirish uchun muhitning ierarxik ifodasidan foydalanadi. U avval xaritaning qo'pol tasvirida yuqori darajadagi yo'lni rejalashtirish va keyin yo'lni batafsilroq darajada tozalash orqali ishlaydi. Ushbu yondashuv katta va murakkab muhitlarda uzoq yo'llarni rejalashtirish uchun foydalidir.
A-Star algoritmining real dunyo ilovalari
A* algoritmi turli xil ilovalarda qo'llaniladi, jumladan:
- O'yin ishlab chiqish: Qahramon harakati, AI navigatsiyasi va o'yinchilar bo'lmagan qahramonlar (NPC) uchun yo'nalishni topish. Misollar: StarCraft kabi strategiya o'yinlari, The Witcher kabi RPGlar.
- Robototexnika: Robot navigatsiyasi, avtonom robotlar uchun yo'l rejalashtirish va to'siqlardan qochish. Misollar: O'zini o'zi boshqaradigan changyutgichlar, ombor robotlari.
- Logistika va ta'minot zanjiri: Yetkazib berish yuk mashinalari uchun marshrutni rejalashtirish, sayohat vaqtini va yoqilg'i sarfini kamaytirish uchun etkazib berish marshrutlarini optimallashtirish. Misollar: FedEx, UPS va DHL kabi yetkazib berish xizmatlari o'z yetkazib berish yo'nalishlarini global miqyosda optimallashtirish uchun yo'nalishni topish algoritmlaridan foydalanadi.
- Avtonom transport vositalari: O'z-o'zidan harakatlanuvchi avtomobillar va dronlar uchun yo'nalishni rejalashtirish, xavfsiz va samarali navigatsiyani ta'minlash. Misollar: Tesla Autopilot, Waymo-ning o'z-o'zidan harakatlanuvchi texnologiyasi. Avtonom transport vositalari murakkab shahar muhitida, yo'l harakati sharoitlarini, piyodalarning harakatlarini va yo'llarning yopilishini hisobga olgan holda harakatlanishi kerak.
- GPS navigatsiya tizimlari: Yo'l harakati sharoitlari va yo'llarning yopilishini hisobga olgan holda, ikki nuqta orasidagi eng qisqa yoki eng tezkor yo'lni topish. Misollar: Google Maps, Apple Maps.
- Tibbiy tasvirlash: Minimal invaziv jarrohlik uchun yo'l rejalashtirish, hayotiy organlardan qochib, jarrohlik asboblarini tana orqali boshqarish.
- Tarmoq marshruti: Ma'lumot paketlari uchun tarmoq orqali sayohat qilish uchun eng qisqa yo'lni topish.
- Video o'yinlar darajasini loyihalash: yo'lni topish cheklovlariga asoslangan ob'ektlarni avtomatik ravishda joylashtirish.
A-Star algoritmining afzalliklari va kamchiliklari
Afzalliklari:
- Optima: Geyristik ruxsat etilgan bo'lsa, eng qisqa yo'lni topishga kafolat beradi.
- Samaradorlik: Kenglik bo'yicha qidiruv va chuqurlik bo'yicha qidiruv kabi axborot bermaydigan qidiruv algoritmlariga qaraganda samaraliroq.
- Ko'p qirralilik: Turli xil muhitlarda va ilovalarda foydalanish mumkin.
Kamchiliklari:
- Xotira sarfi: Ochiq va yopiq ro'yxatlarni saqlash uchun, ayniqsa katta qidiruv maydonlari uchun sezilarli xotirani talab qilishi mumkin.
- Geyristik bog'liqlik: Ishlash geyristik funktsiyani tanlashga juda bog'liq. Yomon tanlangan geyristik qidiruv jarayonini sezilarli darajada sekinlashtirishi mumkin.
- Hisoblash narxi: f(n) bahosi ba'zi ilovalar uchun hisoblash jihatidan qimmatga tushishi mumkin.
Global implementatsiya uchun e'tiborga olinadigan omillar
A* ni global ilovalar uchun amalga oshirishda quyidagilarni ko'rib chiqing:
- Koordinata tizimlari: Geografik hudud uchun mos koordinata tizimlaridan va xarita proyeksiyalaridan foydalaning. Turli mintaqalar turli koordinata tizimlaridan foydalanadi (masalan, WGS 84, UTM).
- Masofa hisob-kitoblari: Yerning egriligini hisobga olish uchun Haversine formulasi kabi aniq masofani hisoblash usullaridan foydalaning. Bu uzoq masofaga yo'l rejalashtirish uchun ayniqsa muhimdir.
- Ma'lumot manbalari: Nufuzli manbalardan ishonchli va dolzarb xarita ma'lumotlaridan foydalaning. Google Maps Platform, Mapbox yoki OpenStreetMap kabi provayderlarning API-laridan foydalanishni o'ylab ko'ring.
- Ishlashni optimallashtirish: Samarali ma'lumotlar tuzilmalari va algoritmlaridan foydalangan holda algoritmning ishlashini optimallashtiring. Qidiruv jarayonini tezlashtirish uchun keshni saqlash va fazoviy indekslash kabi texnikalardan foydalanishni o'ylab ko'ring.
- Mahalliylashtirish: Algoritmni turli tillar va madaniy kontekstlarga moslashtiring. Misol uchun, turli o'lchov birliklaridan (masalan, kilometrlar va mil) va turli manzil formatlaridan foydalanishni ko'rib chiqing.
- Real vaqtdagi ma'lumotlar: Yo'l harakati sharoitlari, ob-havo va yo'llarning yopilishi kabi real vaqtdagi ma'lumotlarni yo'l rejalashtirishning aniqligi va ishonchliligini oshirish uchun qo'shing.
Misol uchun, global logistika ilovasini ishlab chiqishda siz turli mintaqalar uchun turli xarita ma'lumotlar manbalaridan foydalanishingiz kerak bo'lishi mumkin, chunki ba'zi mintaqalar boshqalarga qaraganda batafsil va aniqroq ma'lumotlarga ega bo'lishi mumkin. Shuningdek, turli mamlakatlarda transportga oid turli qoidalarni va cheklovlarni ko'rib chiqishingiz kerak bo'lishi mumkin.
Xulosa
A-Star algoritmi turli sohalarda ko'plab ilovalarga ega bo'lgan kuchli va ko'p qirrali yo'nalishni topish algoritmidir. Asosiy tushunchalarni, amalga oshirish tafsilotlarini va optimallashtirish usullarini tushunish orqali siz A* dan murakkab yo'nalishni rejalashtirish muammolarini samarali hal qilish uchun foydalanishingiz mumkin. To'g'ri geyristikni tanlash va realizatsiyani optimallashtirish optimal natijalarga erishishning kalitidir. Texnologiya rivojlanib borar ekan, A* va uning o'zgarishlari butun dunyo bo'ylab intellektual navigatsiya yechimlarini ta'minlashda muhim rol o'ynashda davom etadi. A* ni global miqyosda amalga oshirayotganda koordinata tizimlari va mahalliy qoidalar kabi global xususiyatlarni hisobga olishni unutmang.