Я реализую алгоритм кратчайшего пути A*
. Часть Openlist хранит все узлы, которые будут посещены. Список похож на приоритетную очередь, что первый элемент имеет минимальное значение стоимости, поэтому на каждой итерации мы просто выставляем первый элемент и посещаем его. Но внутри итерации нам нужно пересечь соседей этого узла и проверить, находится ли сосед в Openlist.C++ задает порядок сортировки по значению и поиск по ключу
Так что означает этот Openlist должен поддерживать два типа операций:
- автоматических сортировку
- посмотреть узел (по идентификатору)
Проблема здесь состоит в том, что Openlist будет сортировать по стоимости, в то время как поиск должен основываться на идентификаторе соседнего узла (соседних узлов). Поэтому я рассматривал возможность использования set, где элементы являются узлами. Но я не знаю, как искать элемент по его идентификатору в этом наборе.
struct astar_node
{
string id;
double f; //estimated cost;
double g; //distance from source to this node;
double h; //heuristic cost from this node to target;
};
struct openlist_compare
{
bool operator()(const astar_node &node1, const astar_node &node2){
return node1.f < node2.f ;
}
};
std::set<astar_node, openlist_compare> Openlist;
Храните два набора, один из которых индексируется 'f', а другой -' id'. –
Вы не можете найти элемент по его идентификатору в наборе - по крайней мере, не без итерирования по всему набору. Это не то, что нужно. – immibis
@but какой find() способ комплект делаем? – daydayup