A* и способы его оптимизации
Для тех кто не в теме смотрите эту тему...
есть куча способов реализации сего алгоритма... можно реализовать на списках как в статье см. ссылу, а можно двумерными массивами... каждый из этих методов можно реально оптимизировать... обэтом и будет сей топ. я взял реализацию на двумерных массивах, поскольку нужно было высчитывать дорогу до многих мест одновременно располагающихся динамично... на списках как я думаю было бы намного дольше. дак вот, разобравшись в стратегии действия алгоритма пишем программу: ИМХО что надо в основном роптимизировать, дак это расстановку чисел, т.е. первый проход... обратный проход по расставленным стоимостям передвижения в большой оптимизации не нуждается поскольку прост как 2 байта... обратный проход мной рассмотрен не будет... допустим нам надо будет идти из точки А с координатами (15,15) Код:
Graphics 640,480,32,2 в результате одного прохода мы увидим, что стоимостями уже заполнен правый угол карты... происходит это потому, что цикл проходит слева направо и сверху вниз... таким образом ставим стоимость клетки в текущую и переходим к следующей, а в проверке соседних клеток мы проверяем предидущую и т.д. сразу появляется мысля, что чтоб заполнить всю карту нужно повторять этот проход пока она вся не заполнится... но это маленько ошибочное суждение... можно ведь взять и просто повернуть циклы в обратном направлении.. Код:
я чуть не подпрыгнул на диване когда придумал такой метод... но вскоре мой пыл утих поскольку у метода есть существенный недостаток а именно: продлим стенку вниз Код:
еще один недостаток: если мы загнем наше препятствие снизу, то получим вообще белое пятно которое не рассчитано Код:
посидев и хорошо подумав я всетаки дошел как усовершенствовать свой метод... все оказалось проще чем я ожидал: Код:
в результате, чем сложнее будет путь, тем больше раз надо будет повторять проходы... у меня в гаме не будет сложнее пути чем за два угла... таким образом я решил сделать два прохода по два вложенных цикла! самое главное преимущество сего метода состоит в том, что теперь по полученному массиву можно определить до какой цели будет самый краткий путь, просто брать значение ячейки массива и сравнивать... буду рад объективной критике, и конструктивным предложениям (а-ля делитесь опытом) :) |
Re: A* и способы его оптимизации
Цитата:
Цитата:
у тебя сложность алгоритма O(N^2), т.е. в примере когда ты считаешь для N=400 (20x20 клеток) это уже долговато получается, если брать "боевые" условия, например походовую стратегию с размером карты 512х512 (N=262144) в несколько проходов - это абзац. Оптимизации: двухсторонний поиск - т.е. ищем поочередно с точки отправления и точки назначения иерархический поиск - бьем карту на взаимно недостижимые части (типа районы города или области страны) и находим глобальный путь на большой карте, и пути к "выходам" на "мальеньких". ЗЫ: "заступы и вилы";-) |
Ответ: A* и способы его оптимизации
ffinder
двухстороний может дать O(2*N^2) :D иеархический поиск рулз :) |
Ответ: A* и способы его оптимизации
Цитата:
хотя этот алгоритм можна использовать даже в том случае когда боты все таки перемещаются и вверх\вниз (допустим: ступеньки, лифт, ящики) !! Просто усключаем эти условия с алгоритма !! а взаимодействия с ними организовуем другим образом !! |
Ответ: A* и способы его оптимизации
2 IGR:
я спрашивал про Цитата:
Цитата:
ЗЫ: и еще - сложность у алгоритма все таки O(2*N), а вот размер данных растет как N^2 |
Ответ: A* и способы его оптимизации
|
Ответ: A* и способы его оптимизации
2 alcoSHoLiK:
я в курсе просто при сравнениях нескольких версий одного алгоритма желательно знать не как он будет себя вести при бесконечно возрастающих наборах данных, а при конкретных значениях, в этом случае N и 2*N совсем разные вещи, если N = 500000 к примеру |
Ответ: A* и способы его оптимизации
2 ffinder
Ну это просто ,мне кажется. Два объекта двигаются , надо найти путь до каждого. Путь ищут сразу до обоих. Допустим когда мы найдём пути до каждого мы выберем куда нам нужнее |
Ответ: A* и способы его оптимизации
Копну немного...
Занимаюсь сейчас реализацией поиска путей на основе алгоритма A* для 3D. Так как я новичек в поиске путей, то появились следующие вопросы:
|
Ответ: A* и способы его оптимизации
Жаль что ни у кого нет идей по данным вопросам :(
|
Ответ: A* и способы его оптимизации
Вложений: 1
Привет !!
В книге "Artificial Intelligence for Games" есть описание иерархического поиска !! я все книгу выложить немогу, да и серфить тоже - у мя ЖПРС !! по этому вырву пару страниц там где Hierarchcal Pathfinding !! книга на Английском !! когда оч нравилось писать всякие АИ-штучки !! то пытался реализовать !! где-то валяются недо-исходники на блице !! но найти чет не получается !! можешь потом потом найти и скачать всю книгу !! есть что почитать !! а если найдешь и диск с сорцами - с мну пиво !! ;) |
Ответ: A* и способы его оптимизации
IGR
Может _http://github.com/idmillington/aicore ? |
Ответ: A* и способы его оптимизации
Хм... многоуровневый A-star ... занимательное чтиво, спасибо! Как приеду домой обязательно найду эту книжку и почитаю. Инстансинг в поиске путей я скорее всего быстро не одолею, но иерархический поиск попробовать в Юнити реализовать вполне реальная задачка...
|
Ответ: A* и способы его оптимизации
h1dd3n, да вроде бы оно !! Спасибо !!
|
Ответ: A* и способы его оптимизации
Вложений: 1
Судя по коду это вовсе не А* а обычный алгоритм заливки (алгоритм Дикстры, точнее его жалкое подобие), причем если вы построите хороший лабиринт, то он не зальет даже карту целиком.
Отличие алгоритма А* от Дикстры в том, что волновой поиск "включается" только при столкновении с препятствием, а до этого он работает как обычный алгоритм приближения. Алгоритм Дикстры используется когда нужно найти хотя-бы один объект из множества. Пример Dune2 спайса много, харвестер один, пускаем волновую заливку во все стороны пока не наткнемся на спайс. Далее прокладываем путь. Его можно также наверное использовать чтобы проложить путь от цели к группе юнитов. А* используется только когда нужно проложить путь для одного юнита. |
Часовой пояс GMT +4, время: 07:29. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot