無限の猿の定理(https://en.wikipedia.org/wiki/Infinite_monkey_theorem)のようなものをシミュレートするために、ランダムな文字の集団を生成し、最終的には入力された文字列に着地するJavaプログラムを作成しようとしています。私が抱えている問題は、私がそれをテストしているので、開始人口のすべてが0のフィットネスレベルを持つので、何も自然選択プロセス中に交配プールに追加されません。ここにプロジェクトが伴うことがあります。遺伝的アルゴリズムフィットネススコアの問題
ターゲット:文字列 "こんにちは"
突然変異率: 0.01
人口最大: 100 DNAは、各遺伝子についてのchar []配列を含むオブジェクト。ここで
フィットネスを計算するための私の関数である。
public void calcFitness(String target){
double score = 0.0;
for(int i = 0; i < this.genes.length; i++){
if(this.genes[i] == target.charAt(i)){
score++;
}
}
this.fitness = score/this.genes.length;
}
私は遺伝的プログラミングに新しい、私が間違っているのかわからないです、どんな手助けがいただければ幸いと遺伝的プログラミングについてのヒントや洞察力も希望感謝する。
EDIT
ここで選択プロセスのためのコードです:
public void naturalSelection(){
ArrayList<DNA> selection = new ArrayList<>();
Random rand = new Random();
String child = "";
DNA[] newPop = new DNA[popMax];
for(int i = 0; i < population.length; i++){
for(int j = 0; j < population[i].getFitness(); j++){
selection.add(population[i]);
}
}
for(int i = 0; i < selection.size(); i++){
int parentSelect = rand.nextInt(selection.size());
DNA parent1 = selection.get(parentSelect);
child = parent1.split(true);
parentSelect = rand.nextInt(selection.size());
DNA parent2 = selection.get(parentSelect);
child += parent2.split(false);
newPop[i] = new DNA(child);
}
double mutation = rand.nextDouble();
if(mutation < this.mutationRate){
this.population = swapMutation(newPop);
calcFittest();
}
else{
this.population = newPop;
calcFittest();
}
}
変異が発生した場合、スワップ変異は、2つのランダムな文字を入れ替えます。
このコードは問題ではないようです。 – Daedric
問題の理解に問題があります。 '' Hello''が 'genes'に存在するかどうか確認しようとしていますか? – 17slim
再現の確率は、フィットネススコアに比例する必要があります。また、あなたの場合は、他の個人の適応度に比例します。すべてがゼロ点を持っている場合は、すべてが同じ再現の可能性があります。しかし、より高いスコアの個人ははるかに高い可能性があります。あなたの問題はフィットネスのスコアを計算することではなく、それがどのように再現する個人を選択するのに使われているかのようです。 – hatchet