私は現在、遺伝的アルゴリズムを与えられた単語に向かって「生成する」または「進化させる」ようにしています。問題は、たとえそれが突然変異し続けるべきであっても、それが完全にこの言葉に到達することはなく、高すぎるフィットネススコアで停止することである。遺伝的アルゴリズムが突然変異を停止する
相続人例:
ユーザ入力= "HelloWorldの" 500世代= "XelgoWorfd"
後
そして、私はそれが変異続けない理由見当もつかない。通常、文字列内のいくつかの文字をランダムに変更するだけで再開します。
私は非常にいくつかの助けを喜んでいるでしょう。
ここでステップの説明による基本的なステップがあります:
- がゴール単語に比べてスコア完全にランダム化された文字列
- フィットネスを計算して20本の染色体を作成します。 (Asciiの数の差を計算する)
- 最高のスコアで2つの染色体を仲立ちします。
- 一部の染色体をランダムに変異させる(ランダムな文字列を変更する)
- 弱い集団の90%を殺し、それをエリート染色体(現時点で最良の適合度を持つ染色体)で置き換える。
- すべてを繰り返します。
だからここに私のアルゴリズムの中で最も重要な方法:
public Chromoson[] mate(string gene) {
Console.WriteLine("[MATING] In Progress : "+gens+" "+gene);
int pivot = (int)Math.Round((double)gens.Length/2) - 1;
string child1 = this.gens.Substring(0, pivot) + gene.Substring(pivot);
string child2 = gene.Substring(0, pivot) + this.gens.Substring(pivot);
Chromoson[] list = new Chromoson[2];
list[0] = new Chromoson(child1);
list[1] = new Chromoson(child2);
Console.WriteLine("[MATING] Pivot : "+pivot);
Console.WriteLine("[MATING] Children : "+child1+" "+child2);
return list;
}
public void mutate(float chance, int possiblyChanges) {
if (random.Next(0,101) <= chance) return;
int changes = random.Next(0, possiblyChanges + 1);
//int index = (int) Math.Floor((double)random.Next() * this.gens.Length);
for (int i = 0; i < changes; i++) {
int index = random.Next(0, 13);
StringBuilder builder = new StringBuilder(gens);
int upOrDown = random.Next(0, 101);
if (upOrDown <= 50 && (int)builder[index] > 0 && chars.Contains(Convert.ToChar(builder[index] - 1)))
builder[index] = Convert.ToChar(builder[index] - 1);
else if (upOrDown >= 50 && (int)builder[index] < 127 && chars.Contains(Convert.ToChar(builder[index] + 1)))
builder[index] = Convert.ToChar(builder[index] + 1);
else
mutate(chance, possiblyChanges);
gens = builder.ToString();
}
Console.WriteLine("[MUTATING] In Progress");
}
public void calculateCost(string otherGens)
{
int total = 0;
for (int i = 0; i < gens.Length; i++)
{
total += (((int)gens[i] - (int)otherGens[i]) * ((int)gens[i] - (int)otherGens[i])) * (i*i);
}
Console.WriteLine("[CALCULATING] Costs : " + total);
this.cost = total;
}
迷惑メールにタグを付けないでください。 – shmosel
ランダムである可能性がありますか? if(random.Next(0,101)<= chance)return; –
これは完全なコードではありません。 [最小、完全、検証可能な例](http://stackoverflow.com/help/mcve)を投稿してください。 – bc004346