STL Priority_queue с использованием повторной вставки для уменьшения ключа не работает ⇐ C++
-
Anonymous
STL Priority_queue с использованием повторной вставки для уменьшения ключа не работает
Я пытаюсь реализовать алгоритм, подобный A*, и у меня возникли проблемы с реализацией уменьшения ключа с помощью контейнера priority_queue STL. Я пытаюсь повторно вставить элементы в очередь, когда уменьшаю ключ, но они по-прежнему не появляются перед элементами с более высоким ключом.
Вот основной A*-подобный цикл с удаленными ненужными деталями:
while (!(open.empty() || (goalExp && switchToEA(firstTimeGoal, reopen)) )) { Узел *nextParent = open.top(); открыть.поп(); // Где узел выскакивает if (closed.find(nextParent) != closed.end()) продолжать; закрытый.вставка(следующийРодитель); nextParent->expand((*graph)[nextParent->getState()]); for (auto &i: nextParent->getAdjacent()) { Т-состояние = i.first; Cost_t EdgeCost = i.Second; Узел *ребенок; if (state_to_node.find(state) != state_to_node.end()) { дочерний = state_to_node[состояние]; if (nextParent->getGCost() + EdgeCost getGCost()) { child->setGCost(nextParent->getGCost() + EdgeCost); child->setFCost(child->getGCost() + (*h)(state)); ребенок->setBack(nextParent); open.push(ребенок); // Уменьшение ключа } } еще { дочерний элемент = новый узел (nextParent->getGCost() + EdgeCost, nextParent->getGCost() + EdgeCost + (*h)(состояние), состояние, следующий родитель); open.push(ребенок); // Вставка нового узла state_to_node[состояние] = дочерний; } } } Определение приоритетной очереди:
std::priority_queue open; Класс сравнения:
Сравнить класс { публика: booloperator() (BaseNode * a,BaseNode * b) { вернуть a->fcost > b->fcost; } booloperator() (const BaseNode& a, const BaseNode& b) { вернуть a.fcost > b.fcost; } };
Я пытаюсь реализовать алгоритм, подобный A*, и у меня возникли проблемы с реализацией уменьшения ключа с помощью контейнера priority_queue STL. Я пытаюсь повторно вставить элементы в очередь, когда уменьшаю ключ, но они по-прежнему не появляются перед элементами с более высоким ключом.
Вот основной A*-подобный цикл с удаленными ненужными деталями:
while (!(open.empty() || (goalExp && switchToEA(firstTimeGoal, reopen)) )) { Узел *nextParent = open.top(); открыть.поп(); // Где узел выскакивает if (closed.find(nextParent) != closed.end()) продолжать; закрытый.вставка(следующийРодитель); nextParent->expand((*graph)[nextParent->getState()]); for (auto &i: nextParent->getAdjacent()) { Т-состояние = i.first; Cost_t EdgeCost = i.Second; Узел *ребенок; if (state_to_node.find(state) != state_to_node.end()) { дочерний = state_to_node[состояние]; if (nextParent->getGCost() + EdgeCost getGCost()) { child->setGCost(nextParent->getGCost() + EdgeCost); child->setFCost(child->getGCost() + (*h)(state)); ребенок->setBack(nextParent); open.push(ребенок); // Уменьшение ключа } } еще { дочерний элемент = новый узел (nextParent->getGCost() + EdgeCost, nextParent->getGCost() + EdgeCost + (*h)(состояние), состояние, следующий родитель); open.push(ребенок); // Вставка нового узла state_to_node[состояние] = дочерний; } } } Определение приоритетной очереди:
std::priority_queue open; Класс сравнения:
Сравнить класс { публика: booloperator() (BaseNode * a,BaseNode * b) { вернуть a->fcost > b->fcost; } booloperator() (const BaseNode& a, const BaseNode& b) { вернуть a.fcost > b.fcost; } };
Мобильная версия