2

在 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 的评论中提供了进一步的解释。

4

3 回答 3

2

保留所有内容,因为它已经优化,并更正此:

i1 = 4*sort( randperm( l1, 2 ) )-[3 3];
i2 = 4*sort( randperm( l2, 2 ) )-[3 3];

newChromosome1 = [ c1( 1:i1(1) ) c2( i2(1)+1:i2(2)-1 ) c1( i1(2):end ) ];
newChromosome2 = [ c2( 1:i2(1) ) c1( i1(1)+1:i1(2)-1 ) c2( i2(2):end ) ];
于 2014-10-13T13:11:48.407 回答
0

使用randperm()没有混合参数的单一应该可以工作:

function [newChromosome1, newChromosome2] = PerformCrossover( c1, c2 )

    len=floor(min(length(c1),length(c2))/4);

    xOver=4*sort(randperm(len,2));

    newChromosome1=[c1(1:xOver(1)),c2(xOver(1)+1:xOver(2)),c1(xOver(2)+1:end)];
    newChromosome2=[c2(1:xOver(1)),c1(xOver(1)+1:xOver(2)),c2(xOver(2)+1:end)];
end

那将是可被 4 整除的段的 2 点交叉。

另外xOver=4*sort(randperm(len-1,2));将排除randperm()返回最大值的可能性,该最大值len将导致较小向量仅发生 1 点交叉

于 2014-10-13T10:56:05.943 回答
0

我不确定您是否正确理解 randperm 函数。此外,2 点交叉通常不限于长度可被 4 整除的染色体。

恕我直言,最简单的方法是绘制两个随机数来定义您的交叉点并存在于 [1,chromiumLength] 范围内。不仅仅是简单地交换这些点之间的信息。我认为您不需要 randperm 函数...

% use randi(n) that gives a random integer in the range [0,n]
% create the first crossover point pos1 in the interval [1, chromosomelength-1]
% create the second crossover point pos2 in the interval [pos1+1, chromosomeLength)]

newChromosome1 = [ c1( 1 : pos1-1 ) ) c2( pos1 : pos2-1 ) c1( pos2 : chromosomeLength ) ];
newChromosome2 = [ c2( 1 : pos1-1 ) ) c1( pos1 : pos2-1 ) c2( pos2 : chromosomeLength ) ];

此外,您可能会处理 pos1 获得值 1 的情况,因为 c1( 1 : 1-1 ) 会导致异常

于 2014-10-13T06:33:19.070 回答