2016-10-22 2 views
0

私は遺伝的プログラミングアルゴリズムを使いこなしています。どのように再現するかを選択する方法を代用したり改良したりすることで、私がどのように栄養補給し、より良いものを再現できるかを知りたいと思います。現在、私が使用する方法は、次のようになります。私のルーレット選択方法よりも優れた子孫の栄養価値を上げるにはどうすればいいですか?

function roulette(population) 
    local slice = sum_of_fitnesses(population) * math.random() 
    local sum = 0 
    for iter = 1, #population do 
     sum = sum + population[iter].fitness 
     if sum >= slice then 
      return population[iter] 
     end 
    end 
end 

しかし、私は私の人口が一定値以上である平均適応度に到達するために得ることができないと私はそれがために、よりフィット感のメンバーと、再生少なくフィットのメンバーだ心配とこうして彼らの弱い遺伝子を広げ続けています。

どのようにして自分のルーレット選択方法を改善できますか?または、私は全く異なるフィットネス比例セレクターを使用する必要がありますか?

+0

人口の規模は?フィットネス値の範囲は? – user3386109

+0

@ user3386109サイズ100の場合、0〜1の範囲で約0.81で停止します。交差率は0.7、突然変異率は0.001 – user6245072

+0

人口から最低50を削除します。残りの50の場合は、フィットネスを指数関数的にします。 'adjusted_fitness = exp(フィットネス* 10)'。 – user3386109

答えて

1

ここにいくつかの問題があります。

個人のフィットネスに基づいて複製する確率を選択しているため、使用しているフィットネス機能は小さな違いを誇張する必要があります。たとえば、フィットネスが81から80に低下した場合、この変化はおそらくシステムの騒音の範囲内にあり、進化とは大きく異なることはありません。選択圧力が単に強くないため、一連の小さな変更を行う必要がある場合は、非常に高い適応度に上昇することは確かにほとんど不可能です。

この問題を解決する方法は、トーナメント選択のようなものを使用することです。それは最も単純な形で、あなたが生まれるべき別の個体を選択するたびに、K個のランダム個体(Kは既知であり、「トーナメントサイズ」)を選ぶ。あなたは各個人のフィットネスを計算し、最高のフィットネスが複製されている人は誰でも計算します。フィットネスの差が81対80か10000対2の場合、それは単に最高の適応度を取るため、重要ではありません。

ここで問題は:あなたはKを何に設定すべきですか? Kは選択の強さと考えることができます。それを低く(たとえばK = 2)設定すると、多くの低フィットネスの人は幸運になり、他の低フィットネスの人と競い合うことができます。あなたは多様性がありますが、セクションはほとんどありません。反対に、Kを高く設定すると(K = 100など)、母集団の中で最も高い適応度の1つを選択し、母集団の平均が最大に近づくようにしますが、人口の多様性を低下させます。

ここでの具体的なトレードオフは、特定の問題によって異なります。何が起こるかを見るために、いくつかの異なる問題を持つ異なるオプション(元のアルゴリズムを含む)を試すことをお勧めします。たとえば、すべての問題を試してください。潜在的な解はビット列で、フィットネスは単純に1の数です。あなたの選択が弱い場合(元の例のように、またはK = 2の場合)、完璧なオールワンソリューションに決して到達しないことがわかります。

なぜ、常に高いKを使用しないのですか?よく、4つの連続したブロック(または8つ、または多くの場合)のブロックに表示されない限り、それらが突然非常に肯定的になる場合には、マイナスの問題を考慮してください。そのような問題は「欺く」ことです。つまり、良いものを見つけるために悪いと思える解決策を探求する必要があります。選択の強さを高く設定すると、最終的な突然変異のために3つを集めることは決してありません。

あなたが見たいかもしれないトーナメント選択を使用するより高度な技術がたくさんあります。たとえば、時間の経過とともにKを変えたり、母集団内であっても、低いKを使用する人や高いKを使用する人を選択します。より良いアルゴリズムを構築する予定がある場合は、さらに読む価値があります。

+0

非常に良い答えは、ありがとう! – user6245072

関連する問題