661068b80dcdffabcb74509fcef9b236.ppt
- Количество слайдов: 79
Поиск пути. A* Пусть требуется попасть из точки А в точку B. Эти две точки разделены стеной. На рисунке ниже зеленый квадрат это стартовая точка A, красный квадрат - целевая точка B, а несколько синих квадратов - стена между ними.
Поиск пути. A*
Поиск пути. A* Первое, на что следует обратить внимание - то, что мы разделили нашу область поиска на сетку с квадратными ячейками. Упрощение области поиска это первый шаг в поиске пути. Этот метод упрощает нашу область поиска до простого двумерного массива.
Поиск пути. A* Каждый элемент массива представляет одну из клеток сетки, а его значением будет проходимость этой клетки (проходима и непроходима). Для нахождения пути нам необходимо определить какие нам нужны клетки для перемещения из точки A в точку B. Как только путь будет найден, персонаж начнет двигаться из центра одной клетки в центр следующей до тех пор, пока не достигнет целевой клетки.
Поиск пути. A* Всегда возможно разделить область поиска на что-то отличное от квадратов. Например, на шестиугольники.
Поиск пути. A* Как только мы упростили нашу область поиска до некоторого числа вершин, нужно начать поиск для нахождения кратчайшего пути. Начнем с точки A, проверяя соседние клетки и двигаясь дальше до тех пор, пока не найдем целевую точку.
Поиск пути. A* Начинаем поиск пути выполняя следующее: 1. Начинаем со стартовой точки A и добавляем ее в «открытый список» клеток Open, которые нужно обработать. Список содержит клетки, которые возможно находятся вдоль пути, который требуется отыскать. А возможно и не находятся…
Поиск пути. A* 2. Ищем доступные или проходимые клетки, граничащие со стартовой точкой, игнорируя клетки со стенами, водой или другой непроходимой областью. И также добавляем их в открытый список. Для каждой из этих клеток сохраняем точку A, как «родительскую клетку» . Эта родительская клетка важна, когда мы будем прослеживать наш путь.
Поиск пути. A* Удаляем стартовую точку A из нашего открытого списка и добавляем ее в «закрытый список» клеток Closed, которые больше не нужно проверять.
Поиск пути. A* На рисунке ниже темно-зеленый квадрат в центре - стартовая точка. Она выделена голубым цветом для отображения того, что находится в закрытом списке. Все соседние клетки в данный момент находятся в открытом списке. Они выделены светлозеленым. Каждая имеет серый указатель, направленный на родительскую клетку, которая в нашем случае является стартовой точкой.
Поиск пути. A* Далее выберем одну из соседних клеток в открытом списке и повторим вышеописанный процесс. При этом выбирается та, для которой меньше стоимость F.
Поиск пути. A* Способом определения того, какую клетку использовать, является следующие выражение: F = G + H где G = стоимость передвижения из стартовой точки A к данной клетке, следуя найденному пути к этой клетке.
Поиск пути. A* H = примерная стоимость передвижения от данной клетки до целевой, то есть точки B. Она обычно является эвристической функцией, т. к. мы не узнаем длину пути, пока не найдем сам путь, потому что в процессе поиска нам может встретиться множество вещей (например, стены и вода).
Поиск пути. A* Рассмотрим вычисление стоимости F. Как описано выше, G является стоимостью передвижения со стартовой клетки до текущей, используя найденный к ней путь. В этом примере мы присвоим стоимость 10 к горизонтальным и вертикальным передвижениям, а к диагональным - 14.
Поиск пути. A* Мы используем эти числа потому, что пройденное по диагонали расстояние примерно в 1, 414 раз (корень из 2) больше стоимости передвижения по горизонтали или вертикали. Для простоты мы используем 10 и 14. Соотношение соблюдается и мы избегаем вычисления квадратных корней и десятичной дроби.
Поиск пути. A* Использование целых чисел позволяет значительно ускорить вычисления, т. к. поиск пути может быть очень медленным если не использовать подобные вычисления. Т. к. мы вычисляем стоимость G вдоль пути к текущей точке, способ ее установить состоит в том, чтобы взять G родительской клетки и прибавить 10 или 14, в зависимости от диагонального или ортогонального расположения текущей клетки относительно родительской клетки.
Поиск пути. A* Стоимость H может быть вычислена многими способами. Метод, который мы используем, называется методом Манхеттена (Manhattan method), где считается общее количество клеток, необходимых для достижения целевой точки от текущей, по горизонтали и вертикали, игнорируя диагональные перемещения и любые препятствия, которые могут оказаться на пути.
Поиск пути. A* Затем мы умножаем общее количество полученных клеток на 10. Можно решить, что эвристика - просто приблизительное определение оставшегося расстояния между текущей клеткой и целью по прямой, но это не так.
Поиск пути. A* Мы пытаемся установить оставшееся расстояние вдоль пути (который обычно идет не по прямой), но алгоритм требует от нас не переоценить это расстояние, иначе он может найти не верный путь. Использованный метод гарантирует нахождение правильного пути.
Поиск пути. A* Стоимость F вычисляется путем сложения стоимостей G и H. Результаты первого шага поиска пути проиллюстрированы ниже. Значения F, G и H записаны в каждой клетке. Как видим по клетке справа от стартовой точки, F выводится в верхнем левом углу, G выводится в нижнем левом углу, а H выводится в нижнем правом углу.
Поиск пути. A*
Поиск пути. A* Давайте посмотрим на некоторые из этих клеток. В клетке с буквами G = 10. Это потому, что она находится на расстоянии в одну клетку от стартовой точки, при том по горизонтали. Также G = 10 у клеток прямо сверху, снизу и слева от стартовой точки. У диагональных клеток G = 14.
Поиск пути. A* Стоимость H посчитана с помощью вычисления Манхеттенского расстояния к красной целевой клетке, двигаясь только по горизонтали и вертикали, игнорируя все стены на пути. У клетки, прямо справа от стартовой, расстояние до цели 3 клетки. Используя этот метод видим, что H = 30.
Поиск пути. A* У клетки прямо над ней, расстояние уже 4 клетки (помните, что надо двигаться только по горизонтали и вертикали). И ее значение стоимости H будет равно 40. Аналогично вычисляются стоимости H для других клеток. Стоимость F для каждой клетки вычисляется простым суммированием G и H.
Поиск пути. A* Для продолжения поиска мы просто выбираем клетку с наименьшей стоимостью F из всех клеток, находящихся в открытом списке. Затем с выбранной клеткой мы производим такие действия: 1. Удаляем из открытого списка и добавляем в закрытый список.
Поиск пути. A* 2. Проверяем все соседние клетки. Игнорируем те, которые находятся в закрытом списке или непроходимы (поверхность со стенами, водой и т. п. ), остальные добавляем в открытый список, если они там еще не находятся. Делаем выбранную клетку «родительской» для всех этих клеток.
Поиск пути. A* 3. Если соседняя клетка уже находится в открытом списке, проверяем, не короче ли путь по этой клетке? Т. е. сравниваем значения стоимости G этих двух клеток. Если при использовании этой клетки стоимость G выше, чем при использовании текущей клетки, то не предпринимаем ничего.
Поиск пути. A* Если же стоимость ниже, то меняем «родителя» этой клетки на выбранную клетку. Затем вычисляем стоимости F и G этой клетки. От наших начальных 9 клеток, осталось 8 в открытом списке, а стартовая клетка была внесена в закрытый список. Клетка с наименьшей стоимостью F находится прямо справа от стартовой клетки, и ее стоимость F = 40.
Поиск пути. A* Выбираем эту клетку как нашу следующую клетку. Она выделена голубым цветом на рисунке.
Поиск пути. A* Сначала мы удаляем ее из открытого списка и добавляем в закрытый список (вот почему она выделена голубым цветом). Затем мы проверяем соседние клетки. Клетки, сразу справа от этой клетки - стены, поэтому мы их игнорируем. Клетка, прямо слева - стартовая клетка. Она находится в закрытом списке, поэтому мы ее тоже игнорируем.
Поиск пути. A* Оставшиеся 4 клетки уже находятся в открытом списке, поэтому мы должны проверить, не короче ли пути по этим клеткам, используя текущую клетку. Сравнивать будем по стоимости G. Давайте посмотрим на клетку, прямо под нашей выбранной клеткой. Ее стоимость G равна 14.
Поиск пути. A* Если мы будем двигаться по этой клетке, стоимость G будет равна 20 (10, стоимость G чтобы добраться к текущей клетке плюс 10 для движения вертикально вверх, к соседней клетке). Стоимость G = 20 больше, чем G = 14, поэтому это будет не лучший путь. Более целесообразным будет движение по диагонали на одну клетку, чем движение на одну клетку по горизонтали, а потом одну по вертикали.
Поиск пути. A* Когда мы повторим этот процесс для всех 4 соседних клеток, которые находятся в открытом списке, то становится известно, что ни один из путей не улучшится при движении по этим клеткам через выбранную, потому ничего не меняем. Теперь, когда мы осмотрели все соседние клетки, то закончили с текущей клеткой и готовы двигаться к следующей.
Поиск пути. A* Теперь мы проходим весь открытый список, который уменьшился до 7 клеток, и выбираем клетку с наименьшей стоимостью F. Отметим, что в этом случае существует 2 клетки со стоимостью 54, значит встает вопрос выбора, но на самом деле это не принципиально. В целях увеличения скорости поиска можно выбрать последнюю клетку, которую мы добавили в открытый список.
Поиск пути. A* Это предупредит поиск в выборе клеток, к которым можно будет обратиться позже, когда мы подберемся ближе к цели. Но в действительности это не так уж важно. Вот почему две версии A* могут найти разные пути с одинаковой длиной. Выберем клетку, прямо внизу, справа от стартовой, как показано на рисунке ниже.
Поиск пути. A*
Поиск пути. A* В этот раз, когда мы проверяем соседние клетки, видим, что клетка, прямо справа - стена и мы ее пропускаем. Так же поступаем и с клеткой, которая находится прямо над ней. Так же мы игнорируем клетку, которая находится прямо под ней, т. к. нельзя добраться до этой клетки без среза угла ближайшей стены.
Поиск пути. A* Сначала нужно спуститься вниз, а только потом двигаться на эту клетку (на самом деле это правило среза углов необязательно, и его использование зависит от расположения вершин). Остается еще 5 клеток. 2 клетки, находящиеся под текущей, еще не в открытом списке, потому мы их добавляем в открытый список и назначаем текущую клетку их «родителем» .
Поиск пути. A* Повторяем этот процесс до тех пор, пока не добавим целевую клетку в открытый список. Возможный результат приведен на рисунке ниже.
Поиск пути. A*
Поиск пути. A* Следует заметить, что родительская клетка для клетки, находящейся в 2 клетках под стартовой изменилась по сравнению с предыдущей иллюстрацией. Перед этим у нее стоимость G была равна 28 и указатель был направлен вверх и влево. Теперь стоимость G равна 20, а указатель направлен прямо вверх.
Поиск пути. A* Это произошло где-то в процессе нашего поиска, когда была проверена стоимость G и оказалось, что путь через эту клетку будет более коротким. Поэтому поменялась ее родительская клетка и были пересчитаны стоимости G и F. Существует много ситуаций, когда такая проверка будет сильно влиять на выбор более короткого пути к цели.
Поиск пути. A* Определим сам путь. Начнем с красной целевой клетки и будем двигаться назад с клетки на ее родителя, следуя указателям. Это доставит вас к стартовой клетке и это и будет путь, показанный на рисунке ниже. Движение от стартовой точки A к целевой точке B будет просто передвижением от центра каждой клетки (вершины) к центру следующей клетки до тех пор, пока вы не достигните цели.
Поиск пути. A*
Поиск пути. A* Итак, пошаговое представление метода А*: 1. Добавляем стартовую клетку в открытый список. 2. Повторяем следующее: - Ищем в открытом списке клетку с наименьшей стоимостью F. Делаем ее текущей клеткой.
Поиск пути. A* - Помещаем ее в закрытый список и удаляем из открытого. - Для каждой из соседних 8 клеток: • Если клетка непроходимая или она находится в закрытом списке, игнорируем ее. В противном случае делаем следующее:
Поиск пути. A* • Если клетка еще не в открытом списке, то добавляем ее туда. Делаем текущую клетку родительской для это клетки. Расcчитываем стоимости F, G и H клетки. • Если клетка уже в открытом списке, то проверяем, не дешевле ли будет путь через эту клетку. Для сравнения используем стоимость G.
Поиск пути. A* Более низкая стоимость G указывает на то, что путь будет дешевле. Если это так, то меняем родителя клетки на текущую клетку и пересчитываем для нее стоимости G и F. Если вы сортируете открытый список по стоимости F, то вам надо отсортировать весь список в соответствии с изменениями.
Поиск пути. A* - Останавливаемся, если: • Добавили целевую клетку в открытый список, в этом случае путь найден. • Или открытый список пуст, и мы не дошли до целевой клетки. В этом случае путь отсутствует. 3. Сохраняем путь. Двигаясь назад от целевой точки, проходя от каждой точки к ее родителю до тех пор, пока не дойдем до стартовой точки. Это и будет искомый путь.
Поиск пути. A* Если вы хотите чтобы объекты обходили друга, то можно использовать несколько методов. Можно обрабатывать те, которые не двигаются или находятся близко к тому, для которого ищется путь, а остальные просто игнорировать.
Поиск пути. A* Если же вы хотите обрабатывать объекты, которые двигаются и находятся на расстоянии более чем в одну вершину, то вам нужно будет разработать метод для установления их положения в пространстве в любое время, чтобы они могли должным образом уклониться.
Поиск пути. A* В противном случае в дальнейшем можно столкнуться со странными путями, где объекты двигаются по зигзагообразной траектории, пытаясь объехать другие, которых там давно нет. Также потребуется система определения столкновений, так как не важно насколько хорош ваш путь, со временем многие вещи могут измениться.
Поиск пути. A* Когда происходит столкновение, надо просчитать новый путь или, если это не лобовое столкновение, подождать пока другой объект отойдет с дороги, перед тем, как двигаться дальше.
Поиск пути. A* Различная стоимость передвижения. В этом примере поверхность может быть только двух типов - проходимая и непроходимая. Но зачастую имеется проходимая территория, которая имеет большую стоимость передвижения. Болота, возвышенности, лестницы в пещерах, и т. д. - это примеры поверхности, которую можно пройти, но стоимость передвижения у нее выше, чем стоимость передвижения по обычной.
Поиск пути. A* Также стоимость передвижения по дорогам может быть ниже стоимости передвижения по другим видам поверхности. Эта проблема легко решается путем добавления стоимости поверхности при вычислении стоимости G любой вершины. Просто добавляем дополнительную стоимость к таким вершинам.
Поиск пути. A* Алгоритм поиска пути A* написан для нахождения пути с наименьшей стоимостью и легко справится с такой задачей. В описанном примере, когда поверхность может быть или проходимой или нет, A* будет искать кратчайший, более прямолинейный путь. Но в случае с различной стоимостью поверхности, юнит может пойти более длинным путем.
Поиск пути. A* Существует еще одно решение – «Influence mapping» (карта с областями влияния). Так же как и с различной стоимостью поверхности, можно создавать дополнительные системы и применять их для целей ИИ.
Поиск пути. A* Пусть у нас есть карта, на которой находятся толпы врагов, охраняющих проезд через горный регион. Каждый раз, когда компьютер посылает своего персонажа через этот проход, он уничтожается. Если вы захотите, то можете создать «карту влияний» , которая будет «штрафовать» вершины, возле которых множество вражеских единиц.
Поиск пути. A* Это научит компьютер планировать более безопасные пути и поможет избежать ситуаций, когда компьютер продолжит посылать своего персонажа через более опасный район только потому, что он более короткий.
Поиск пути. A* Обработка неизведанных территорий. Вы когда-нибудь играли в игры, в которых компьютер всегда знает точно какой путь выбрать, даже если карта еще не полностью исследована? В зависимости от игры, поиск пути это то, что может быть очень нереалистичным. К сожалению, это проблема, которую не так-то просто решить.
Поиск пути. A* Ответ заключается в создании массива «известная проходимость» для каждого из игроков и компьютерных оппонентов ( «каждый игрок» не значит «каждый управляемый игроком объект или персонаж» , это потребовало бы очень много памяти).
Поиск пути. A* Каждый такой массив должен содержать информацию про области, которые игрок уже исследовал, остальные же области должны оставаться непроходимыми до исследования. Используя такое решение, управляемые объекты будут попадать в тупики и искать неверный путь до тех пор, пока они не откроют всю карту. Как только карта будет исследована, поиск пути станет всегда находить верные пути.
Поиск пути. A* Сглаженные пути. A* даст вам кратчайший, с наименьшей стоимостью путь, но он не даст вам визуально сглаженного пути. Давайте посмотрим на окончательный путь, просчитанный в примере. На этом пути первый шаг находится справа внизу от стартовой клетки. Не казался бы наш путь более плавным, если бы первый шаг находился прямо под стартовой клеткой?
Поиск пути. A* Есть несколько способов решить эту проблему. В процессе поиска можно можете «штрафовать» вершины, где есть смена направления движения, увеличивая их стоимости G. Так же можно пройти по всему пути после его вычисления и выискивать вершины, в которых вы хотелось бы изменить направление для более сглаженного пути.
Поиск пути. A* Неквадратные области поиска. В нашем примере мы используем простые плоские квадратные ячейки. Совсем не обязательно всегда выбирать такое решение. Можно использовать области с неправильной формой.
Непрерывное игровое пространство Рассматриваемые методы поиска предполагали, что пространство разбито на квадратные (как вариант шестиугольные) ячейки. Но что, если игровое пространство непрерывно? Если позиции и объектов и препятствий сохранены в виде непрерывных значений и могут быть настолько точно представлены, как и разрешение экрана? См. рис. ниже (A).
Непрерывное игровое пространство
Непрерывное игровое пространство Многие подходы находят способы для сведения непрерывного пространства к нескольким дискретным вариантам. После этого, они обычно используют A* для поиска желаемого пути. Способы дискретизации пространства включают:
Непрерывное игровое пространство Ячейки. Простым подходом является нанесение ячеистой сетки на поверхность пространства поиска. Ячейки, содержащие часть или все препятствие, обозначаются занятыми; цепочка ячеек, касающихся заблокированных ячеек, также помечаются блокированными для разрешения передвижения без столкновений. Это представление также полезно для проблемы взвешенных областей (B на рисунке).
Непрерывное игровое пространство Точки видимости. Для проблем обхода препятствий, можно сфокусироваться на критических точках, в основном на расположенных возле вершин препятствий (на достаточном расстоянии, чтобы избежать столкновений), при этом точки считаются соединенными, если они видимы между собой (то есть, между ними нет препятствий).
Непрерывное игровое пространство Для любого пути, поиск рассматривает в качестве промежуточных шагов между стартом и целью только критические точки. Смотрите рисунок (C).
Непрерывное игровое пространство Выпуклые полигоны. Для обхода препятствий, пространство, не занимаемое полигональными препятствиями, разбивается на выпуклые полигоны; промежуточными точками могут быть центры полигонов или точки на границах полигонов.
Непрерывное игровое пространство Существует несколько схем декомпозиции пространства: C-Cells (каждая вершина соединяется с ближайшей видимой вершиной; эти линии разбивают пространство) и разложении на максимальные области (каждая выпуклая вершина препятствия проектирует грани, составляющие вершину, на ближайшие препятствия или стены;
Непрерывное игровое пространство из этих двух сегментов и сегмента примыкающего к ближайшей видимой вершине выбирается кратчайший). (См. рис. D. ) Для проблемы взвешенных областей, пространство разделяется на полигоны с однородной стоимостью проходимости.
Непрерывное игровое пространство Точки используемые при пересечении границ вычисляются по закону преломления Снелла. Этот подход избавляет от иррегулярных путей, найденных другими способами.
Непрерывное игровое пространство Квадратные деревья. Подобно выпуклым полигонам пространство разделяется на квадраты. Каждый квадрат, не являющийся однородным, разделяется на четыре меньших квадрата. Центры этих квадратов используются для поиска пути. (См. рис. E. )
Непрерывное игровое пространство Обобщенные цилиндры. Пространство между смежными препятствиями рассматривается как цилиндр, форма которого изменяется вдоль его оси. Вычисляется ось, проходящая через пространство между двумя смежными препятствиями (включая стены), и эти оси используются для поиска пути. (См. рис. F. )
Непрерывное игровое пространство Потенциальные поля. Этот подход, не требующий ни квантизации пространства, ни полных предварительных расчетов, считает, что каждое препятствие имеет вокруг себя отталкивающее потенциальное поле, сила которого обратно пропорциональна расстоянию до него; так же существует однородная сила притяжения к цели.
Непрерывное игровое пространство Через близкие постоянные интервалы времени вычисляется сумма притягивающих и отталкивающих векторов и объект передвигается в этом направлении. Проблема этого подхода состоит в попадании объекта в локальный минимум; существуют различные способы выхода из таких точек.
661068b80dcdffabcb74509fcef9b236.ppt