STL Priority_queue с использованием повторной вставки для уменьшения ключа не работаетC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 STL Priority_queue с использованием повторной вставки для уменьшения ключа не работает

Сообщение Anonymous »


Я пытаюсь реализовать алгоритм, подобный 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; } };
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»