被Grefenstette编码给骗啦

     今晚上网无意中浏览到了遗传算法,并知道其算法中有对染色体的Grefenstette编码规则,对它很好奇想知道他是如何利用编码规则来避免出现一些无意义的染色体的。

     本来以为这是一比较深奥的编码,于是就上网查资料。才发现上面的说法很不好理解的,而且对于编码的解码也有点难以一下就总结出来。下面是搜到的两段关于Grefenstette编码的解说:

(1)所谓的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.

摘自 http://hi.baidu.com/zzuzm/blog/item/efcb9d459a2fbe3786947313.html

 

(2)在求解TSP问题时,1985年,Grefenstette[9]等提出了基于顺序表示(ordinal representation)的遗传基因编码方法。顺序表示是指所有城市依次排列构成一个顺序表(order list),对于一条旅程,可以依旅行经过顺序处理每个城市,每个城市在顺序表中的顺序就是一个遗传因子的表示,每处理完一个城市,从顺序表中去掉该城市。处理完所有城市以后,将每个城市的遗传因子表示连接起来,就是一条旅程的基因表示。例如,顺序表C = (1,2,3,4,5,6,7,8,9),一条旅程为5-1-7-8-9-4-6-3-2。按照这种编码方法,这条旅程的编码为表L=(5 1 5 5 5 3 3 3 2 1)。

摘自: 凹丫丫(www.oyaya.cn) 详细出处参考:http://www.lwhelp.com/onews.asp?id=3596

      看到第一种解释的时候一头雾水,不知在说什么(在知道了最终是如何编码的时候,才明白那句话在说什么)。第二种解释,第一眼看的时候让人很害怕,感觉这的确是很深奥的东西,然后就想肯定是看不懂的啦。不过最终还是第二种解释让我最终知道Grefenstette这编码的原理。

      很幸运咯,前几天刚刚很有兴致地对序数法求全排列进行了较细致的琢磨。其实第二种说了一大通,最终还是可以看作全排列序数的一种变型。

      如果对于旅程A=(a1,a2,a3,a4,a5,a6,a7,a8,a9)定义b[i]=a[i]-(a1到a[i-1]中小于ai的元素个数),那么(b1,b2,b3,b4,b5,b6,b7,b8,b9)就是旅程A的Grefenstette编码。

      其实对于所有可能的旅程构成的集合来说是给定城市编号的全排列的子集,因此对应于Grefenstette编码我们也可以定义出其类似的编码,例如:

(1)定义b[i]=(a[i+1]到a[n]中比a[i]大的元素个数)

(2)定义b[i]=(a1到a[i-1]中大于ai的元素个数)

(3)定义b[i]=(a1到a[i-1]中小于等于ai的元素个数)

     不难证明由上述几种方法对于不同的旅程所确定的(b1,b2,b3,b4,b5,b6,b7,b8,b9)都是不相同的,因此给定不同的(b1,b2,b3,b4,b5,b6,b7,b8,b9)我们都能得到一个唯一的旅程。从全排列的角度去看这个就明显得很多了。

     实际上,对于1到n这n个自然数组成的全排列,任意给定一个0到n!-1的自然数我们都可以得到一个唯一的排列,也就是说这是一个一一映射,而这个一一映射的定义就是通过上面类似Grefenstette编码方式来定义的。即对于1到n的任意一排列p,我们定义一个非负整数序列(b1,b2,…,bn),这个序列的获取可以通过上面给出的任意一种方式都可以。(但利用(3)建立排列与自然数对应关系的时候,应采用不同的方式),并定义

η=∑b(i)*(i-1)!,i=1,2,…,n.这样我们就得到p--(b1,b2,…,bn)--η这样一个一一映射的关系,而建立排列与自然数间的一一映射关系的桥梁就是非负整数序列(b1,b2,…,bn),当然也包括非负整数序列(b1,b2,…,bn),但对于不同的非负整数序列(b1,b2,…,bn)求η的方式也要有所不同,例如上面(3)的序列定义求η就要改为η=∑[b(i)-1]*(i-1)!,i=1,2,…,n. 正是由于这种一一映射关系的保证,由Grefenstette编码给出的旅程的染色体编码将都是有意义的,也就避免了无意义的染色体。

     Grefenstette编码并不神秘,也不深奥,只要懂得了序数法求全排列的方式,类似Grefenstette编码可以定义出许多种。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值