在遗传算法中
执行交叉变异得到正确的子代结果
是十分重要的一步
为了更好的交叉变异
有人发明了Grefenstette编码
Grefenstette的编码定义如下:
既是:通过已有的顺序(非常重要,编码解码都靠它),
产生一个访问序列,
且每访问完一个点,就需要把点从已有序列删除,形成新的序列
作为新的访问前置条件
例如已有顺序
1,2,3,4,5
编码集:4,2,1,2,1
通过编码集得到的解码集:
解码集:4,2,1,5,3
注意编码集最后一位永远都是以1结束
以种群数量S 与 生存环境数量M为研究对象,
产生一个1——M的序列
加上s就是:
产生一个SxM的原始已有序列矩阵,每一行为一个种群对于的已有序列
再根据Grefenstette的编码规则:
访问生成序列下标并删除对应点
得到编码程序:
%Grefenstette的编码与主函数
s=3;%种群数量
M=5;%城市数量
pop=zeros(s,M);
for i=1:s
%产生1-t的随机数列
pop(i,1:M)=randperm(M);
end
fprintf('原始信息(一行为一个信息)');
pop
% 编码
grePop=zeros(s,M); %原始种群Grefenstette编码的结果
%Grefenstette的编码
for i=1:s
%一行代表一个生存环境
temp=[1:1:M];
for j=1:M
loc=find(pop(i,j)==temp);
grePop(i,j)=loc(1);
temp(loc(1))=[];
end
end
fprintf('编码结果:');
grePop
又根据编码结果来计算解码集:
得到编码程序:
grePop是已知的编码集矩阵
s,M对应于编码程序的s,M
%Grefenstette的解码
function GrefenstetteDecode(grePop,s,M)
%解码
for i=1:s
%初始数据1--M
temp=[1:1:M];
for j=1:M
%解码集
%temp(grePop(i,j))
pop(i,j)=temp(grePop(i,j));
%一行代表一个生存环境
%去掉temp(grePop(i,j))
temp(grePop(i,j))=[];
end
end
pop
举例:
2种群,4城市:
编码截图:
解码截图:
可以看到完全将随机产生的原始信息还原回来了。
完。
加油,奥利给!