Grefenstette编码的思想

今天粗略学习了遗传算法,对于基因采用二进制表示、染色体采用一串二进制数表示(如11000100)还是比较容易理解的。但是,在TSP问题(旅行商问题,traveling
salesman problem)中,需要通过遗传算法求解较优的旅行路径,如何对基因和染色体进行建模?比较合理的思路是采用城市排列作为染色体,例如在5个城市的情况下,1、2、3、4、5表示按照1->2->3->4->5->1的顺序进行遍历。但是,遗传算法中比较关键的步骤有交叉(Crossover)、变异(Mutation)等操作,如果对两个城市排列染色体进行交叉,就会大概率出现路径中多次出现相同城市,同时缺少部分城市的情况,这样交叉所得的染色体就不是合格的染色体了,如何解决这个问题?

这时,Grefenstette编码就出场了。

网上的资料说,所谓的GrefenStette编码就是用所选队员在未选(不含淘汰)队员中的位置,如:8 15 2 16 10 7 4 3 11 14 6 12 9 5 18 13 17 1对应8 14 2 13 8 6 3 2 5 7 3 4 3 2 4 2 2 1。这句话太TM拗口了,怎么理解?

在TSP问题中,我们可以构造3个序列,A表示当前尚未旅行的城市编号序列,P表示实际的旅行序列,G代表GrefenStette编码序列。

假设TSP问题中有10个城市,编号分别是1到10,我们来看如何求取旅行序列P=[8, 9, 2, 1, 3, 4, 6, 5, 7, 10]的编码序列G。


步骤


序号


1


2


3


4


5


6


7


8


9


10


初始条件


A


1


2


3


4


5


6


7


8


9


10


P












G












STEP1(选择8在A中的位置,A中删除8)


A


1


2


3


4


5


6


7


8


9


10


P


8


G


8


STEP2(选择9在A中的位置)


A


1


2


3


4


5


6


7


9


10


P


8


9


G


8


8


STEP3(选择2在A中的位置)


A


1


2


3


4


5


6


7


10


P


8


9


2


G


8


8


2


STEP4(选择1在A中的位置)


A


1


3


4


5


6


7


10


 


P


8


9


2


1


G


8


8


2


1


STEP5(选择3在A中的位置)


A


3


4


5


6


7


10


 


 


P


8


9


2


1


3


G


8


8


2


1


1


STEP6(选择4在A中的位置)


A


4


5


6


7


10


 


 


 


P


8


9


2


1


3


4


G


8


8


2


1


1


1


STEP7(选择6在A中的位置)


A


5


6


7


10


 


 


 


 


P


8


9


2


1


3


4


6


G


8


8


2


1


1


1


2


STEP8(选择5在A中的位置)


A


5


7


10


 


 


 


 


 


P


8


9


2


1


3


4


6


5


G


8


8


2


1


1


1


2


1


STEP9(选择7在A中的位置)


A


7


10


 


 


 


 


 


 


P


8


9


2


1


3


4


6


5


7


G


8


8


2


1


1


1


2


1


1


STEP10(选择10在A中的位置)


A


10


 


 


 


 


 


 


 


P


8


9


2


1


3


4


6


5


7


10


G


8


8


2


1


1


1


2


1


1


1

所以,我们最终求得的P所对应的GrefenStette编码序列就是G=[8, 8, 2, 1, 1, 1, 2, 1, 1, 1]。

结合GrefenStette编码的定义以及上面这个表的计算过程,如何进行GrefenStette编码就很清楚了。

在TSP问题中,我们实际上是采用遍历路径的GrefenStette编码序列作为遗传算法的染色体,那么,为什么采用GrefenStette编码进行交叉、变异就不会产生无效的染色体呢?

从GrefenStette编码的过程我们可以发现,对于G的任何元素i而言,G[i]的最小值min是1(选中元素在A中排列在第1个),最大值max是citiyCount-(i-1)(也就是排在A的最后)。所以,对于任意两个染色体而言,在局部交叉后,交换基因的位置没有发生变化,其仍然属于区间[min, max],因而必然是合法的,所以交叉不会产生非法的染色体。

那么变异的情况呢?

在对某个基因G[i]而言,假定变异的概率是ri(介于0和1之间),那么可以设置其值为min+ri*(max-min)即可,变异后的值仍然是合法的,也就不会产生非法的染色体了。

所以,采用GrefenStette编码就很好地解决了TSP问题中染色体定义的问题,使得我们能够使用遗传算法解决TSP问题。

时间: 2024-11-17 13:50:51

Grefenstette编码的思想的相关文章

哈夫曼编码算法思想总结

