Поиск пути. (pathfinding)

Форум для всего, что связано с ИИ.

Re: Поиск пути. (pathfinding)

Сообщение nuberoid 16 фев 2011, 01:34

И мои пять копеек в тему. Если нужно сделать поиск пути по полю с клетками без ходов по диагоналям :
Синтаксис:
Используется javascript
class _GridNode{
        var _value;
        var _f;
        var _g;
        var _h;
        var _debug;
        var _parent;
        var _x;
        var _y;
              function _GridNode(value,f,g,h,debug,parent,x,y){
                        _value=value;
                        _f=f;
                        _g=g;
                        _h=h;
                        _debug=debug;
                        _parent=parent;
                        _x=x;
                        _y=y;
        }




function Search (grid, start, end) {
                var openList   = new Array();
                var closedList = new Array();
                openList.push(start);
 
                while(openList.length > 0) {
               
                        // Ищем наименьший f
                        var lowInd = 0;
                        for(var i=0; i<openList.length; i++) {
                                if(openList[i]._f < openList[lowInd]._f) { lowInd = i; }
                        }
                        var currentNode = openList[lowInd];
 
                        //Если пришли в финиш
                        if(currentNode._x == end._x && currentNode._y == end._y ) {
                                var curr = currentNode;
                                var ret = new Array();
                                while(curr._parent) {
                                        ret.push(curr);
                                        curr = curr._parent;
                                }
                                return ret.reverse();
                        }
                       
                        //Если не пришли - текущую перемещаем из открытого списка в закрытый, проверяем всех соседей
                        for(var k=0; k<openList.length; k++) {
                                if(openList[k]==currentNode) { openList.RemoveAt(k); }
                        }
                       
                        closedList.push(currentNode);
                        var neighbors = Neighbors(grid, currentNode);
 
                        for(var n=0; n<neighbors.length;n++) {
                                var neighbor = neighbors[n];
                                if(findGraphNode(closedList,neighbor) || neighbor._value==0) {
                                        // не правильная клетка
                                        continue;
                                }
 
                                // g - это кратчайший путь от старта до текуще клетки  , нужно проверить что путь по которому мы прриходим в соседнюю клетку кратчайший
                                var gScore = currentNode._g + 1; // 1 это путь из этой клетки в соседнюю
                                var gScoreIsBest = false;
 
 
                                if(!findGraphNode(openList,neighbor)) {
                                        // первый раз посещаем клетку, это лучший путь
                                        // так же считаем  h
 
                                        gScoreIsBest = true;
                                        neighbor._h = Heuristic(neighbor._x, neighbor._y,end._x,end._y);
                                        openList.push(neighbor);
                                }
                                else if(gScore < neighbor._g) {
                                        // Мы уже были в этой клетке , но с худшим  g (расстояние от старта)
                                        gScoreIsBest = true;
                                }
 
                                if(gScoreIsBest) {
                                        // нашли пока что лучший путь к ячейке, запоминаем как пришли сюда
                                        neighbor._parent = currentNode;
                                        neighbor._g = gScore;
                                        neighbor._f = neighbor._g + neighbor._h;
                                        neighbor._debug = "F: " + neighbor._f + "<br />G: " + neighbor._g + "<br />H: " + neighbor._h;
                                }
                        }
                }
 
                // Ничего не нашли- пустой массив
                return <img src="./images/smilies/unmarked.gif" alt="[]" title="Запланировано" />;
        }//,
function Heuristic (x0,y0, x1,y1) {
                // Расстояние по Манхеттану
                var d1 = Mathf.Abs (x1 - x0);
                var d2 = Mathf.Abs (y1 - y0);
                return d1 + d2;
        }//,
function Neighbors(grid, node) {
                var ret = new Array();
                var x = node._x;
                var y = node._y;
 
                if(x>0 && grid[x-1][y]._value) {
                        ret.push(grid[x-1][y]);
                }
                if(x<grid.length-1 && grid[x+1][y]._value) {
                        ret.push(grid[x+1][y]);
                }
                if(y>0 && grid[x][y-1]._value) {
                        ret.push(grid[x][y-1]);
                }
                if(y<grid[x].length-1 && grid[x][y+1]._value) {
                        ret.push(grid[x][y+1]);
                }
                return ret;
        }
function findGraphNode(searchin,searchwhat){
                for(var l=0; l<searchin.length; l++) {
                                if(searchin[l]==searchwhat) { return 1 ;}
                }
        }
       
 
nuberoid
UNец
 
Сообщения: 11
Зарегистрирован: 23 янв 2011, 22:56

Re: Поиск пути. (pathfinding)

Сообщение Syberex 27 май 2011, 13:44

Еще интересные статьи:
Базовые алгоритмы нахождения кратчайших путей во взвешенных графах - http://habrahabr.ru/blogs/algorithm/119158/

Сравнение алгоритмов поиска маршрутов в StarCraft и StarCraft 2 - http://habrahabr.ru/blogs/subconsciousness/100698/
:ymsmug:
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Поиск пути. (pathfinding)

Сообщение Alcatraz 20 июн 2011, 07:31

кстати, A* PathFinding, обновился до версии 2.9, точнее говоря уже до (2.95) :)

www.arongranberg.com/unity/a-pathfinding/
Unity3D Game Developer
Аватара пользователя
Alcatraz
UNITрон
 
