2016-04-01 10 views
4

遺伝的アルゴリズムでLangermannの関数とトーナメント選択を実装する方法を理解する上で問題があります。私はthisをLangermannの関数のリファレンスとして持っていますが、Cの値はどこから来ているのか分かりません。私はXとYしか持たないので、Cの値は常に定数です。遺伝的アルゴリズム:Langermannの関数とトーナメントの選択

トーナメントの選択に関しては、自分の人口のうち3人を無作為に選んで適性を比較したいと思います。 Langermannの関数でフィットネス値を生成できるようになると、各フィットネス値をベクトルに格納します。次に、ベクトルから3つの一意のランダム要素を選択し、それらを互いに比較したいと思います。どのように同じ数字を使用せずにベクトルから3つのユニークなランダム要素を選択しますか?

ご協力いただきましてありがとうございます。

答えて

4

Lagermann function

C値は常に数字の定数設定されていますか? mcAため

提案値はMolga & Smutnicki (2005)によって与えられるものです。

cは、定数ベクトルです(他の値も使用できます)。

この機能は通常(x, y) ∈ [0, 10] x [0, 10]で評価されます。重要度がcによって決定されるm最小値を提示する。それらはコサインの積によって変調されており、それはそれらに振動性を与える。

すべての複雑な式について、Langermann関数を変換する最も良い方法は、より単純な部分式から始めることです。主な和のために今

const double A[5][2] = {{3.0, 5.0},{5.0, 2.0},{2.0, 1.0},{1.0, 4.0},{7.0, 9.0}}; 
const double c[5] = {1.0, 2.0, 5.0, 2.0, 3.0}; 
const unsigned d = 2; 

double s = 0.0; 
for (unsigned j = 0; j < d; ++j) 
    s += std::pow(x[j] - A[i][j], 2.0); 

const double pi = 3.1415926535897932; 
const unsigned m = 5; 

double ret = 0.0; 
for (unsigned i(0); i < m; ++i) 
{ 
    // calculate `s` 

    ret += c[i] * std::exp(-s/pi) * std::cos(pi * s); 
} 

retは、関数の値が含まれてい

は、2つの同一の "内部" の加算があります。あなたは同じ番号を使用せずに、ベクターからの3つのユニークなランダムな要素を選択するにはどうすればよい


単純なアプローチは:乱数を生成し、それがすでに使用されているかどうかを確認し、すでに使用されていた場合は、未使用のものを見つけるまで別の番号を生成するだけです。

これは、do ... while()ループの単純なシーケンスです。

人口のサイズが小さい場合や人工的に制限されている場合(10/15人)、これはかなり高価になる可能性があります。

多くの選択肢は、x [j]が、この表現でいるものUnique random numbers in an integer array in the C programming language

+0

に記述されていますか? – Ploxzx

関連する問題