0

我想重组(交叉)两条染色体(遗传算法)。这是我的伪代码,我的问题在哪里?

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 个染色体的正确方法:(

4

1 回答 1

0

对您的问题的简短回答是:代码(几乎)正确,它执行单点交叉。

这段代码几乎是正确的,因为每个个体的第一个元素永远不会被交换:因为 rc 在 [1, 10] 中并且交换是 whenj严格大于 rc,所以这意味着pop(i, 1)总是分配给popu(selected(i), 1)(而不是popu(selected(i + 25), j))。

这可能是一个想要的特性,但看起来像是一个不想要的边框效果。可以通过使用此行来防止它:rc = randi([0,10]);.

所以考虑比尔的评论,代码看起来像这样:

function pop = recombin(popu, selected)
    [popsize, dimension] = size(popu);
    pop = zeros(popsize, dimension);
    halfpopsize = floor(popsize / 2)

    for i = 1:halfpopsize
        rc = randi([0, 10]);
        pop(i, :) = [popu(selected(i), 1:rc), popu(selected(i + halfpopsize), rc + 1:end)];
        pop(i + halfpopsize, :) = [popu(selected(i + halfpopsize), 1:rc), popu(selected(i), rc + 1:end)];
    end
end
于 2012-11-06T17:22:33.570 回答