6

私はアルゴリズムに取り組んでいます。このアルゴリズムでは、サイズkの母集団からn個の個体を選択する必要があります。ここで、kはnよりはるかに大きいです。すべての個人が適応度の値を持っているため、選択ではより高い適応度の値を優先する必要があります。しかし、私は単に最高のn人の個人を選びたくはありません。悪い人にもチャンスがあるはずです。(自然な選択)

そこで、母集団内の最小および最大のフィットネス値を見つけることにしました。だから、どんな個人も持っているだろう

p =(現在-最小)/(最大-最小)

選ばれる確率ですが、すべてを繰り返して、サイコロを振って、確率が成り立つ場合は1つを選ぶことはできません。そうすると、n人以上の個人になってしまうからです。リストをシャッフルして、最大n人の個人を取得するまで前から繰り返すことができますが、リストの最後まで素晴らしいものを見逃す可能性があります。

また、残りの母集団のサイズがnに達するまで、複数のパスを実行することもできます。しかし、これはより良いものを大いに支持し、私が述べた素朴な選択方法に収束するかもしれません。

何か提案、またはそのような選択プロセスへの言及はありますか?あなたが何かを参照することができれば、私は関連する統計的方法についていくつか読むことができます。

ありがとう。

4

1 に答える 1

6

ルーレットホイール選択を使用します。基本的な考え方は、確率サイズに関連してルーレット盤の領域を割り当てることです。

ルーレット盤

次に、それを何度も回転させてn、必要な個人を選択します。

rubyでのサンプル実装:

def roulette(population, n)
  probs = population.map { |gene| gene.probability } # TODO: Implement this
  selected = []

  n.times do 
    r, inc = rand * probs.max, 0 # pick a random number and select the  individual 
                     # corresponding to that roulette-wheel area
    population.each_index do |i| 
      if r < (inc += probs[i])
        selected << population[i]
        # make selection not pick sample twice
        population.delete_at i
        probs.delete_at i
        break
      end
    end
  end
  return selected
end

注:Rubyハッカーの場合、Rubyismが増えるとコードがはるかに短くなる可能性がありますが、アルゴリズムをできるだけ明確にしたかったのです。

于 2011-03-09T09:40:32.237 に答える