【发布时间】:2014-12-07 12:18:06
【问题描述】:
在 Matlab 中实现两点交叉的最佳方法是什么?两点交叉描述为here。请注意,在我的应用程序中,我无法在任何地方拆分列表。它们按四个分组,因此允许拆分列表的位置(染色体)是 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
EDIT. 似乎有些混乱。我想要我的代码描述的交叉版本。在此代码中,每个染色体的片段长度不同。这意味着我在进行交换时会改变染色体的大小,这是有意的。 McMa 的评论中提供了进一步的解释。
【问题讨论】:
-
随机数的生成成本很低。为什么不通过 round(rand(1)*length(chromosomeLength)/4)*4 生成第一个随机数,然后通过相同的公式生成第二个并检查是否等于过去的?
-
@ASantosRibeiro 为什么会比我现在做的更好?
-
完全一样(相同的随机生成器和相同的意识形态),只是方式不同,因为我不明白你的问题,因为它已经优化了。
-
此外,问题似乎与优化无关,但当您创建“newChromosome1”和“newChromosome2”时,您的代码似乎不正确
标签: matlab genetic-algorithm crossover