文章目录
前言
本篇记录的是算法课的一次实验报告,这次实验很有意思,笔者断断续续花了两周时间做实验、与大佬交流经验和写报告。最终实验报告99分 ,得到了老师的肯定,所以请放心阅读。本篇只讲思路,不含代码,也没有图(懒得画),想直接copy的可以离开啦
文章共分为4个部分,分别是回溯法介绍,地图填色问题介绍,剪枝策略的设计,算法效率分析。
一、回溯法介绍
做实验前首先要搞懂什么是回溯法,多看看多学学怎么设计剪枝策略之类的知识对做实验有很大帮助
回溯算法是一种遍历问题的整个解空间树,以找到所有可行解或一个最优解的算法。随着问题规模增大,朴素回溯法的效率越来越低。而剪枝策略可以剪掉找不到可行解的分支,减少搜索,提高搜索效率。因此设计好的剪枝策略时提高回溯算法效率的关键。
二、地图填色问题介绍
搞懂回溯法肯定也要搞懂什么是地图填色问题吧,关键不在于理解填色规则的字面意思,而在于要把问题转化为数学问题,便于算法的设计(这点挺重要的,少了报告就不够完整。很多科目的老师们都强调把问题转化为数学问题再编程实现,有点数模的味道)
地图填色问题是指使用不同的颜色为地图不同区域着色,使得具有共同边界的区域颜色不同。由于地图填色与地图区域内部无关,因此每个区域可以看成一个顶点,顶点间用边连接表示这两个区域相邻。于是地图填色问题就转化成了图(数据结构意义的图)填色问题。
三、剪枝策略的设计
设计剪枝策略前,得先整个朴素回溯法的代码,然后设计了新的剪枝策略就往这个代码里加(朴素回溯法比较简单,就不贴代码啦)
然后就是设计剪枝策略,每设计完一个都要利用小规模问题测试正确性,然后尝试三个地图le450_5a、le450_15b、le450_25a的填色,列出填色情况和算法运行效率。这三个图的问题分别为使用5种颜色填涂450个区域,使用15种颜色填涂450个区域,使用25种颜色填涂450个区域,这三个图都不是平面图,平面图只用4种颜色就可以填涂了,这3个图至少得用题目要求的颜色数才能填涂。 有的策略可能跑不出地图le450_15b,因为这个图很怪,非常怪,笔者不清楚它的具体区域分布,但听大佬说,这个图有一个较复杂的完全子图,一般的剪枝策略都要在里面回溯非常多次。(设计完策略然后直接用小规模问题测试正确性是必要的,不保证算法正确性那这个算法再快都是虚的。)
当然你也会问,随便整个小规模问题测的是正确的,但算法其实是有问题的,那是正常的。因为你只测试了若干个小规模问题该算法的正确性,要严格说明算法是正确的,得写个严格的数学证明。笔者菜,就不写证明糊弄人了。
下面列出了较多的策略,有成功的也有失败的,希望能对你有所启发
策略1:顶点搜索顺序
(1)策略提出原因
搜索顺序对算法效率的影响肯定是有的啦,这个策略是很经典的剪枝策略