1构建哈夫曼树. (利用队列的数据结构,不断获取最小的两个,退出队列并使之成为新节点的左右子树.然后将新节点插入队列.如此循环……) 根据用户输入的字符串,统计每个字符出现次数.设置权重.建立队列.队列中的节点是二叉树的节点(有左指针,和右指针). 建新的结点,左右指针指向队列的最后两个(那两个退出队列).然后插入队列.如此循环,就可以建立哈夫曼树. 2为每个字符编码. 节点的左为0,右为1. code(*node) { //叶节点 如果(node->left==null && no

Base64编码字符串时数据量明显变大

那就是当把byte[]通过Convert.ToBase64String转换成Base64编码字符串时数据量明显变大 Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码.它将需要编码的数据拆分成字节数组.以3个字节为一组.按顺序排列24位数据,再把这24位数据分成4组,即每组6位.再在每组的的最高位前补两个0凑足一个字节.这样就把一个3字节为一组的数据重新编码成了4个字节.当所要编码的数据的字节数不是3的整倍数,也就是说在分组时最后一组不够3个字节.这时在最后一组填充1到

网络编程中的编码问题汇总

应用程序中的编码问题让人头疼,一直是这样,今天下午就被数据库编码错误搞的头疼不已. 那么,就决心好好总结一下编码带来的问题,争取让自己对整个编码体系有一个清晰的认识. 从编码问题的产生说起 我们知道,计算机是美国人发明的,人家的英语体系总从来就只有26个英文字母和一些数字.特殊字符等,为了储存文字信息,于是使用了最早的ascii码进行字符编码.而后来由于计算机的普及,多国语言文字变得重要起来,于是多语言的特性成为了计算机的必备,各国进行各国的国家标准编码,中国的便是GB2312(1980年),而

哈夫曼树及编码

介绍哈夫曼编码之前先介绍一下哈弗曼树: 哈夫曼树:哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树.所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度 为叶结点的层数).树的带权路径长度记为WPL= (W1*L1+W2*L2+W3*L3+...+Wn*Ln) ,N个权值Wi(i=1,2,...n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,...n).可以证明哈夫曼树的WPL是最小的. 哈夫曼树的构

C++哈夫曼树编码和译码的实现

一.背景介绍: 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近. 二.实现步骤: 1.构造一棵哈夫曼树 2.根据创建好的哈夫曼树创建一张哈夫曼编码表 3.输入一串哈夫曼序列,输出原始字符 三.设计思想: 1.首先要构造一棵哈夫曼树,哈夫曼树的结点结构包括权值,双亲,左右孩子:假如由n个字符来构造一棵哈夫曼树,则共有结点2n-1个:在构造前,先初始化

Base64编码解码原理

一.编码规则 Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码.它将需要编码的数据拆分成字节 数组.以3个字节为一组.按顺序排列24 位数据,再把这24位数据分成4组,即每组6位.再在每组的的最高位前 补两个0凑足一个字节.这样就把一个3字节为一组的数据重新编码成了4个字节.当所要编码的数据的字节数不是 3的整倍数,也就是说在分组时最后一组不够3个字节.这时在最后一组填充1到2个0字节.并在最后编码完成后在 结尾添加1到2个 "=". 例:将对ABC进行BA

基于实数编码(离散杂交+自适应变异),线性排名选择的遗传算法(附代码)

我们来看一个很简单的小问题f=x1+x2+x3+x4,x1.x2.x3.x4是大于等于10小于等于100的实数,求f的最大值. 这个小学生就能解决的问题我今天打算用遗传算法来解决,你可能说这不是智障吗?但是其实这只是一个小例子,因为用同样的方法,你可以解决f=x1^x2*x3^x4/x2^x1*x4^x3甚至是更复杂的问题,下面就来详细讲一讲. 基于对遗传算法的一般性了解,我就不再赘述详细过程(其实是因为上一篇写过了懒得再写一遍),只谈谈实数编码和线性排名选择策略. 实数编码顾名思义就是用实数进

音视频编码基础知识

本文转载自 http://blog.csdn.net/ljzcom/article/details/7336258 ,如有需要,请移步查看. Technorati 标签: 音视频 编码 基础知识 --------------------------------分割线开始----------------------------------------------- 编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中

VB实现Base64 编码

作者:iamlasong 一.编码规则 编码规则网上很多,为了文章的完整性,这里简单的叙述一下.Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码.它将需要编码的数据拆分成字节数组.以3个字节为一组.按顺序排列24 位数据,再把这24位数据分成4组,即每组6位.再在每组的的最高位前补两个0凑足一个字节.这样就把一个3字节为一组的数据重新编码成了4个字节.当所要编码的数据的字节数不是3的整倍数,也就是说在分组时最后一组不够3个字节.这时在最后一组填充1到2个0字节.并在最