一.实验目的
(1) 掌握回溯法算法设计思想。
(2) 掌握地图填色问题的回溯法解法。
二、实验内容
(1) 对下面这个小规模数据,利用四色填色测试算法的正确性。
(2) 对附件中给定的地图数据填涂。
(3) 随机产生不同规模的图,分析算法效率与图规模的关系(四色)。
三、实验步骤、结果与分析
1、对下面这个小规模数据,利用四色填色测试算法的正确性。
图1
如上图1所示,用时15ms,该地图总共需要4种颜色,其中color1—Green,color2—Pink,color3—Black,color4—Brown。验证了填色算法的正确性。
2、对附件中给定的地图数据填涂。
- 地图一:450顶点,5714边。
对于第一个地图数据,我采用了12种颜色可以用860ms跑出结果(图2)。题目要求使用5种颜色跑出结果,但是我即使剪枝了也只能跑12种颜色。推测是由于回溯状态设置不正确,因本人能力有限实现不了。
图2
- 地图二:450顶点,8169边。
对于第二个地图数据,题目要求使用15种颜色,但是我15种颜色跑不来结果,我觉得应该跑不通。我采用了18种颜色就可以立马跑出结果了,用时460ms。
图3
- 地图三:450顶点,8260边。
对于第三个地图数据,题目要求使用25种颜色,我采用了25种颜色可以立马跑出结果了,用时297ms。
图4
4、回溯法的优化
(1)变量的选择
选点时我采用的是,先选度最大的,然后再选颜色可选最少的,这样减少了回溯的可能。考虑现在染色到了第i个点,我打算染第j种颜色。
(2)变量值的选取
判断取出的点相邻的点颜色是否冲突,不冲突则选取。
(3)剪枝
向前探查,意义为早点发现没有希望的结点,及时进行剪枝,因为如此可以避免无效的搜索,从而大大减少了搜索空间。具体做法是:每次给某个结点涂色的时候,就把他相邻的结点的可用颜色剔除掉该节点的颜色,当发现相邻结点可用颜色为0时,就说明当前结点这种涂色是没有希望成功的,因此需要剪回溯。
如果我发现j颜色在之前从未被染过色,而现在场上还有x种以前从未染过色的颜色。那么一旦点i染j色是局部合法的,那么我可以认为在一种全局合法的方案下染j色和其他从未出现过的颜色是等价的,于是方案数直接乘以x返回即可。
可以想到,对于第一个染色的点一定满足这个条件,于是第一个点不用搜索而直接在方案数上乘以颜色个数。然后推广一下就可以对所有点都做类似优化。
四、实验心得
·通过本次实验,掌握了基本的回溯方法如何实现。
·通过对回溯方法的改进,掌握了如何优化回溯法,减少搜索空间。
·优化回溯法主要有三个策略:
- 变量的选取
- 变量值的选取
- 剪枝