【遗传算法整数交叉】

遗传算法整数交叉

一、简介

遗传算法及整数编码的内容我就不介绍了(偷个懒),可以参考其他博主的文章。该整数交叉代码来自我本科毕设的部分内容,意在分享自己的思路,也欢迎各位大佬指教。代码注释都在代码中,还是直接举个例子吧,一对整数交叉的基因如下图所示:

在图示父代个体编码串中随机选择一个交叉中点,在交叉中点两侧进行基因交换,同时考虑交换后结果产生基因重复的情况,并做出相应调整,即保证新个体均为有效个体。父代中X1与Y1在交叉中点两侧进行交叉,X1中的3号基因交换后的结果应该是6,但由于X1本身的交叉中点中已包含6号基因,则3号基因的结果就取本身交叉中点中6号基因对应Y1的2号基因,如此查找交换即可得到无重复基因的X2。

二、代码
% @brief  Chromosome crossover based on integer coding
% @author wszeng
% @param  X1:Chromosome1
% @param  X2:Chromosome2
% @retval chromosomes after crossing X3 and X4
%--------------test--------------------------------------------%
clear,clc;
X1 = [1 2 3 4 5 6 7 8 9];
X2 = [9 8 7 6 5 4 3 2 1];
%--------------test--------------------------------------------%
%function [X3,X4]=cross_operation(X1,X2)
%随机生成交叉点
n1 = floor(rand(1,1)*length(X1)+1);
n2 = floor(rand(1,1)*length(X2)+1);
if(n1 > n2)
    temp = n1;
    n1 = n2;
    n2 = temp;
end

X3=X1;X4=X2;                                          %初始化后代
for i=1:size(X1,2)                                    %遍历染色体长度
    if(sum(ismember(n1:n2,i)) == 1)
        continue;                                     %保留交叉中点
    end
    %交叉X2
    if(sum(ismember(X2(1,n1:n2),X1(i))) == 1)         %交叉中点外端与交叉点有基因冲突    
        
        index = find(ismember(X2(1,n1:n2),X1(i)));    %X1(i)X2(1,n1:n2)的位置
        X4(i) = X1(n1 + index - 1);                   %交叉点内无冲突
        
        while(sum(ismember(X2(1,n1:n2),X1(n1 + index - 1))) == 1) 
           index1 = find(ismember(X2(1,n1:n2),X1(n1 + index - 1)));
           index = index1;
           X4(i) = X1(n1 + index1 - 1);               %交叉中点内有冲突
        end
    else
        X4(i) = X1(i);                                %内外无冲突,直接交换
    end

    %交叉X1
    if(sum(ismember(X1(1,n1:n2),X2(i))) == 1)         %交叉中点外端与交叉点有基因冲突
        
        index = find(ismember(X1(1,n1:n2),X2(i)));    %X2(i)X1(1,n1:n2)的位置
        X3(i) = X2(n1 + index - 1);                   %交叉中点内无冲突
       
        while(sum(ismember(X1(1,n1:n2),X2(n1 + index - 1))) == 1) 
           index1 = find(ismember(X1(1,n1:n2),X2(n1 + index - 1)));
           index = index1;
           X3(i) = X2(n1 + index1 - 1);                %交叉中点内有冲突
        end        
    else
        X3(i) = X2(i);                                 %内外无冲突,直接交换
    end  
end

%%变量说明
%n1:交叉中点上界
%n2:交叉中点下界
%temp: 互换n1、n2中间变量
%index: 染色体下标索引变量
%index1:染色体下标索引中间变量

然后跑一下试试看吧!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值