0

2本の染色体を組み換え(交差)させたい(遺伝的アルゴリズム)。これは私の疑似コードです。どこに問題がありますか?

popuは 50 * 10 の行列です。(私の母集団)
popsize =50を
選択すると、1*50 の行列になります (フィットネス エバリュエーターで最適な個人を選択します) 。

function pop = recombin( popu,selected )
    global popsize;
    pop=zeros(50,10);
    for i=1:popsize/2
        rc=randi([1,10]);
        for j=1:10
            if(j<=rc)
                pop(i,j)=popu(selected(i),j);
                pop(i+25,j)=popu(selected(i+25),j);
            else
                pop(i,j)=popu(selected(i+25),j);
                pop(i+25,j)=popu(selected(i),j);
            end
            %keyboard
        end
    end
end

私のコードは (構文的に) 正しく動作します。しかし、これが一般的なアルゴリズムで2つのクロムソームを組み合わせる正しい方法かどうかはわかりません:(

4

1 に答える 1

0

あなたの質問に対する簡単な答えは次のとおりです。コードは (ほぼ) 正しく、1 点クロスオーバーを実行します。

コードは、各個体の最初の要素が決して交換されないという意味で、ほぼ正しいです: rc は [1, 10] にあり、スワップは がjrc よりも厳密に大きい場合であるため、この手段は常に(ではなく)pop(i, 1)に割り当てられます。popu(selected(i), 1)popu(selected(i + 25), j)

これは望ましい機能かもしれませんが、望ましくない境界効果のように見えます。代わりに次の行を使用することで防ぐことができます: rc = randi([0,10]);.

したがって、ビルのコメントを考慮すると、コードは次のようになります。

function pop = recombin(popu, selected)
    [popsize, dimension] = size(popu);
    pop = zeros(popsize, dimension);
    halfpopsize = floor(popsize / 2)

    for i = 1:halfpopsize
        rc = randi([0, 10]);
        pop(i, :) = [popu(selected(i), 1:rc), popu(selected(i + halfpopsize), rc + 1:end)];
        pop(i + halfpopsize, :) = [popu(selected(i + halfpopsize), 1:rc), popu(selected(i), rc + 1:end)];
    end
end
于 2012-11-06T17:22:33.570 に答える