在 Matlab 中实现两点交叉的最佳方法是什么?此处描述了两点交叉。请注意,在我的应用程序中,我无法在任何地方拆分列表。它们按四个分组,因此允许拆分列表(染色体)的位置是 4、8、12 等等(这是因为我的应用程序是线性遗传编程问题)。
我试过这个,但它不起作用,因为有时我得到的染色体有许多不能被四整除的元素。我需要帮助弄清楚如何使它工作。
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 的评论中提供了进一步的解释。