1、实现0/1背包问题的LC分枝—限界算法,要求使用大小固定的元组表示动态状态空间树,与0/1背包问题回溯算法做复杂性比较。
2、实现货郎担问题的分枝—限界算法并与货郎担问
题的动态规划算法做复杂性比较比较。
3、实现带有期限的作业排序的分枝—限界算法并与
带有期限的作业排序贪心算法做复杂性比较。
(任选一个完成)
实验六分枝—限界算法
实验目的
1.掌握分枝—限界的基本思想方法;
2.了解适用于用分枝—限界方法求解的问题类型,并能设计相应动态规划算法;
3.掌握分枝—限界算法复杂性分析方法,分析问题复杂性。
预习与实验要求
1.预习实验指导书及教材的有关内容,掌握分枝—限界的基本思想;
2.严格按照实验内容进行实验,培养良好的算法设计和编程的习惯;
3.认真听讲,服从安排,独立思考并完成实验。
实验设备与器材
硬件:PC机
软件:C++或Java等编程环境
实验原理
分枝—限界算法类似于回溯法,也是一种在问题的解空间树上搜索问题解的算法。
但两者求解方法有两点不同:第一,回溯法只通过约束条件剪去非可行解,而分枝—限界法不仅通过约束条件,而且通过目标函数的限界来减少无效搜索,也就是剪掉了某些不包含最优解的可行解;第二,在解空间树上,回溯法以深度优先搜索,而分枝—限界法则以广度优先或最小耗费优先的方式搜索。
分枝—限界的搜索策略是,在扩展节点处,首先生成其所有的儿子结点(分支),然后再从当前的活结点表中选择下一个扩展结点。
为了有效地选择下一扩展结点,以加速搜索进程,在每一活结点处,计算一个函数值(限界),并根据这些已计算出的函数值从当前活结点表中选择一个最有利的结点做为扩展,使搜索朝着解空间树上最优解的分支推进,以便尽快找出一个最优解。
分枝—限界法常以广度优先或以最小耗费优先的方式搜索问题的解空间树(问题的解空间树是表示问题皆空间的一颗有序树,常见的有子集树和排序树)。
在搜索问题的解空间树时,分枝—限界法的每一个活结点只有一次机会成为扩展结点。
活结点一旦成为扩展结点,就一次性产生其所有儿子结点。
在这些儿子结点中,那些导致不可行解或非最优解的儿子结点将被舍弃,其余儿子结点被加入活结点表中。
此后,从活结点表取出下一结点成为当前扩展结点,并重复上述扩展过程,直到找到最优解或活结点表为空时停止。
实验内容
以下三个问题选做一项:
1.实现0-1背包问题的分枝—限界算法。
(1)选择合适的数据结构来表示问题,其中要求使用大小固定的元组表示动态状态空间树;
(2)确定限界函数;
(3)根据分枝—限界法的基本原理,写出求解0-1背包问题的伪码算法;
(4)编制C++或JA V A等高级语言程序实现伪码算法;
(5)上机运行程序,验证算法的正确性;
(6)作时空复杂性分析,并与用回溯法解0-1背包问题作比较。
2.实现货郎担问题的分枝—限界算法。
(1)选择合适的数据结构来表示问题;
(2)确定限界函数;
(3)根据分枝—限界法的基本原理,写出求解货郎担问题的伪码算法;
(4)编制C++或JA V A等高级语言程序实现伪码算法;
(5)上机运行程序,验证算法的正确性;
(6)作时空复杂性分析,并与用动态规划法解货郎担问题作比较。
3.实现带有期限的作业排序问题的分枝—限界算法。
(1)选择合适的数据结构来表示问题;
(2)确定限界函数;
(3)根据分枝—限界法的基本原理,写出求解带有期限的作业排序问题的伪码算法;
(4)编制C++或JA V A等高级语言程序实现伪码算法;
(5)上机运行程序,验证算法的正确性;
(6)作时空复杂性分析,并与用贪心法解带有期限的作业排序问题作比较。
实验报告
1.描述分枝—限界法的基本原理;
2.写出用分枝—限界法实现0-1背包问题、货郎担问题或带有期限的作业排序问题的
伪码算法,写出算法所用到的主要数据结构,简要画出各问题的解空间树以及搜索
过程,写出限界函数;
3.得出结果,并写出算法的时间复杂性和空间复杂性,并与其他算法解题作比较。
4.详细填写完成实验的收获和得失,实验过程中遇到的问题、解决的办法、实验心得
以及对该实验的建议和意见。
思考题
1.分枝—限界法适合解决哪些问题?
2.怎样确定限界函数?限界函数是固定不变的吗?。