图染色的禁忌算法
Posted dreammaker-k
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图染色的禁忌算法相关的知识,希望对你有一定的参考价值。
判断冲突边的数量:
遍历图的邻接矩阵,搜索边,得到边两端的顶点编号。然后再利用vertex_color【】数组来查询两个顶点的染色,相等则记录,否则查询下一条边。
其中vertex_color[],是在初始化solution的时候就初始化的。存储的是每个顶点的染色。
选择移动:
move,需要分为禁忌移动和非禁忌移动两类,之所以要记录非禁忌移动,是为了解禁机制--避免好的解被禁止从而使算法的效率大打折扣。移动,是对于顶点的,所以外循环是对于顶点的一个循环遍历,在内循环中首先要判断这个点是否位冲突点--通过adjacent_color_table[vertex][current_color]是否等于0来判断,若等于0,则表明周围没有和他颜色相同的邻居,也就是不用处理;否则,需要对其进行处理。处理的方法就是计算 Δ(u,i,j)=M[u][j]-M[u][i],然后需要判断move属于禁忌move还是非禁忌move--直接通过tabutenure_table判断,存储move的最小delta、tabu_delta。
【在判断move的类别的时候,对于current_color==move_color的这一判断直接pass,不处理这种情况】
对于禁忌move,需要有两个判断条件:1.tabu_delta < delta;2.tabu_delta+f<best_f --移动后的解的冲突边数量要比历史最好的解的冲突边数量少;
对于非禁忌move,就是随机选择一个move;
然后就是,实施move。这里主要是修改更新一些信息:vertex_color[] 、 adjacent_color_table 、 tabu_tenure_table 、 f ---conflict_edges 、 best_f
以上是关于图染色的禁忌算法的主要内容,如果未能解决你的问题,请参考以下文章