matlab-Grefenstette的编码与解码

在遗传算法中
执行交叉变异得到正确的子代结果
是十分重要的一步

为了更好的交叉变异
有人发明了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城市:

编码截图:
在这里插入图片描述

解码截图:
在这里插入图片描述

可以看到完全将随机产生的原始信息还原回来了。

完。
加油,奥利给!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值