111,112、...、133,211,212、...、233,311,312などのバリエーションを生成する関数があります。 ...、333.生成されたシーケンスの長さは常に辞書の長さに一致します。 4シンボルの場合、1111から4444になります。C++:繰り返しのバリエーションの再帰関数。異なる文字の数で並べ替え
これは、グラフの色付けのためにブルートフォースアルゴリズムで行われます。できるだけ色の違う正しいシーケンスを見つけることを試みています。つまり、12343と12321の両方が解決策である場合は、後者を好むでしょう。
今のところ、すべてのシーケンスが正しいかどうかを確認して、最良の結果をプロセスに保存します。それは本当に良いコードではありません。
教授は、特定の順序でバリエーションを生成する関数を作成するように私に依頼しました。これらのシーケンスは、次のような異なる数の量によって順序付けされるべきです:111,222,333; 112、113、121、...、323;この場合、121が正しいと分かった場合は、それが最良の解決策であることを既に知っているので、停止します。
できるだけ多くのシーケンスチェックをスキップして、コードがより速く実行されるようにすることです。助けてください:)
を今、私はこのコードを使用します
init関数を
std::vector<int> res; //contains the "alphabet"
res.reserve(V);
for (int i = V - 1; i >= 0; i--) {
res.push_back(i);
}
std::vector<int> index(res.size());
std::vector<int> bestresult(V); //here goes the best answer if it's found
for (int i = V - 1; i >= 0; i--) {
bestresult.push_back(i);
}
int bestcolors = V;
permutate(res, index, 0, bestresult, bestcolors);
result = bestresult;
permutate:
void Graph::permutate(const std::vector<int>& s, std::vector<int>& index, std::size_t depth, std::vector<int>& bestres, int &lowestAmountOfColors)
{
if (depth == s.size()) {
//doing all needed checks and saving bestresult here;
return;
}
for (std::size_t i = 0; i < s.size(); ++i) {
index[depth] = i;
permutate(s, index, depth + 1, bestres, lowestAmountOfColors);
}
}
がどのように私は、これらの機能を変更することができますか?
質問があります。色の間に違いはありますか?もし '111'がチェックされていたら、 '222'を全く考慮すべきでしょうか?グラフの色付けについては、色を入れ替えると答えが同じになると思います。したがって、ケースnの場合、考慮すべき置換は、1,2、... nの少なくとも1つを含まなければならない。 –
私はそうではありません、あなたは正しいです。私は言及したかったが、私は英語に堪能ではない:) – JonathanX64
(少なくとも1つはそれぞれ) –