深圳大学算法导论实验三 回溯法—地图填色问题

一.实验目的

(1)    掌握回溯法算法设计思想。

(2)    掌握地图填色问题的回溯法解法。

二、实验内容

(1) 对下面这个小规模数据,利用四色填色测试算法的正确性。

(2) 对附件中给定的地图数据填涂。

(3) 随机产生不同规模的图,分析算法效率与图规模的关系(四色)。

三、实验步骤、结果与分析

1对下面这个小规模数据,利用四色填色测试算法的正确性。

1

       如上图1所示,用时15ms,该地图总共需要4种颜色,其中color1Greencolor2Pinkcolor3Blackcolor4Brown。验证了填色算法的正确性。

2对附件中给定的地图数据填涂。

  1. 地图一:450顶点,5714边。

对于第一个地图数据,我采用了12种颜色可以用860ms跑出结果(图2)。题目要求使用5种颜色跑出结果,但是我即使剪枝了也只能跑12种颜色。推测是由于回溯状态设置不正确,因本人能力有限实现不了。

2

  1. 地图二:450顶点,8169边。

对于第二个地图数据,题目要求使用15种颜色,但是我15种颜色跑不来结果,我觉得应该跑不通。我采用了18种颜色就可以立马跑出结果了,用时460ms

3

  1. 地图三:450顶点,8260边。

对于第三个地图数据,题目要求使用25种颜色,我采用了25种颜色可以立马跑出结果了,用时297ms

4

4、回溯法的优化

(1)变量的选择

       选点时我采用的是,先选度最大的,然后再选颜色可选最少的,这样减少了回溯的可能。考虑现在染色到了第i个点,我打算染第j种颜色。

(2)变量值的选取

       判断取出的点相邻的点颜色是否冲突,不冲突则选取。

(3)剪枝

向前探查,意义为早点发现没有希望的结点,及时进行剪枝,因为如此可以避免无效的搜索,从而大大减少了搜索空间。具体做法是:每次给某个结点涂色的时候,就把他相邻的结点的可用颜色剔除掉该节点的颜色,当发现相邻结点可用颜色为0时,就说明当前结点这种涂色是没有希望成功的,因此需要剪回溯。

如果我发现j颜色在之前从未被染过色,而现在场上还有x种以前从未染过色的颜色。那么一旦点i染j色是局部合法的,那么我可以认为在一种全局合法的方案下染j色和其他从未出现过的颜色是等价的,于是方案数直接乘以x返回即可。

可以想到,对于第一个染色的点一定满足这个条件,于是第一个点不用搜索而直接在方案数上乘以颜色个数。然后推广一下就可以对所有点都做类似优化。

四、实验心得

·通过本次实验,掌握了基本的回溯方法如何实现。

·通过对回溯方法的改进,掌握了如何优化回溯法,减少搜索空间。

·优化回溯法主要有三个策略:

  1. 变量的选取

  1. 变量值的选取

  1. 剪枝

​​​​​​​

  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值