У меня есть карта игры, представленная в виде карты плитки. В настоящее время на карте присутствуют два типа объектов, относящихся к этой проблеме: gatherable resources (деревья, камни и т. Д.) И здания, построенные игроком. Здания также связаны дорогами.алгоритм, используемый для поиска ближайшего объекта на карте плитки
У меня есть проблема, выясняя эффективный алгоритм, который мог бы сделать следующее:
- найти ближайший ресурс любого соответствующее зданию (т. Е найти ближайшее дерево к Дровосек/дерево-собирателю)
- найти ближайшее релевантное здание любого здания (то есть. найти ближайшее хранение в любую пилораму)
Я отделил эти два вопрос, потому что первый один не нужны дороги, а второй один предполагается только использовать дороги.
Таким образом, результатом этого должен быть единственный путь к одному объекту, который ближе всего к тому, из которого я его вычисляю. Затем путь используется рабочим, чтобы собрать ресурс и вернуть его, или, скажем, выбрать ресурс из лесопилки и довести его до ближайшего хранилища.
Я знаю, как получить самый близкий путь (A *, Djikstra или даже Floyd-Warshall), но я не уверен, как оптимально перейти к кратким результатам и получить лучший/самый близкий, особенно если это будет проводиться очень регулярно, и ожидается, что коллекции объектов карты (дороги и здания) будут меняться регулярно.
Я делаю это в Unity3D/C#, но я думаю, что это не проблема, связанная с Unity3D.
Как я могу продолжить?
Вы правы. Но после (и обновления) конечного пути, когда я выясню, какой объект является ближайшим, это другая проблема. Выяснение ближайшего объекта - проблема. Один лесоруб может иметь доступ к 100 деревьям и найти ближайший путь к одному из них довольно легко. Но регулярная проверка/обновление списка всех из них и выбор ближайшего/кратчайшего - это то, что мне нужно. – EwanK
Предполагая, что вы используете набор путевых точек (сетка, скорее всего?), Вы можете просто начать с местоположения рабочего и искать произвольные деревья.Нет необходимости искать ВСЕ деревья. Как только ваш поиск нашел дерево, вы знаете, что «оптимальный» путь должен быть не таким, как этот путь. Поэтому при поиске других маршрутов вы можете сразу отказаться от маршрута, если он превышает эту верхнюю границу. –
Я, вероятно, вернусь к какому-то иерархическому пути. Во-первых, мне пришлось бы разбить весь фрагмент на более мелкие регионы (скажем, 8х8), и все плитки в одном регионе будут гарантированы быть доступными друг другу. Таким образом, в конечном итоге получение ближайшего объекта потребует найти его на уровне региона, а затем получить путь к нему, ограниченный областями, которые ему нужно пройти. Я считаю, что один из алгоритмов, который делает это, - это HPA *. – EwanK