あなたは、ウェーブレット変換を実行するまでエラーがわからないと言いますが、それは問題ありません。GA が生成するすべての個体に対してウェーブレット変換を実行するだけです。エラーが少ない個人は、より健康であると見なされ、より高い確率で生存します。これは非常に遅いかもしれませんが、少なくとも概念的には、それがアイデアです。
エンコードされた値のペアを含む染色体データ型を定義しましょう。1 つは周波数用で、もう 1 つは減衰パラメーター用です。今のところ、それらがどのようにエンコードされているかについてあまり心配する必要はありません。必要に応じて、2 つの double の配列であると想定してください。重要なのは、染色体から値を取得する方法があることだけです。今のところ、それらを名前だけで参照しますが、double の配列などとしてバイナリで表すこともできます。Chromosome 型のもう 1 つのメンバーは、その適合度を格納する double です。
明らかにランダムな周波数と減衰値を生成できるので、たとえば 100 個のランダムな染色体を作成しましょう。フィットネスの設定方法はまだわかりませんが、問題ありません。最初はゼロに設定してください。実際のフィットネス値を設定するには、100 個のパラメーター設定ごとにウェーブレット変換を 1 回実行する必要があります。
for Chromosome chr in population
chr.fitness = run_wavelet_transform(chr.frequency, chr.damping)
end
これで、100 個の可能なウェーブレット変換があり、それぞれに計算された誤差があり、 というセットに格納されていますpopulation
。残っているのは、集団のより適切なメンバーを選択して繁殖させ、集団のより適切なメンバーと子孫が次世代に生き残ることを可能にすることです.
while not done
offspring = new_population()
while count(offspring) < N
parent1, parent2 = select_parents(population)
child1, child2 = do_crossover(parent1, parent2)
mutate(child1)
mutate(child2)
child1.fitness = run_wavelet_transform(child1.frequency, child1.damping)
child2.fitness = run_wavelet_transform(child2.frequency, child2.damping)
offspring.add(child1)
offspring.add(child2)
end while
population = merge(population, offspring)
end while
select_parents
、do_crossover
、mutate
、およびhere のような個々のステップを実行するにはさまざまな方法がありますがmerge
、GA の基本的な構造はほとんど同じままです。新しい子孫ごとに新しいウェーブレット分解を実行するだけです。