我想重组(交叉)两条染色体(遗传算法)。 这是我的伪代码,我的问题在哪里?
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个色谱组的正确方法:(
答案 0 :(得分:0)
您的问题的简短答案是:代码(几乎)正确,它执行单点交叉。
代码几乎是正确的,因为每个人的第一个元素永远不会被交换:因为rc在[1,10]中而且交换是在j
严格大于rc时,这意味着{ {1}}始终分配给pop(i, 1)
(而不是popu(selected(i), 1)
)。
这可能是一个理想的功能,但看起来像一个不受欢迎的边框效果。可以通过使用此行来阻止它:popu(selected(i + 25), j)
。
考虑到Bill的评论,代码看起来像这样:
rc = randi([0,10]);