А.А. ГРИДНЕВ Научный руководитель – Е.В. ЧЕПИН, к.т.н., доцент Национальный исследовательский ядерный университет «МИФИ» ПОИСК ПУТИ В НЕИЗВЕСТНОМ ЛАБИРИНТЕ НА ОСНОВЕ МОДИФИЦИРОВАННОГО АЛГОРИТМА A* В статье описываются особенности решения задачи поиска пути в неизвестном лабиринте колёсным роботом на основе модификации алгоритма A*. Задача поиска пути в лабиринте является одной из распространённых конкурсных задач для робототехники. В этом году ЗАО «Актел.ру» сформулировал её так: робот находится в лабиринте, известны GPS координаты начальной и конечной позиции, на роботе есть GPS-приёмник, робот должен добраться из начальной точки в конечную точку за минимальное время. Для обнаружения стен у робота имеется ультразвуковой дальномер. Использование алгоритмов одной руки бессмысленно, так как они накладывают ограничение на лабиринт. Одним из возможных решений является использование алгоритма A* [1] для поиска пути. Для этого в оперативной памяти создаётся карта лабиринта в виде матрицы узлов, которые либо проходимы (нет препятствий), либо непроходимы (есть препятствие). Карта динамически обновляется: при обнаружении стен они добавляются на карту, и происходит перерасчёт маршрута. По полученному маршруту робот ведётся к точке назначения. Обнаружение стены может быть в двух случаях: робот едет и робот поворачивается. В случае, когда робот едет, необходимо нанести стену на карту и пересчитать маршрут, если он проходил через то место, на котором образовалась стена. В случае, когда робот поворачивается, наилучшим вариантом является продолжение поворота, пока обнаруживается стена, и только после это пересчитать маршрут. Это позволит избежать лишних пересчётов маршрута и колебаний робота (поворота налевонаправо, пока не будет найден конец стены). Алгоритм A* отличается от других алгоритмов поиска путей на графе тем, что порядок обхода вершин в нём определяется эвристической функцией – суммой стоимости достижения рассматриваемой вершины из начальной и эвристической оценки расстояния от рассматриваемой вершины до конечной вершины. В случае с картой лабиринта граф вырождается в матрицу узлов, в которой эвристическая оценка расстояния от рас- сматриваемого узла до конечного узла может быть рассчитана, как евклидово расстояние или манхэттенское расстояние (расстояние городских кварталов). Традиционная реализация алгоритма A* имеет узкое место – реализация открытого списка, в котором элементы в памяти выделяются и освобождаются динамически. Таким образом, на каждой итерации алгоритма происходит один вызов функции освобождения памяти (извлечение первого элемента списка) и до восьми (максимально число не посещённых соседей) вызовов выделения памяти. Также вызовы этих функций предполагают реализацию менеджера памяти, если его нет (например, в микроконтроллерах). Чтобы избежать использования динамической памяти, есть вариант реализации открытого списка на массиве узлов, при котором в каждом узле есть возможность указать координаты следующего узла в открытом списке или его отсутствие [2]. Таким образом, в структуру узла включаются дополнительные переменные, что требует больший объём оперативной памяти, но в текущее время она не является проблемой. При поиске маршрута может случиться так, что из двух коротких маршрутов будет выбран кратчайший, в котором так много поворотом, что в реальности быстрее было бы проследовать по более длинному маршруту, но с меньшим количеством поворотов. Для решения этой проблемы достаточно в стоимость перехода в соседний узел вложить стоимость поворота. Для того чтобы из полученного из алгоритма A*пути в лабиринте, который представлен списком соседних узлов, получить пригодный для навигации в лабиринте список путевых точек, необходимо выпрямление пути. Самый простой способ – проверка линейной проходимости из одной точки в другую и удаление лишних точек. Для этого подходит алгоритм Брезенхэма [3], который используется для построения линий в компьютерной графике. Список литературы 1. Introduction to A* // URL: http://theory.stanford.edu/~amitp/GameProgramming/AStarComparison.html (дата обращения: 29.11.2015) 2. Toward More Realistic Pathfinding // URL: http://www.gamasutra.com/view/feature/3096/toward_more_realistic_pathfinding.php (дата обращения: 29.11.2015) 3. The Bresenham Line-Drawing Algorithm // URL: http://www.cs.helsinki.fi/group/goa/mallinnus/lines/bresenh.html (дата обращения: 29.11.2015)