Ошибка подтверждения в приоритетной очереди с указателями пользовательских классов - PullRequest
0 голосов
/ 17 сентября 2011

Я реализую алгоритм поиска A *, но продолжаю сталкиваться с проблемами с очередью приоритетов.Я реализовал собственный компаратор для очереди приоритетов в соответствии с этой статьей

Это соответствующий код:

class CNode;

struct CompareNode : public binary_function<CNode*, CNode*, bool> {
    bool operator()(const CNode* lhs, const CNode* rhs) const {
        return lhs->m_costFromStart+lhs->m_heuristic > rhs->m_costFromStart+rhs->m_heuristic;
    }
};


bool AStarSearch(CNode* start, CNode* end) {
    priority_queue<CNode*, vector<CNode*>, CompareNode> open;
    ...
}

Стек вызовов:

std::_Debug_heap ...
std::pop_heap ...
std::priority_queue<CNode *,std::vector<CNode *,std::allocator<CNode *> >,CompareNode>::pop()
AStarSearch(CNode * start=0x0f9a23b8, CNode * end=0x0f9a24e8)

Тогда использовалось больше, так как для этого алгоритма мне требовалась минимальная куча.Реализация, кажется, работает нормально, и проблема исчезает, когда она запускается в режиме выпуска, но очередь приоритетов иногда выдает ошибки подтверждения «Недопустимая куча» в режиме отладки, когда приоритетная очередь имеет значение pop () ed.

Я не знаком с двоичной функцией в stl, но проблема, похоже, связана с компаратором.Удаление компаратора или изменение знака на меньшее устраняет ошибку, но это дало бы мне максимальную кучу.Я что-то упускаю?

1 Ответ

3 голосов
/ 18 сентября 2011

Спасибо за помощь. Оказывается, я не перестраивал кучу после изменения стоимости узлов в очереди приоритетов. Звонок

make_heap(const_cast<CNode**>(&open.top()), const_cast<CNode**>(&open.top()) + open.size(), 
CompareNode());

после каждой модификации pq решал проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...