2017-11-27 18 views
0

LEMONライブラリを使用しようとしていますが、実装しようとしているアルゴリズムの問​​題が発生しています。このアルゴリズムのアイデアは、ノードのベクトルのベクトルがあり、特定の制限を持つ異なるベクトル(カラークラス)にノードを移動したいということです。アルゴリズムを実装するコードを次に示します。C++(LEMONライブラリ)のあるベクトルから別のベクトルへのオブジェクトの移動

bool moveColor() { 
    // pick the smallest color class 
    sort(colors.begin(), colors.end(), vectorSort); 
    vector< vector<ListGraph::Node> >::iterator smallestColor = colors.begin(); 

    // shuffle this class 
    random_shuffle(smallestColor->begin(), smallestColor->end()); 

    // try to move any of the nodes to any bigger class 
    bool foundNode = false; 
    vector<ListGraph::Node>::iterator movingNode; 
    vector< vector<ListGraph::Node> >::iterator destinationClass; 
    for (movingNode = smallestColor->begin(); movingNode != smallestColor->end() && !foundNode; ++movingNode) { 
    for (destinationClass = colors.begin()+1; destinationClass != colors.end() && !foundNode; ++destinationClass) { 
     ListGraph::NodeMap<bool> filter(g, false); 
     vector<ListGraph::Node>::iterator classNode; 
     for (classNode = destinationClass->begin(); classNode != destinationClass->end(); ++classNode) { 
     filter[*classNode] = true; 
     } 
     filter[*movingNode] = true; 
     FilterNodes<ListGraph> subgraph(g, filter); 
     if (acyclic(subgraph)) { 
     foundNode = true; 
     } 
    } 
    } 

    // if a movable node was found, move it. otherwise return false 
    if (foundNode) { 
    destinationClass->push_back(*movingNode); 
    smallestColor->erase(movingNode); 
    if (smallestColor->empty()) { 
     colors.erase(smallestColor); 
    } 
    return true; 
    } 
    return false; 
} 

この関数は、ノードを移動できなくなるまでループ内でmainで呼び出されます。私は、コードを持っています主な問題は、実際には別のベクターからノードを移動セクションです:

if (foundNode) { 
    destinationClass->push_back(*movingNode); 
    smallestColor->erase(movingNode); 
    if (smallestColor->empty()) { 
    colors.erase(smallestColor); 
    } 
    return true; 
} 

私は時に消去機能ノードが解体されていると思うので、この部分が動作していないようが呼び出されています。

NEW ROUND 
1 
3 
0 
5 2 
7 6 4 
NEW ROUND 
3 
0 32701 
5 2 
7 6 4 

はあなたが見ることができるように、移動されたノードのIDが正しくありません(代わりに1の32701):ここでは、この関数が呼び出された前と後のノードIDのサンプルです。どんな助けもありがとうございます。

答えて

0

問題は、実際にはここにある:

if (acyclic(subgraph)) { 
    foundNode = true; 
} 

ノードを見つけた場合、あなたがいないbreak(この場合はsmallestColor->end())ベクトル内の次の位置にmovingNodeイテレータの前進を作るforループのうちの前にやります!foundNodeの状態を確認してください。この場合、ネストされたループから壊れているので、breakを2回実行する必要があります。

オプションで、条件を満たすイテレータを別の変数に格納して、ループの外側で操作することができます(forループで繰り返すものとは異なります)。あなたが問題の潜在的な供給源として強調スニペットについて

destinationClass->push_back(*movingNode);はにdestinationClassNodemovingNodeそのイテレータポイントのコピーを入れています。つまり、Nodeのコピーコンストラクタが呼び出されます。 Nodeはユーザ定義のコピーコンストラクタを持たないため、コンパイラはすべてのメンバのコピー値を自動的に生成しますので、idの値をコピーする必要があります(もちろん、正しいイテレータがpush_backの場合はコピーしてください)。もちろん、再配置しているノードの元のコピーはeraseで破壊されますが、これは新しいコピーには影響しません。

+0

これは問題を正確に解決しました。どうもありがとうございます。 – redmoncoreyl

関連する問題