背包问题数据结构实验报告(共18页).doc
《背包问题数据结构实验报告(共18页).doc》由会员分享,可在线阅读,更多相关《背包问题数据结构实验报告(共18页).doc(19页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上淮阴工学院数据结构课程设计报告选题名称: 背包问题求解 系(院): 计算机工程系 专 业: 计算机科学与技术 班 级: 网络107 姓 名: 蒋为维 学 号: 指导教师: 张亚红 张勇军 学年学期: 2008 2009 学年 第 2 学期2009年 6 月 20 日专心-专注-专业设计任务书课题名称背包问题求解设计目的通过一周的课程设计,实现回溯法解决背包问题的方法,达到巩固理论知识、锻炼实践能力、构建合理知识结构的目的。实验环境Windows2000以上操作系统Visual C+6.0以上编译环境任务要求1. 搜集背包问题方面的资料;2. 编写代码,实现回溯法背包问
2、题;3. 撰写课程设计报告;4. 参加答辩;工作进度计划序号起止日期工 作 内 容12009.06.08理论辅导,搜集资料22009.06.082009.06.10编写代码,上机调试32009.06.11撰写课程设计报告42009.06.12答辩指导教师: 2009 年 6 月 10 日 注意:1 任务书格式参照“任务书范例”执行。2 范例中的红色文字应根据你所选择的具体课题,修改为对应的内容。范例中的其它内容不变。摘要:组合优化问题的求解方法研究已经成为了当前众多科学关注的焦点,这不仅在于其内在的复杂性有着重要的理论价值,同时也在于它们能在现实生活中广泛的应用。比如资源分配、投资决策、装载设
3、计、公交车调度等一系列的问题都可以归结到组合优化问题中来。但是,往往由于问题的计算量远远超出了计算机在有效时间内的计算能力,使问题的求解变为异常的困难。尤其对于NP完全问题,如何求解其最优解或是近似最优解便成为科学的焦点之一。背包问题是一个典型的组合优化问题,在计算理论中属于NP-完全问题, 其计算复杂度为,传统上采用动态规划来求解。设wi是经营活动 i 所需要的资源消耗,M是所能提供的资源总量,pi是人们经营活动i得到的利润或收益,则背包问题就是在资源有限的条件下, 追求总的最大收益的资源有效分配问题。关键词:背包问题,堆栈,回溯法,递归目录1 需求分析.11.1课程设计(实践周)题目.11
4、.2课程设计(实践周)任务及要求.11.3课程设计(实践周)思想.11.4软硬件运行环境及开发工具.22概要设计.22.1本课题设计所用数据结构以及流程图.2 2.1.1栈的原理.2 2.1.2溯法介绍.3 2.1.3包问题整体流程图 .52.2本课题主要设计思想.63代码设计.63.1定义栈和顺序表结构体.63.2栈的初始化.73.3判断栈空.73.4入栈.73.5出栈.83.6输入元素.84调试与操作说明.95总结.116致谢.127参考文献.131需求分析1.1本课程设计(实践周)题目假设有一个能装入总体积为T的背包和n件体积分别为w1 , w2 , , wn 的物品,能否从n件物品中挑
5、选若干件恰好装满背包,即使w1 +w2 + + wn=T,要求找出所有满足上述条件的解。例如:当T=10,各件物品的体积1,8,4,3,5,2时,可找到下列4组解:(1,4,3,2)(1,4,5)(8,2)(3,5,2)该问题的模型可以表示为下述0/1整数规划模型:目标函数: (*)式中为0-1决策变量,时表示将物品装入背包中,时则表示不将其装入背包中。1.2课程设计(实践周)任务及要求1.搜集背包问题方面的资料; 2.作为组长,我负责设计数据结构,编写代码;彭建鑫设计流程图和回溯法介绍 3.撰写课程设计报告; 4.参加答辩。1.3课程设计(实践周)思想 利用回溯法的设计思想来解决背包问题。首
6、先将物品排列成一列,然后顺序选取物品装入背包,假设已选取了前i件物品后背包还没装满,则继续选取第i+1件物品,若该件物品“太大”不能装入,则弃之而选取下一件,直到背包装满为止。但如果在剩余的物品中找不到合适的物品以填满背包,则说明“刚刚”装入背包的那见物品“不合适”,应该将它去出“弃之一边”,继续再从“它之后”的物品中选取,如此重复,直到求得满足条件的解,或者无解。由于回溯法求解的规则是“后进先出”因此自然要用到栈。1.4软硬件运行环境及开发工具Windows2000以上操作系统Visual C+6.0以上编译环境2概要设计2.1 本课题设计所用数据结构以及流程图2.1.1栈的原理作为组长,我
7、主要是负责该部分。背包问题求解涉及到的数据结构主要是栈,下面我就详细的介绍一下有关栈方面的知识。栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表。当用一维数组存储栈时,被称为顺序栈。(1)通常称插入、删除的这一端为栈顶(Top),另一端称为栈底(Bottom);(2)当表中没有元素时称为空栈,用Top=-1表示;(3)栈为后进先出(Last In First Out)的线性表,简称为LIFO表。 栈的修改是按后进先出的原则进行。每次删除(退栈)的总是当前栈中最新的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,要到最后才能删除。栈为后进先出(Last In First
8、 Out)的线性表,简称为LIFO表。栈的修改是按后进先出的原则进行。每次删除(退栈)的总是当前栈中最新的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,要到最后才能删除。流程图如下: Push(进栈) a0 a1 a n-1 Pop(出栈) top(栈顶)栈的基本运算:(1)InitStack(S) 构造一个空栈S。(2)StackEmpty(S) 判栈空。若S为空栈,则返回TRUE,否则返回FALSE。(3)StackFull(S) 判栈满。若S为满栈,则返回TRUE,否则返回FALSE。注意:该运算只适用于栈的顺序存储结构。(4)Push(S,x) 进栈。若栈S不满,则将元
9、素x插入S的栈顶。(5)Pop(S) 退栈。若栈S非空,则将S的栈顶元素删去,并返回该元素。(6)StackTop(S) 取栈顶元素。若栈S非空,则返回栈顶元素,但不改变栈的状态。2.1.2回溯法介绍此部分由彭建鑫设计。1 什么是回溯法回溯法也称为试探法,该方法首先暂时放弃关于问题规模大小的限制,并将问题的候选解按某种顺序逐一枚举和检验。当发现当前候选解不可能是解时,就选择下一个候选解;倘若当前候选解除了还不满足问题规模要求外,满足所有其他要求时,继续扩大当前候选解的规模,并继续试探。如果当前候选解满足包括问题规模在内的所有要求时,该候选解就是问题的一个解。在回溯法中,放弃当前候选解,寻找下一
10、个候选解的过程称为回溯。回溯法是一个既带有系统性又带有跳跃性的的搜索算法。它在包含问题的所有解的解空间树中,按照深度优先的策略,从根结点出发搜索解空间树。算法搜索至解空间树的任一结点时,总是先判断该结点是否肯定不包含问题的解。如果肯定不包含,则跳过对以该结点为根的子树的系统搜索,逐层向其祖先结点回溯。否则,进入该子树,继续按深度优先的策略进行搜索。回溯法在用来求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索遍才结束。而回溯法在用来求问题的任一解时,只要搜索到问题的一个解就可以结束。这种以深度优先的方式系统地搜索问题的解的算法称为回溯法,它适用于解一些组合数较大的问题。 2 基本思想回
11、溯即是较简单、较常用的搜索策略。全面访问所有可能的情况,分为两种:不考虑给定问题的特有性质,按事先顶好的顺序,依次运用规则,即盲目搜索的方法;另一种则考虑问题给定的特有性质,选用合适的规则,提高搜索的效率,即启发式的搜索。可用回溯法求解的问题P,通常要能表达为:对于已知的由n元组(x1,x2,xn)组成的一个状态空间E=(x1,x2,xn)xiSi ,i=1,2,n,给定关于n元组中的一个分量的一个约束集D,要求E中满足D的全部约束条件的所有n元组。其中Si是分量xi的定义域,且 |Si| 有限,i=1,2,n。我们称E中满足D的全部约束条件的任一n元组为问题P的一个解。若已有满足约束条件的部
12、分解,不妨设为(x1,x2,x3,xi),In,则添加x(i+1)属于s(i+2),检查(x1,x2,xi,x(i+1)是否满足条件,满足了就继续添加x(i+2)、s(i+2),若所有的x(i+1)属于s(i+1)都不能得到部分解,就去掉xi,回溯到(xi,x2,x(i-1),添加那些未考察过的x1属于s1,看其是否满足约束条件,为此反复进行,直至得到解或证明无解。 解问题P的最朴素的方法就是枚举法,即对E中的所有n元组逐一地检测其是否满足D的全部约束,若满足,则为问题P的一个解。但显然,其计算量是相当大的。 我们发现,对于许多问题,所给定的约束集D具有完备性,即i元组(x1,x2,xi)满足
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 背包 问题 数据结构 实验 报告 18
限制150内