0

「均一クロスオーバー」遺伝的演算子を実装する必要があります。

編集:私は、番号が両方の個人に表示される場合、(ランダムな交換のために)重複するのが正常であることに気づきました。だからIIはこれを追加しました:

            if(anyDuplicate(p0_genome,minIndex) || anyDuplicate(p1_genome,minIndex)){
                                //rollback: swap again
                                swap(p0_genome,p1_genome,i);
                            }

しかし、それでも重複が作成されます(ほとんどの場合、minIndexの位置にある遺伝子(サイクルから除外されます!!!))。もちろん、関数anyDuplicateをテストしましたが、非常にうまく機能します。

このコードで試してみました

> Note: Individual 1 and 2 have the same length but a different number
> of valid bits.
> 
> Foe example: genotype length (of both individuals) = 10 ,
> representation as numbers from 1 to 10 without anyone repeated,the
> start delimiter is 1 and the end delimiter should be 2. Not used genes
> are = 0
> 
> individual 1(p0_genome) = {1,4,5,3,2,0,0,0,0,0}
> individual 2(p1_genome) = {1,4,6,3,8,2,0,0,0,0}

出力を決定します:

Individual 1(p0_genome): **1** <some genes ALL DIFFERENTS> **2** 0,0,0,.....
Individual 2(p1_genome): **1** <some genes ALL DIFFERENTS> **2** 0,0,0,.....

メインコード:

            int indexOfLastP0 = findLast(p0_genome,gl); // last valid bit (the one = 2) of first individual
            int indexOfLastP1 = findLast(p1_genome,gl); // last valid bit (the one = 2) of second individual

            int minIndex = Math.min(indexOfLastP0,indexOfLastP1); // last valid bit of the "smaller" of the inviduals

    // Building sons
  /* exchange bit without considering delimiters bit (1 and 2)
   and according to the smaller individual */
            int threshold = 0.60;

    for (int i=1; i<minIndex; i++) {
        if (Math.Random()>threshold) {
            swap(p0_genome,p1_genome,i);
        }
    // when exiting the loop the remaining of genes remain the same

スワップコード:

    public void swap(int[] array1, int[] array2 ,int i){
        int aux=array1[i];
        if (array2[i]!=2){
        array1[i]=array2[i];
                }
        if (aux!=2){
        array2[i]=aux;
                }            

anyDuplicate()コード:

 public boolean anyDuplicate(int[] genoma,int min){
        for (int i=0;i<=min;i++){
            for (int j=0;j<=min;j++){
               if (genoma[i]==genoma[j] && i!=j){
                  return true;
               }
            }
        }
        return false;
    }        

findLastコード:

    public int findLast(int[] mgenome,int genotypeLength){
        int k=1; // 1 element is not considered
        while (k<genotypeLength && mgenome[k]!=0){
            k++;
        }
        return k-1; // **I also tried returning k;**
    }

問題は、私が両方の個人で多くの重複番号を取得することです

また、「父」の「複製」(親から子への配列コピー)を試してみました。

    // Creating sons genotypes
    int [] s0_genome = new int[gl];
    int [] s1_genome = new int[gl];
    // Building sons
          int threshold = 0.60;
    for (int i=0; i<minIndex; i++) {
        if (Math.Random()>threshold)) {
            s0_genome[i] = p1_genome[i];
            s1_genome[i] = p0_genome[i];
        }
        else {
            s0_genome[i] = p0_genome[i];
            s1_genome[i] = p1_genome[i];
        }
             for (int i=minIndex; i<10; i++) {
               // copy what's left
            s0_genome[i] = p0_genome[i];
            s1_genome[i] = p1_genome[i];
        }

私は何か間違ったことをしていますか?ヒントありがとうございます!

4

1 に答える 1

0

さて、一度スワッピングしてみてください。結果のゲノムのいずれかに重複する値が含まれている場合は、もう一度スワッピングしてみてください。2回目の試行後も重複がある場合は、あきらめます。これは効率的ではなく、ゲノムが長いほど、これが機能する可能性は低くなります。

解決策A:スワップされた値がまだターゲットゲノムにない場合にのみ、スワップを試みることができます。これにより、次のようなスワップ関数が得られます。

public void swap(int[] array1, int[] array2 ,int i){
    int aux=array1[i];
    if (array2[i]!=2 && !Arrays.asList(array1).contains(array2[i]){
    array1[i]=array2[i];
            }
    if (aux!=2 && !Arrays.asList(array2).contains(array1[i]){
    array2[i]=aux;
            }

これに伴う問題は、異なる位置に同じ値を含むゲノムを完全にロックする可能性があることです。あなたの例では、

g1 = {1, 4, 8, 9, 3, 2, 0, 0}
g2 = { 1, 3, 9, 8, 4, 2, 0, 0}

有効なスワップはまったくなく、クロスオーバーは元のゲノムを返します。

解決策B:交換する値がターゲットゲノムにすでに存在する場合は、ターゲットゲノムでその遺伝子のインデックスを見つけ、それも交換します。これは、ゲノムの大部分でスワップを必要とするようにカスケードする可能性があり、もちろん、i=jの場合は発生しないはずです。

種類は、目的の動作によって異なります。上記の例のゲノムの場合、成功したクロスオーバーはどのようになりますか?

于 2012-06-02T17:24:21.597 に答える