質問

Javaで均一なクロスオーバーを実装するのに苦労しています。これがアルゴリズムです。

// Uniform Crossover
public void UniformCrossover(Individual indi) {
  if (RVGA.rand.nextDouble() < pc) {

  // Put your implementation of uniform crossover here

  // For each gene create a random number in   [0,   1].
  // If the number is less than   0.5, swap the gene values in
  // the parents for this gene; other wise, no swapping .
}

自分ができるということがわかっている int tmp そして、乱数を保存します if tmp < 0.5 ループを続けます

私はどうにかして助けてくれませんでした!

これは私の1つのポイントクロスオーバーの例であるため、私の形式を知っています。

クロスオーバー1つのクロスオーバーポイントが選択され、染色体の開始からクロスオーバーポイントまでのバイナリ文字列が1つの親からコピーされ、残りは2番目の親からコピーされます。

親1 =染色体と親2 = indi。

私は両親を子供たちに変えています

public void onePointCrossover(Individual indi) {
    if (SGA.rand.nextDouble() < pc) {
        int xoverpoint = SGA.rand.nextInt(length);

        int tmp;
        for (int i=xoverpoint; i<length; i++){
            tmp = chromosome[i];
            chromosome[i] = indi.chromosome[i];
            indi.chromosome[i] = tmp;
        }   
    }   
}
役に立ちましたか?

解決

均一なクロスオーバーを使用すると、一般的にやりたいことは次のとおりです。

For each gene
  if rand()<0.5
    take from parent a
  else
    take from parent b

あなたは、あなたの一点の例から、両方の親を同時に変更しているように思われます。その場合:

For each gene
  if rand()<0.5
    leave both parents alone
  else
    swap chromosome[i] with indi.chromosome[i] as before
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top