算法分析与设计实验四回溯法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四 回溯法
实验目的
1. 掌握回溯法的基本思想方法;
2. 了解适用于用回溯法求解的问题类型,并能设计相应回溯法算法;
3. 掌握回溯法算法复杂性分析方法,分析问题复杂性。
预习与实验要求
1. 预习实验指导书及教材的有关内容,掌握回溯法的基本思想;
2. 严格按照实验内容进行实验,培养良好的算法设计和编程的习惯;
3. 认真听讲,服从安排,独立思考并完成实验。
实验设备与器材
硬件:PC 机
软件:C++或Java 等编程环境
实验原理
回溯法是最常用的解题方法,有“通用的解题法”之称。当要解决的问题有若干可行解时,则可以在包含问题所有解的空间树中,按深度优先的策略,从根节点出发搜索解空间树。算法搜索至解空间树的任一结点时,总是先判断该结点是否肯定不包含问题的解。如果肯定不包含,则跳过对以该结点为根的子树的搜索,继续查找该结点的兄弟结点,若它的兄弟结点都不包含问题的解,则返回其父结点——这个步骤称为回溯。否则进入一个可能包含解的子树,继续按深度优先的策略进行搜索。这种以深度优先的方式搜索问题的解的算法称为回溯法。它本质上是一种穷举法,但由于在搜索过程中不断略过某些显然不合适的子树,所以搜索的空间大大少于一般的穷举,故它适用于解一些组合数较大的问题。
回溯法也可以形式化地描述如下:假设能够用n 元组()n i x x x x ,,,,,21 表示一个给定问题P 的解,其中i i S x ∈。如果n 元组的子组()i x x x ,,,21 ()n i <满足一定的约束条件,则称为部分解。如果它已经是满足约束条件的部分解,则添加11++∈i i S x 形成新的子组()121,,,,+i i x x x x ,并检查它是否满足约束条件,若仍满足则继续添加22++∈i i S x ,并以此类推。如果所有的11++∈i i S x 都不满足约束条件,那么去掉1+i x ,回溯到i x 的位置,并去掉当前的i x ,另选一个i i S x ∈',组成新的子组()i x x x ',,,21 ,并判断其是否满足约束条件。如此反复下去,直到得到解或者证明无解为止。
实验内容
以下几个问题选做一项:
1.实现n皇后问题的回溯算法,作时空复杂性分析。
2.实现分派问题的回溯算法,作时空复杂性分析。问题描述如下:给n个人分派n件工作,COST(i, j)为把工作j分配给第i个人的成本,要求在给每个人分派一件不同工作的情况下使总成本最小。
3.写一进行连续邮资问题求解的回溯算法,上机实现该算法并作时空复杂性分析。
4.实现哈密尔顿回路(旅行售货员问题)的回溯算法。
要求:
(1)选择合适的数据结构来表示问题;
(2)确定出对问题的解空间树的深度优先搜索停止的条件(即开始回溯的条件);
(3)根据回溯法的基本原理,写出求解问题的伪码算法;
(4)编制C++或JA V A等高级语言程序实现伪码算法;
(5)上机运行程序,验证算法的正确性,作时空复杂性分析。
实验报告
1.描述回溯法的基本原理和形式化描述;
1.写出用回溯法实现n皇后问题、分派问题、邮票问题、哈密尔顿回路问题的伪码算
法,写出算法所用到的主要数据结构,简要画出各问题的解空间树以及搜索过程,
确定搜索停止的条件(即开始回溯的条件);
2.得出结果,并写出算法的时间复杂性和空间复杂性。
3.详细填写完成实验的收获和得失,实验过程中遇到的问题、解决的办法、实验心得
以及对该实验的建议和意见。