Ich implementiere A*
kürzester Weg Algorithmus. Der Openlist-Teil speichert alle Knoten, die besucht werden. Die Liste ist wie eine Prioritätswarteschlange, bei der das erste Element den Mindestkostenwert hat. Daher wird in jeder Iteration nur das erste Element angezeigt und aufgerufen. Aber innerhalb der Iteration müssen wir die Nachbarn dieses Knotens durchlaufen und prüfen, ob der Nachbar in Openlist ist.C++ legen Sie fest, wie ein Set nach Wert sortiert und nach Schlüssel
Das heißt also, diese Openlist zwei Arten von Operationen unterstützen muss:
- automatische Sortierung
- einen Knoten suchen (durch seine ID)
Das hier Problem ist, dass Openlist wird Nach dem Kostenwert sortieren, während das Nachschlagen auf der ID des Nachbarknotens (der benachbarten Knoten) basieren muss. Also überlegte ich, set zu verwenden, wo die Elemente die Knoten sind. Aber ich weiß nicht, wie man ein Element nach seiner ID in diesem Set sucht.
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;
Halten Sie zwei Sätze, eine durch 'f' und die andere durch' id' indiziert. –
Sie suchen ein Element nicht nach seiner ID in einer Menge auf - zumindest nicht ohne die gesamte Menge durchlaufen zu haben. Dafür gibt es keine Sets. – immibis
@ but was macht die find() Methode des Sets? – daydayup