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のサンプルです。どんな助けもありがとうございます。
これは問題を正確に解決しました。どうもありがとうございます。 – redmoncoreyl