2011-09-17 8 views
0

私は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に精通していませんが、この問題はコンパレータにあるようです。コンパレータを削除するか、符号をあまり変更しないように変更すると、エラーが取り除かれますが、それによって最大のヒープが得られます。私は行方不明のものがありますか?

+2

"アサーションエラー" - 詳細を指定してください。どこにエラーがあり、コールスタックは何ですか? –

+1

ヒープが壊れています。これが起こると、エラーが表示された場所でエラーの根本はほとんど分かりません。すべてのあなたのメモリの書き込みを行って、おそらくあなた自身のアサートを追加してみてください。たくさんのコードがない場合は、ここに投稿することができます。さもなければ、エラーの根を推測することはほとんど不可能です。また、ヒープの破損は変更に敏感であることに注意してください。おそらく最大ヒープに変更すると問題は解決しませんが、現在のコードではヒープを隠します。それ以上の変更を加えることなく問題を解決してください。問題を再現できるということは解決策の半分です。 – eran

+1

重要な注意点は、A *(またはDijkstra's)ではすでにヒープ内にある要素の優先順位を変更することです。 'std :: priority_queue'クラスはこれでうまく動作しません。要素の優先度を変更した場合、優先度キューは自動的に更新されず、キューが修正されません。あなたはこれを自分で行う必要があります。これはあなたが見ている行動を説明するかもしれません。 – templatetypedef

答えて

3

ありがとうございました。優先順位キューのノードのコストを変更した後、ヒープを再構築しなかったことが分かります。この問題を解決するたびに、

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

を呼び出した後に発生します。

関連する問題