私は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)
私は分ヒープを必要に応じグレーターは、その後、使用された私は、これは、関連するコードですthis article
に応じて優先度キューにカスタムコンパレータを実装しましたこのアルゴリズムのために。 実装が正常に動作しているように見えますが、リリースモードで実行されたときに問題はなくなりますが、プライオリティキューがpop()されていると、優先キューがデバッグモードで「無効なヒープ」アサーションエラーをスローすることがあります。
私はstlのbinary_functionに精通していませんが、この問題はコンパレータにあるようです。コンパレータを削除するか、符号をあまり変更しないように変更すると、エラーが取り除かれますが、それによって最大のヒープが得られます。私は行方不明のものがありますか?
"アサーションエラー" - 詳細を指定してください。どこにエラーがあり、コールスタックは何ですか? –
ヒープが壊れています。これが起こると、エラーが表示された場所でエラーの根本はほとんど分かりません。すべてのあなたのメモリの書き込みを行って、おそらくあなた自身のアサートを追加してみてください。たくさんのコードがない場合は、ここに投稿することができます。さもなければ、エラーの根を推測することはほとんど不可能です。また、ヒープの破損は変更に敏感であることに注意してください。おそらく最大ヒープに変更すると問題は解決しませんが、現在のコードではヒープを隠します。それ以上の変更を加えることなく問題を解決してください。問題を再現できるということは解決策の半分です。 – eran
重要な注意点は、A *(またはDijkstra's)ではすでにヒープ内にある要素の優先順位を変更することです。 'std :: priority_queue'クラスはこれでうまく動作しません。要素の優先度を変更した場合、優先度キューは自動的に更新されず、キューが修正されません。あなたはこれを自分で行う必要があります。これはあなたが見ている行動を説明するかもしれません。 – templatetypedef