Сообщения: 236
Зарегистрирован: 07 июн 2011, 09:12
Откуда: Москва
  • Сайт
  • ICQ

Re: Поиск пути. (pathfinding)

Сообщение AndreyMust19 28 июн 2011, 12:50

Испробовал этот проект версии 2.95.
В режиме сетки на пустом пространстве маршрут сначала прокладывается по диагонали, а потом - по вертикали/горизонтали (хотя по прямой будет короче). Насчет огибания препятствий возражений нет.
В режиме границ или списка иногда не находит путь за тонкую длинную стену и в лабиринте. А также почти во всех режимах персонаж не останавливается точно в точке назначения.
Нужна помощь? Сами, сами, сами, сами, сами... делаем все сами
AndreyMust19
Адепт
 
Сообщения: 1119
Зарегистрирован: 07 июн 2011, 13:19

Re: Поиск пути. (pathfinding)

Сообщение Neodrop 29 июн 2011, 17:47

В 3.5 будет встроенный поиcк пути. Осенью.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Поиск пути. (pathfinding)

Сообщение lol 30 июн 2011, 21:57

В 3.5 будет встроенный посик пути.


Ух ты.

А они где-то выкладывают информацию о том, что будет в следующей версии? Можно почитать? На оф.сайте среди новостей не нашёл..
lol
Старожил
 
Сообщения: 508
Зарегистрирован: 15 ноя 2009, 10:48
Откуда: Москва

Re: Поиск пути. (pathfinding)

Сообщение DbIMok 30 июн 2011, 22:00

правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Поиск пути. (pathfinding)

Сообщение lol 25 сен 2011, 10:39

Вышла, кстати, версия 3.0: http://www.arongranberg.com/unity/a-pathfinding/
Но интересна также разаботка Local Avoidance: http://www.arongranberg.com/ Обещают её прикрутить к A*pathfinding.

А в Юньковской версии 3.5 "Beautiful, natural-looking crowd simulation using RVO and PLE algorithms wrapped in a simple API." - это, наверное, как раз что-то вроде Local Avoidance?
lol
Старожил
 
Сообщения: 508
Зарегистрирован: 15 ноя 2009, 10:48
Откуда: Москва

Re: Поиск пути. (pathfinding)

Сообщение gnoblin 25 сен 2011, 17:12

SimplePath вроде неплохое решение :)
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Поиск пути. (pathfinding)

Сообщение Belfegnar_ 26 сен 2011, 17:12

lol писал(а):А в Юньковской версии 3.5 "Beautiful, natural-looking crowd simulation using RVO and PLE algorithms wrapped in a simple API." - это, наверное, как раз что-то вроде Local Avoidance?

Что-то вроде этого
Belfegnar_
UNIт
 
Сообщения: 112
Зарегистрирован: 22 ноя 2010, 14:08

Re: Поиск пути. (pathfinding)

Сообщение Syberex 29 янв 2012, 01:40

Опять статейки [nuklear]
http://pmg.org.ru/ai/index.html
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Поиск пути. (pathfinding)

Сообщение bomberest 05 фев 2012, 22:29

Основы Unity3D Свой 2D-движок Фильм для разработчиков Кастомизация едитора
Лекции игрового программирования
Skype: Andrewf56 | Steam: bomberest (-AnF-) | Vk: _https://vk.com/andrewshut
Аватара пользователя
bomberest
Старожил
 
Сообщения: 538
Зарегистрирован: 22 июн 2011, 14:38
Откуда: Минск
  • ICQ

Re: Поиск пути. (pathfinding)

Сообщение lol 12 фев 2012, 22:12

А кто-нибудь использовал уже NavMeshNavigation из 3.5 ? Я так понял, что обходить динамические объекты эта навигация не умеет:( А умеет только ходить по заранее запеченым путям(можно, конечно, навесить на такие rigidbody-объекты Nav Mesh Agent'а - но это никак не поможет, потому что тогда они начинают ползать как тараканы).

Поэтому хотелось бы узнать, кто использовал сторонние библиотеки - есть ли там обхождение динамических препятствий?
lol
Старожил
 
Сообщения: 508
Зарегистрирован: 15 ноя 2009, 10:48
Откуда: Москва

Re: Поиск пути. (pathfinding)

Сообщение Golandez 12 фев 2012, 22:22

Simplepath хорошо работает с динамическими обьектами.
Ты нужен только тогда,когда нужен.(С)
Сказать спасибо
Аватара пользователя
Golandez
Пилигрим
 
Сообщения: 1637
Зарегистрирован: 06 авг 2009, 13:55
Откуда: Харьков
Skype: lestardigital

Re: Поиск пути. (pathfinding)

Сообщение Belfegnar_ 13 фев 2012, 06:30

lol писал(а):можно, конечно, навесить на такие rigidbody-объекты Nav Mesh Agent'а - но это никак не поможет, потому что тогда они начинают ползать как тараканы

Тараканов можно вернуть на место в LateUpdate, но эт все равно не полноценная работа с динамич.объектами, согласен, возможны ситуации когда агент просто упрется рогами.
Я вот тут наткнулся на некое ограничение в 1024 агента. Если инстанцировать больше - ошибка и "лишние" агенты не работают.(( Кто-нибудь сталкивался?
Belfegnar_
UNIт
 
Сообщения: 112
Зарегистрирован: 22 ноя 2010, 14:08

Пред.След.

Вернуться в Искуственный Интеллект

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1