Кіріспе
Компьютерлік бағдарламамен жол құру – екі нүкте арасындағы ең қысқа маршрутты компьютерлік бағдарлама арқылы жоспарлау. Бұл лабиринттерді шешудің іс жүзінде қолданылатын түрі. Осы зерттеу саласы салмақты графтарда ең қысқа жолды табу үшін Дийкстра алгоритміне көп сүйенген. Жол құру, графтар теориясындағы ең қысқа жол мәселесімен тығыз байланысты, ол үлкен желіде екі нүкте арасындағы белгілі бір критерийлерге (ең қысқа, ең төмен бағалы, ең жылдам және т.б.) сай келетін жолды қалай анықтауды зерттейді.
Pathfinding or pathing is the plotting, by a computer application, of the shortest route between two points. It is a more practical variant on solving mazes. This field of research is based heavily on Dijkstra's algorithm for finding the shortest path on a weighted graph. Pathfinding is closely related to the shortest path problem, within graph theory, which examines how to identify the path that best meets some criteria (shortest, cheapest, fastest, etc) between two points in a large network.
Алгоритмдер
Негізінде, жол табу әдісі графты бір төбеден бастап, мақсатты төбеге жеткенге дейін жақын орналасқан түйіндерді зерттеу арқылы іздейді, әдетте ең төмен бағалы жолды табу мақсатымен. Егер графты іздеу әдістері, мысалы, ендік бойынша іздеу, жеткілікті уақыт берілген жағдайда жол таба алса, "зерттейтін" басқа әдістер мақсатқа тезірек жетеді. Мысалы, бөлмеде келе жатқан адамды қарастырайық; барлық мүмкін жолдарды алдын ала тексерудің орнына, адам әдетте мақсатқа қарай жүреді және кедергілерден қашу үшін ғана жолдан ауытқиды, ал ауытқуларды мүмкіндігінше азайтады. Жол табудың екі негізгі мәселесі: (1) граф ішіндегі екі түйін арасындағы жолды табу; және (2) ең қысқа жол мәселесі – ең оңтайлы қысқа жолды табу. Ендік және тереңдік бойынша іздеу сияқты қарапайым алгоритмдер барлық мүмкіндіктерді сарқып, бірінші мәселені шешеді; берілген түйінден бастап, олар мақсатты түйінге жеткенше барлық ықтимал жолдарды қайталайды. Бұл алгоритмдер V – түйіндер саны, ал E – түйіндер арасындағы қабырғалар саны ретінде жұмыс істейді. Күрделі мәселе – оңтайлы жолды табу. Бұл жағдайдағы толық тәсіл Беллман-Форд алгоритмі деп аталады, ол уақыт күрделілігін , яғни квадраттық уақытты қамтиды. Дегенмен, ең жақсы жолды табу үшін барлық мүмкін жолдарды қарастырудың қажеті жоқ. A* және Дийкстра алгоритмі сияқты алгоритмдер эвристика немесе динамикалық бағдарламалау арқылы жолдарды стратегиялық түрде жояды. Мүмкін емес жолдарды жою арқылы бұл алгоритмдер уақыт күрделілігін төмендетуге қабілетті. Жоғарыда аталған алгоритмдер алдын ала өңдеусіз графтармен жұмыс істейтін ең жақсы жалпы алгоритмдердің қатарына жатады. Алайда, практикалық саяхат маршрутындау жүйелерінде, жақсы өнімділікке қол жеткізу үшін графты алдын ала өңдей алатын алгоритмдер арқылы тіпті жақсы уақыт күрделілігіне қол жеткізуге болады. Мұндай алгоритмдердің бірі – қысқарту иерархиясы.
The above algorithms are among the best general algorithms which operate on a graph without preprocessing. However, in practical travel routing systems, even better time complexities can be attained by algorithms which can pre process the graph to attain better performance. One such algorithm is contraction hierarchies.
Дикстра алгоритмі
Графқа негізделген жол табу алгоритмінің кең таралған мысалы – Дикстра алгоритмі. Бұл алгоритм бастапқы түйінден және үміткер түйіндердің "ашық жиынтығынан" басталады. Әр қадамда бастапқыдан ең аз қашықтықтағы ашық жиынтықтағы түйін қарастырылады. Түйін "жабық" деп белгіленеді, және егер олар бұрын қарастырылмаған болса, оған іргелес барлық түйіндер ашық жиынтыққа қосылады. Бұл процесс мақсатқа жету жолы табылғанша қайталанады. Ең аз қашықтықтағы түйіндер бірінші қарастырылатындықтан, мақсат алғаш рет табылғанда, оған дейінгі жол ең қысқа жол болады. Дикстра алгоритмі теріс жиек салмағы болған жағдайда дұрыс жұмыс істемейді. Мысалы, А, В және С түйіндері AB = 3, AC = 4 және BC = −2 жиектерімен байланысқан бағытталмаған граф құраса, А-дан С-ға дейінгі ең тиімді жолдың құны 1, ал А-дан В-ға дейінгі ең тиімді жолдың құны 2 болады. А-дан басталатын Дикстра алгоритмі алдымен В-ны қарастырады, себебі ол ең жақын орналасқан. Оған 3 құны тағайындалады және "жабық" деп белгіленеді, яғни оның құны ешқашан қайта қарастырылмайды. Сондықтан, Дикстра теріс жиек салмақтарын бағалай алмайды. Дегенмен, көптеген практикалық жағдайларда теріс жиек салмақтары кездеспейді, сондықтан Дикстра алгоритмі жол табу үшін өте қолайлы.
А* алгоритмі
A* – ойындарда жиі қолданылатын Дикстра алгоритмінің бір түрі. A* әрбір ашық түйінге сол түйінге дейінгі қабырғаның салмағы мен түйін мен аяқталу арасындағы шамамен қашықтықтың қосындысына тең салмақ тағайындайды. Бұл шамамен қашықтық эвристика арқылы анықталады және түйін мен соңы арасындағы ең аз мүмкін қашықтықты көрсетеді. Бұл бастапқы жол табылғаннан кейін ұзақ жолдарды болдырмауға мүмкіндік береді. Егер бастапқы және аяқталу арасында x ұзындығындағы жол болса, ал кез келген түйін мен аяқталу арасындағы ең аз қашықтық x-тен артық болса, онда сол түйіннің тексеру қажеті жоқ. A* осы эвристиканы Дикстра алгоритмімен салыстырғанда тиімділігін арттыру үшін пайдаланады. Эвристика нөлге тең болғанда, A* Дикстра алгоритмімен бірдей болады. Эвристикалық бағалау нақты қашықтыққа жақындаған сайын, A* оптималды жолдарды табуын жалғастырады, бірақ оның жұмыс жылдамдығы артады (азырақ түйіндерді тексеру арқасында). Эвристиканың мәні нақты қашықтыққа дәл тең болғанда, A* ең аз түйіндерді қарастырады. (Дегенмен, әрқашан нақты қашықтықты есептейтін эвристикалық функцияны жасау көбінесе қиын, себебі салыстырудың осы нәтижесіне көбінесе қарапайым есептеулер арқылы қол жеткізуге болады – мысалы, екі өлшемді кеңістікте Эвклид қашықтығының орнына Чебышев қашықтығын пайдалану арқылы.) Эвристикалық мән артқан сайын, A* азырақ түйіндерді тексереді, бірақ енді оптималды жолға кепілдік бермейді. Көптеген қолданбаларда (мысалы, бейне ойындарда) алгоритмнің жылдам жұмыс істеуі үшін мұндай жағдай қабылданады және тіпті қажет болады.
Видеоойындарда
Крис Кроуфорд 1982 жылы Tanktics ойынында жол табу мәселесін шешуге көп уақыт кеткенін айтты, онда компьютерлік танктер U пішінді көлдердің ішіндегі құрлықта қалып қойды. "Көп еңбек сарп еткен соң, жақсырақ шешім таптым: картадан U пішінді көлдерді жойыңыз", - деді ол.
Иерархиялық жолды табу
Бұл идея алғаш рет бейне ойын индустриясымен сипатталды, оларға үлкен карталарда жоспарлау үшін аз процессор уақыты қажет болды. Абстракция мен эвристиканы қолдану тұжырымы бұрынғырақ және алғаш рет ABSTRIPS (Abstraction Based STRIPS) деген атпен айтылды, ол логикалық ойындардың күй кеңістіктерін тиімді іздеу үшін қолданылды. Осыған ұқсас техника – навигациялық торлар (navmesh), олар ойындарда геометриялық жоспарлау үшін және бірнеше көлік құралы бар сатушы саяхатшысы мәселелерінде қолданылатын көп түрлі көлік тасымалдау жоспарлау. Карта кластерлерге бөлінеді. Жоғары деңгейде кластерлер арасындағы жол жоспарланады. Жоспар табылганнан кейін, төменгі деңгейде кластер ішінде екінші жол жоспарланады. Яғни, жоспарлау екі қадамнан тұрады, бұл бастапқы кеңістіктегі бағытталған жергілікті іздеу. Артықшылығы – түйіндердің саны азырақ және алгоритм өте жақсы жұмыс істейді. Кемшілігі – иерархиялық жол жоспарлауды іске асыру қиын.
Мысал
Картаның мөлшері 3000x2000 түйінге тең. Түйіндік базада жол жоспарлау өте көп уақыт алады. Тіпті тиімді алгоритмге де көптеген мүмкін болатын графтарды есептеу қажет. Себебі, мұндай картада барлығы 6 миллион түйін болады және геометриялық кеңістікті зерттеу мүмкіндіктері аса зор. Иерархиялық жол жоспарлаушының бірінші қадамы – картаны кішірек субкарталарға бөлу. Әр кластердің мөлшері 300x200 түйін. Барлық кластерлердің саны 10x10=100. Жаңа құрылған графта түйіндердің саны аз, 100 кластер арасында өтуге болады, бірақ толыққанды картада емес. Егер жоғары деңгейдегі графтан қолданылатын жол табылса, келесі қадам – әр кластер ішінде жол жоспарлау. Субкартада 300x200 түйін бар, оларды стандартты A* жол жоспарлаушысы оңай басқара алады.
Көп агентті жолды анықтау
Көп агентті жол табу – бірнеше агенттің өзара соқтығыспай, қазіргі орналасқан жерлерінен мақсатты жерлеріне дейінгі жолдарын табу, сонымен бірге барлық агенттердің жолдарының ұзындығының қосындысы сияқты шығындар функциясын оңтайландыру. Бұл жол табудың жалпыланған түрі. Көптеген көп агентті жол табу алгоритмдері A* алгоритмінен туындайды немесе бүтін санды сызықтық бағдарламалау сияқты жақсы зерттелген басқа да мәселелерге келтіріледі. Дегенмен, мұндай алгоритмдер көбінесе толық емес, яғни полиномиалдық уақыт ішінде шешім беретіні дәлелденбеген. Кейбір параллель тәсілдер, мысалы, Ынтымақтастық диффузиясы, көп агентті жол табуды есептеу желілік құрылымдарына, мысалы, жасушалық автоматтарға ұқсас жасушаларға таратуға негізделген, бұл өте оңай параллелдеуге болатын алгоритмдерге жатады. Алгоритмдердің тағы бір тобы өнімділікті арттыру үшін белгілі навигациялық үлгілерді (мысалы, трафик ағыны) немесе мәселе кеңістігінің топологиясын пайдаланып, оптималдылықтан бас тартады.