图染色的禁忌算法

判断冲突边的数量:

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

 

转载于:https://www.cnblogs.com/dreammaker-K/p/9007379.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值