www.pudn.com > powerflow-genetical.gorithm.rar > crossover.m, change:2008-12-13,size:1550b


function popnew=crossover(pop,pcro,num,length) 
% 交叉函数 两点交叉 
%遗传算法子程序 
% 交叉(crossover),群体中的每个个体之间都以一定的概率 pcro 交叉,即两个个体从各自字符串的某一位置 
% (一般是随机确定)开始互相交换,这类似生物进化过程中的基因分裂与重组。例如,单点交叉,假设2个父代个体x1,x2为: 
% x1=0100110 
% x2=1010001 
% 从每个个体的第3位开始交叉,交又后得到2个新的子代个体y1,y2分别为: 
% y1=0100001 
% y2=1010110 
%两点交叉,随机产生两个交叉点,例如,2和5,器件的基因进行交叉 
% x1=0100110 
% x2=1010001 
% 从每个个体的第3位开始交叉,交又后得到2个新的子代个体y1,y2分别为: 
% y1=0010101 
% y2=1100010 
% 这样2个子代个体就分别具有了2个父代个体的某些特征。利用交又我们有可能由父代个体在子代组合成具有更高适合度的个体。 
% 事实上交又是遗传算法区别于其它传统优化方法的主要特点之一。 
%pcro为交叉概率 
%pop=randint(16) 
%n=16; 
%pcro=0.75; 
%length=16; 
 
k=1; 
t=0; 
while (k<=num) 
    rk=rand(1); 
    if rk<pcro; 
        b(t+1)=k; 
        t=t+1; 
    end 
    k=k+1; 
    if t==2 
        pos=fix(rand(1)*length)+1;              %随机产生交叉点 
        poo=fix(rand(1)*length)+1; 
        if pos<=poo 
           for t=pos:poo 
               c=pop(b(1),t); 
               pop(b(1),t)=pop(b(2),t);          %对交叉点之间的编码进行交换 
               pop(b(2),t)=c; 
           end 
        else 
           for t=poo:pos 
               c=pop(b(1),t); 
               pop(b(1),t)=pop(b(2),t);          %对交叉点之间的编码进行交换 
               pop(b(2),t)=c; 
           end 
        end 
        t=0; 
    end 
end 
popnew=pop;