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

在图示父代个体编码串中随机选择一个交叉中点,在交叉中点两侧进行基因交换,同时考虑交换后结果产生基因重复的情况,并做出相应调整,即保证新个体均为有效个体。父代中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:染色体下标索引中间变量
然后跑一下试试看吧!