prufer编码
:用n-2位自然数唯一的表达出一棵n个节点的生成树。而且两者相互可逆,即给定一颗生成树的连接方式,可以唯一确定这棵树的编码。
Cayley定理
:n个顶点的完全图中有
n
n
−
2
n^{n-2}
nn−2棵不同的生成树。
显然这两个描述具有很强的联系,n个顶点编号为1,2,…n。有n-2个位置,随便填入1,2,…n中的一个数,这有 n n − 2 n^{n-2} nn−2种可能。
所以我们要证明Cayley定理
,只需要证明prufer编码
。
prufer编码
1.设有如下生成树(n=6),根据prufer编码,我们只需要6-2=4位就可以对这颗生成树完成编码。
2.树中叶子的概念。
3.prufer编码的步骤。
(i)在我们这里,1是标号最小的叶子。
(ii)1与2相连,将2写入编码,删去边(1,2)。此时编码为2,删去边(1,2)如下图。
(i)在我们这里,3是标号最小的叶子。
(ii)3与2相连,将2写入编码,删去边(3,2)。此时编码为2,2,删去边(3,2)如下图。
(i)在我们这里,4是标号最小的叶子。
(ii)4与6相连,将6写入编码,删去边(4,6)。此时编码为2,2,6,删去边(4,6)如下图。
(i)在我们这里,5是标号最小的叶子。
(ii)5与2相连,将2写入编码,删去边(5,2)。此时编码为2,2,6,2,删去边(5,2)如下图。
一个关键的地方来了,接下来停止编码,我们发现,只用了n-2位编码。一个疑惑当然是:现就就停止编码,能否根据编码2,2,6,2还原出这颗生成树呢?
4.解码步骤
(i)初始
(ii)
(ii)重复
(ii)重复,注意到,这步很关键,P的补集中加了一个6,因为6从P中删除后,不再在P中出现了,所以这个时候要加入到P的补集中。
(ii)重复
(iii)结束,P为空集,连接P的补集中的顶点。
至此,prufer编码的解码也已经完成了,且这个数和之前的树一模一样,即是可逆的。
所以一个prufer编码也唯一确定一颗树,反之亦然。
回到标题:
这个编码和遗传算法会有什么关系?我们知道在使用遗传算法求解一个完全图的最小生成树过程中:两个母体需要进行交叉来繁殖后代,而两个母体都是生成树,这个时候我们需要一个编码,比如采用我们这里的prufer编码:
P1:1234456
P2:1232144
假设第4位交叉了一下,有了两个孩子。
C1:1232456
C2:1234144
这两个孩子根据prufer编码显然还是对应一个生成树,然后我们就可以直接物竞天择,看一下这两个孩子有没有进化得更好。
以上编码是方便的,但是你采用其他编码就非常不方便了。因为交叉之后,可能不是一颗合法的生成树,比如可能有环。
例如采用边直接编码:
P1:(1,2),(1,3),(1,4)
P2:(2,3),(1,2),(3,4)
以上对应于:
交叉后,假设第二条边交叉,那么得到:
P1:(1,2),(1,2),(1,4)
P2:(2,3),(1,3),(3,4)
显然,一不注意,P1就违规了,因为P1中没有顶点3,不是最小生成树!
补充,这个prufer编码还有一个特点,就是编码所对应的生成树中,顶点v的度数d等于编码中顶点v出现次数加1。