1、最小生成树
用n-2位自然数唯一地表达出一颗n个节点的生成树,而且交叉变异仍是一棵生成树。
有三个约束:
- 该树覆盖所有的顶点
- 概树是连通的
- 该树是一棵树,既没有回路
2、编码(prufer数编码)
- 1、设节点i是标号最小的叶子
- 2、若i 与j 相连,令j 是编码中的第一个数字,删去边(i, j)
- 3、转步骤1,直到剩下一条边为止
3、解码
- 1、令Prufer数中的节点集为P,不包含在P中的节点集为P非
- 2、若i为P非中标号最小的节点,j为P上最左边数字,连接边(i, j),并从P非去掉i,从P中去掉j ,若j 不再在P中,将j 加入P非中
- 3、重复步骤2,直到P为空,P非中剩下(s, r)
- 4、连接(s, r)
4、适应函数
e v a l ( T ) = C / W ( T ) eval(T)=C/W(T) eval(T)=C/W(T)其中C是一个常数, W ( T ) = ∑ e i j ∈ T W i j W(T)=\sum_{e_{ij}\in T}W_{ij} W(T)=eij∈T∑Wij为生成数的权值
5、选择策略
&emsp依然是经典的轮盘赌选择方法
6、遗传算子
交叉
&emsp采用二进制编码中的单点交叉
变异
&emsp在[1, n]产生某一位随机整数,代表父代中的某一位
7、修复策略
针对度约束的最小生成树问题,由于度的约束,需要使用修复程序使得约束条件能够得到满足。
修复程序:
若个体B中的一个顶点v违反了度的约束,即v在B中出现的次数大于 d-1 (d是度的约束),则将多余的v随机替换为其他出现次数小于 d-1 的顶点,就可以满足约束条件。
8、伪代码
#遗传算法求解最小生成树
# date:2020年3月6日
# Author: Chauncy_xu
Begin
t = 0;
initializae(P(t));
Repair(P(t));
evaluate(P(t));
while (max_gen) do
P1(t) = parent_select(P(t));
P2(t) = crossover(P1(t));
P(t+1) = mutate(P2(t));
repair(P(t+1));
evaluate(P(t+1));
t +=1;
end while
retuen best_solution
end