码迷,mamicode.com
首页 > 编程语言 > 详细

图染色的禁忌算法

时间:2018-05-08 14:35:20      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:邻居   编号   最好   效率   随机选择   移动   AC   current   相同   

判断冲突边的数量:

  遍历图的邻接矩阵,搜索边,得到边两端的顶点编号。然后再利用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

 

图染色的禁忌算法

标签:邻居   编号   最好   效率   随机选择   移动   AC   current   相同   

原文地址:https://www.cnblogs.com/dreammaker-K/p/9007379.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!