2014-02-18 7 views
0

Я работаю над Unity, используя C# для проекта, который должен быть довольно простым. Я привязался к pathFinding.Конкретный подход PathFinding

Я смотрел на Dikjstra и A * для справки, но по какой-то причине я все еще не могу принять их для работы в моем случае. Я предполагаю, что мой мозг :=while(1);

Вот идея:

Из текстового файла я импортировать «карту», ​​где каждый «*» означает, что стена, и каждый «» walkarea. На карте в области случайно помещены 2 объекта: бомба и агент.

Агент должен исследовать карту (которая образует лабиринт) и открыть для себя бомбу. Агент может перейти к своим 8 соседним плиткам, если они не являются Стенами. В моем коде класс агента содержит свою собственную карту. для каждой плитки, которую он посещает, он спрашивает «карту мира» для информации, о его 8 соседних плитках.

На своей собственной карте он берет на заметку известный тип плитки (стена/дорожка для ходьбы), и если это дорожка для ходьбы, он также отмечает, сколько раз он его посещал. Агент также имеет список «Предпочтительное направление». Это говорит о том, какую плиту выбрать рядом с ней, если более 1 не было посещено.

До этого момента я установил все хорошее и работает, и если я позволю ему запустить, он в конце концов найдет бомбу. Проблема заключается в том, что, поскольку он работает только по приоритетному направлению в соответствии с наименее посещаемой плиткой, он должен повторно посещать некоторые плитки слишком много раз, как идиот. Так что

я должен сделать это:

Если агент достигает плитки, для которого, каждый nighbour является либо стены или уже посетил, то он должен исследовать свою собственную карту, и заметки из прошлого, чтобы найти незаметная плитка, и добираться туда. Каждое направление ходьбы имеет одинаковый вес/стоимость, поэтому нам не нужно учитывать стоимость пути.

На мой взгляд, Dijkstra's является ближайшим к применению, но я все еще не могу понять это правильно.

Любые идеи или помощь будут высоко оценены.

Спасибо

Alex

+0

Возможно, вы захотите попробовать [DFS] (http://en.wikipedia.org/wiki/Depth-first_search) –

+0

Все алгоритмы эвристического поиска используют какую-то стратегию открытого/закрытого списка, где изначально текущий агент позиция находится в открытом списке. Когда узел оценивается (это означает: все его соседи рассматриваются и могут быть помещены в открытый список), сам узел помещается в закрытый список.Узлы в закрытом списке никогда не должны оцениваться снова. Если намерение заключается в том, чтобы выполнять поиск на основе оператора, итеративно, каждый кадр, WHILE, когда агент движется, тогда вам нужно «обновить» открытые/закрытые узлы на основе постоянно увеличивающегося «идентификатора запроса» поиска. – StarShine

ответ

0

Часть проблемы в том, сколько информации вы хотите, чтобы ваш агент. Если вы хотите сообщить ему, где находится цель, или, по крайней мере, ее общее направление в отношении к себе, тогда вы можете использовать это, чтобы помочь влиять на решения агента. Это позволило бы вам всегда любить двигаться в направлении, которое приближает его к цели, и, по крайней мере, пройдя путь.

В противном случае я буду отслеживать каждое место, которое он посетил на отдельной карте, а также 8 соседних плиток, так как он «видел» их, с чем-то вроде -1, указывающим на стену, которая была замечена, -2 с указанием невидимого местоположения и 0, указывающих на невидимое, но не отображаемое. Затем я использовал A * или вариант, который переместил бы его в ближайшую невидимую точку, основанную на количестве пройденных фрагментов, беспорядочно разбивая связи. Это приведет к увеличению проб и ошибок в лабиринте.