Matlabで2点交差を実装する最良の方法は何ですか? 2 点クロスオーバーについては、こちらで説明しています。私のアプリケーションでは、リストをどこでも分割できないことに注意してください。それらは 4 つずつグループ化されているため、リスト (染色体)を分割できる場所は 4、8、12などです (これは、私のアプリケーションが線形遺伝的プログラミングの問題であるためです)。
私はこれを試しましたが、4 で割り切れない数の要素を持つ染色体を取得することがあるため、機能しません。それを機能させる方法を理解するのに助けが必要です。
function newPopulation = Crossover( population, p )
newPopulation = population;
for i=1:2:length(population)
if p < rand
[newPopulation{i}, newPopulation{i+1}] = PerformCrossover( newPopulation{i}, newPopulation{i+1} );
end
end
end
function [newChromosome1, newChromosome2] = PerformCrossover( c1, c2 )
l1 = length(c1)/4;
l2 = length(c2)/4;
i1 = 4*sort( randperm( l1, 2 ) )-[3 4];
i2 = 4*sort( randperm( l2, 2 ) )-[3 4];
newChromosome1 = [ c1( 1:l1<i1(1) ) c2( i2(1):i2(2) ) c1( 1:l1>i1(2) ) ];
newChromosome2 = [ c2( 1:l2<i2(1) ) c1( i1(1):i1(2) ) c2( 1:l2>i2(2) ) ];
end
編集。混乱があるようです。私のコードで記述されているクロスオーバーのバージョンが必要です。このコードでは、各染色体のセグメントの長さが同じではありません。これは、スワップを行うときに染色体のサイズを変更することを意味します。これは意図されたものです。詳細な説明は、McMa へのコメントにあります。