算法设计与分析课程论文

合集下载

数据结构与算法分析论文(递归的讨论)

数据结构与算法分析论文(递归的讨论)

数据结构论文——递归算法的讨论所谓递归算法是把问题转化为规模缩小了的同类问题的子问题。

然后递归调用函数(或过程)来表示问题的解。

一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数)。

递归过程一般通过函数或子过程来实现。

递归方法:在函数或子过程的内部,直接或者间接地调用自己的算法。

递归算法是一种直接或者间接地调用自身算法的过程。

在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。

递归算法解决问题的特点:(1) 递归就是在过程或函数里调用自身。

(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。

(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。

递归次数过多容易造成栈溢出等。

所以一般不提倡用递归算法设计程序。

下面就让我们结合例子详细讨论一下递归算法。

一、递归算法的原理递归算法简单的说就是在函数中调用函数自身,不断调用,直到满足函数得出计算结果(某个条件)。

因为其需要不断循环的调用自身,所以称为递归调用。

递归的原理,其实就是一个栈(stack), 比如求5的阶乘,要知道5的阶乘,就要知道4的阶乘,4又要是到3的,以此类推,所以递归式就先把5的阶乘表示入栈, 在把4的入栈,直到最后一个,之后呢在从1开始出栈, 看起来很麻烦,确实很麻烦,他的好处就是写起代码来,十分的快,而且代码简洁,其他就没什么好处了,运行效率出奇的慢。

还有一个十分形象的例子:从前有座山,山里有个庙,庙里有个老和尚正在讲故事:从前有座山,山里有个庙,庙里有个老和尚正在讲故事:从前有座山,山里有个庙,庙里有个老和尚正在讲故事……如此循环往复到最终的要求。

递归分为2种,直接递归和间接递归。

直接递归,比如方法A内部调用方法A自身。

间接递归,比如方法A内部调用方法B,方法B内部调用方法C,方法C 内部调用方法A。

《算法初步》教学论文

《算法初步》教学论文

论《算法与初步》教学【摘要】在高中数学《算法与初步》教学中,教师应该选择合适的题目,使学生亲身经历从需求分析到算法设计的过程,经过编程实现的完整的解决问题的过程。

为此本文以《算法与初步》教学中,运用算法与程序设计来解决实际问题进行了探析。

【关键词】《算法与初步》算法与程序设计教学【中图分类号】 g42 【文献标识码】 a 【文章编号】 1006-5962(2012)11(a)-0132-01算法与程序设计最终目的是为了解决实际问题?本文的学习目的是使学生在原有基础上进一步体验算法思想,了解算法和程序设计在解决问题过程中的地位和作用;能从简单问题出发,设计解决问题的算法,并能初步使用一种程序设计语言编制程序实现算法解决问题?为此,笔者精选了平时生活和学习中经常用到的电子计时器进行教学?要求学生在一堂课内完成电子计时器的制作?如图1 在一堂课中,不但要让学生理解小时钟程序的制作算法思想,还要让学生掌握其程序的代码编写,的确难度不小?一般情况下,老师的讲解都是按正确的思路去执行的,而且在学生的习惯性思维中,通常教师是不会出错的?这次,在课堂上,笔者作出大胆尝试,故意出错,引起学生的注意,然后再加以分析,讲解出错的原因,寻找解决的办法,并引入新的知识难点全局变量?解题步骤:1 任务分析编写模拟“电子计时器”的程序?功能描述:(1)重置时间:就是把时间变为0,电子计时器暂时停止计时;(2)开始计时:就是电子计时器开始工作计时;(3)暂停计时:就是电子计时器暂时停止计时,但下次计时的时候,要从先前停的时间继续计时?2 算法分说明:等待时间到达,计时器控件自动完成“时间的增加”?3 编程三步曲(1)设计界面?修改对象属性:添加一标签,修改caption属性=0修改名称:min修改字体?字号属性添加两个标签,修改caption属性=:修改caption属性=0,修改名称:sec添加一计时器控件,修改interval=1000(表示时间间隔是一秒钟)(2)编写代码编写计时器事件:分析:定义变量t代表时间,单位:秒每过1秒钟,电子计时器显示就要加l,而计时器控件每秒执行一次,因此,可以使用累加:t=t+1,由于t是秒数,当t>60时,必须转换成分钟数?变量m代表分钟数,s代表秒数。

算法设计和分析课程论文

算法设计和分析课程论文

湖南理工学院课程论文论文题目贪心法的应用课程名称算法设计与分析姓名学号专业计算机科学与技术年级学院计算机日期(2014年4月10日)课程论文评价标准贪心法的应用摘要:在解决问题的过程中,通过逐步获得最优解从而获得整体最优解的策略就是贪心策略,在已经学会在解的范围可以确定的情况下,可以采用枚举或递归策略,一一比较它们最后找到最优解;但当解的范围非常大时,枚举和递归的效率会非常低。

这时就可以考虑用贪心策略。

贪心算法没有固定的框架,算法设计的关键是贪心策略的选择,贪心策略要具有无后向性,即某阶段状态一旦确定以后,不受这个状态以后的策略的影响。

当一个问题有好几种解决方法时,贪心法应该是最好的选择之一。

本文讲述了贪心算法的含义、基本思路以及贪心算法在实例中的应用。

关键词:贪心算法;删数问题;最小生成树一、引言在平时解决问题的过程中,当一个问题就有无后向性和贪心选择性质时,贪心算法通常会给出一个简单、直观和高效的解法。

贪心算法通过一系列的选择来得到一个问题的解。

它所做的每一个选择都是当前状态下就有某种意义的最好选择,即贪心选择;并且每次贪心选择都能将问题化解为一个更小的与原问题具有相同形式的子问题。

尽管贪心算法对于很多问题不能总是产生整体最优解,但对于最短路径、最小生成树问题,以及删数问题等却可以获得整体最优解,而且所给出的算法一般比动态规划算法更为简单、直观和高效。

二、贪心算法的含义和特点(一)贪心算法的含义贪心算法是通过一系列的选择来得到问题解的过程。

贪心算法是一种能够得到某种度量意义下的最优解的分级处理方法,它总是做出在当前看来是最有的选择,也就是说贪心策略并不是从整体上加以考虑,它所做出的选择只是在某种意义上的局部最优解算法。

(二)贪心算法的特点1、从全局来看,运用贪心策略解决的问题在程序运行过程中无回溯过程,后面的每一步都是当前看似最佳的选择,这种选择依赖已作出的选择,但并不依赖未作出的选择。

2、不能保证最后求出的解是最佳的。

“算法分析与设计”教学模式探索

“算法分析与设计”教学模式探索

“算法分析与设计”教学模式探索摘要:分析了“算法分析与设计”教学中存在的问题。

结合多年来从事“算法分析与设计”课程教学的经验,从构建主义学习理论的角度,以增加学生主观能动性为出发点,提出了一种综合性互动教学模式,并给出了该模式下的实践措施。

教学实践表明,该模式有利于培养学生的互动能力、逻辑思维能力和实践动手能力,在实际教学过程中取得了较好的效果。

关键词:算法分析与设计;教学模式;互动计算机算法是计算机科学和计算机应用的核心,无论是计算机系统、系统软件的设计,还是为解决计算机的各种应用课题p算法分析与设计课程需要较强的逻辑性、抽象性和较好的数学基础,很多学生在学习过程中,感觉算法内容理解难度较大,部分学生虽然清楚了整个算法思想,却无法读懂程序伪代码和源代码。

此外,不少学生对该门课程不够重视,存在着混学分的思想,导致了学习积极性不高。

造成以上现象的原因可以总结为以下几点:(1)学生对该课程的基础课程学习不扎实。

算法分析与设计的基础课程包括C语言(或VC++)、数据结构和离散数学等,而C语言和数据结构一直都是很多学生学习的一个软肋。

此外,对于一些非计算机专业的学生,他们在学习算法分析与设计课程之前,甚至没有学习过离散数学课程,这更加增加了他们学习的难度。

(2)学生对该课程重视程度不够。

一些学生思想上带有功利的成分,对所学内容在实际中的应用特别关注。

例如,设计了一个网站、一个管理系统或者一个嵌入式程序,学生可能觉得将来可以用于找工作,而算法分析与设计课程的内容显得与实际工作关系不大,因此,只抱着混学分的态度,及格就行。

(3)教师与学生的互动性不强。

在算法分析与设计的课程教学中,容易形成从教师至学生的单向灌输的局面,学生只是应付,没有兴趣去主动思考,以至形成“课堂纪律非常好,但是教师提问无人回答”的情形。

此外,很多教师使用了多媒体教学,虽然采用了信息化手段,但是多媒体课件响应速度快,超越了学生思考能力,阻碍了教师与学生之间的互动性。

算法设计课程论文模板

算法设计课程论文模板

《算法设计》课程论文题目针对UBQP问题的量子文化基因算法学生姓名学号院系计算机与软件学院专业计算机科学与技术指导教师刘文杰2015年6 月30 日目录1 引言 (2)2 ** 算法简介 (3)3 针对UBQP问题的量子文化基因算法(QEA-TS) (3)3.1算法思想 (3)3.2算法流程 (3)3.3算法过程描述 (5)3.3.1输入权值矩阵 (5)3.3.2 量子染色体初始化 (5)3.3.3 染色体观测 (5)3.3.4禁忌搜索 (6)3.3.5评估适应度值 (7)3.3.6 量子旋转门和更新 (7)3.3.7算法终止条件 (10)3.4本章小结 (11)4代码实现与结果分析 (11)4.1代码实现 (11)4.2运行结果分析与比较 (12)4.2.1参数设置 (12)4.2.2运行结果分析与比较 (12)5 小结 (14)针对UBQP 问题的量子文化基因算法1 引 言无约束0-1二次规划问题(Unconstrained Binary Quadratic Problem ,UBQP )是一类选取合适的二进制决策变量,使得二次目标函数值极大化的优化问题,该问题用数学表达式可以写成UBQP :QX X x f T =)((1)的形式,其中Q 是一个n n ⨯对称矩阵,一般写成上三角的形式,是常量,X 是n 维二进制向量(每个分量都是0或者1),即需要求的解。

这是一个典型的NP (Non-deterministic Polynomial )难题,它有许多方面的应用,如计算机辅助设计,社会心理学,交通管理,金融分析,机器调度等等。

同时,UBQP 问题是组合优化问题的一种通用模型,大多数组合优化问题都能够转化成该问题后进行求解,如图着色问题,多维背包问题,最大团问题,集合分割问题等等。

同时UBQP 问题是一个多峰值函数问题,在它的函数图像中具有很多山峰一样的极值点。

对这一问题,学者们提出了多种求解的算法,这些算法大致可以归结为两大类:完整算法和启发式算法。

如何写一篇计算机科学研究论文算法设计和实现

如何写一篇计算机科学研究论文算法设计和实现

如何写一篇计算机科学研究论文算法设计和实现计算机科学研究论文是科研工作者展示研究成果的重要方式之一。

在论文撰写过程中,算法设计和实现是其中一个关键环节。

本文将从准备工作、算法设计和实现、论文撰写三个方面,介绍如何写一篇计算机科学研究论文算法设计和实现。

一、准备工作在开始写论文之前,需要进行充分的准备工作。

首先,需要明确研究的目标和研究问题。

其次,调研相关领域的相关研究成果,了解当前的研究动态和存在的问题。

接下来,选择一种适合的研究方法和算法进行实现。

最后,制定一个详细的研究计划和时间表,以确保按时完成研究任务。

二、算法设计和实现1. 算法设计算法是计算机科学研究的核心内容之一,良好的算法设计可以提高研究的效果和质量。

在设计算法时,首先需要对研究问题进行分析,确定算法的输入和输出以及解决问题的方法。

然后,根据问题的特点选择适当的算法模型,如贪心算法、动态规划、遗传算法等。

在算法的设计过程中,要注重算法的效率和可行性,并进行合理的优化。

2. 算法实现算法实现是将算法转化为计算机程序的过程。

在进行算法实现之前,需要选择合适的编程语言和开发环境。

常用的编程语言有C++、Java、Python等,根据自己的实际需求选择最适合的语言。

在进行算法实现时,要注重代码的可读性和可维护性,并遵循代码规范和良好的编程习惯。

同时,要进行充分的测试,确保程序的正确性和稳定性。

三、论文撰写1. 结构布局一篇论文应包含摘要、引言、相关工作、算法设计和实现、实验结果、结论等部分。

摘要是对整篇论文的简要说明,引言对研究问题和研究意义进行介绍,相关工作部分回顾已有的研究成果,算法设计和实现部分详细描述所采用的算法模型和实现方法,实验结果部分展示实验结果和数据分析,结论部分总结研究成果并讨论未来的研究方向。

2. 语言表达在论文撰写中,要注意语言表达的准确性和流畅性。

使用清晰简洁的语言描述问题和方法,避免冗长和复杂的句子。

论文中的术语和符号要统一,并进行适当的注释和解释。

计算机教学论文:聚焦计算思维的算法分析与设计课程教学改革

计算机教学论文:聚焦计算思维的算法分析与设计课程教学改革

计算机教学论文:聚焦计算思维的算法分析与设计课程教学改革0 引言算法是计算机科学中最具方法论性质的核心概念,被誉为计算机学科的灵魂。

图灵奖获得者Niklaus Wirth提出:算法+数据结构=程序,强调了算法在计算机领域的重要性。

在现实生活中,算法、算据和算力组成了人工智能技术的三要素;算法的新颖性和性能决定了学术论文在高水平期刊或会议上发表的可能性;算法能力测试是研究生复试和求职面试等场合常见的环节。

因此,学习并掌握好算法相关知识,对一名本科生的综合能力培养和职业发展来说非常重要。

国内外各大高校计算机专业在培养方案中,普遍开设了算法分析与设计(以下简称算法)课程,该课程以高级程序设计和数据结构为先导课程,又为人工智能等专业课程提供算法支撑,是培养方案的重要枢纽之一。

算法课程既包含抽象的理论,又强调算法的实践,对学生的逻辑思维和计算建模等能力有较高的要求,因此有必要聚焦计算思维,开展面向能力提升的课程教学改革。

1 课程教学和改革现状1.1 共性问题目前,采取小班化策略开展算法课程教学已比较普遍;多数高校选用MIT经典书籍《Introduction to Algorithms》作为教材;依托在线平台开展编程训练取得了良好的教学效果。

但在教学过程中,还存在一些共性问题。

(1)学生在理论学习时普遍存在畏难心理。

算法要求学生不仅掌握算法的实施,更强调对算法原理的理解;一些关键的算法要进行证明,如主方法、最优前缀码等,这需要大量的理论知识,涉及不少数学符号,学生容易感到枯燥和抽象,降低了学习兴趣。

(2)学生难以灵活运用算法解决实际问题。

学生往往能够较好地掌握教材中的经典问题和相应的算法,并完成课后习题和部分在线训练题,但遇到复杂的现实问题或工程问题时,要么没有思路,要么依赖直觉,无法准确构建输入输出间的解析关系。

(3)学生的基础水平和学习需求差异明显。

修读课程的学生水平参差不齐,学习动力和学习方法也各不相同,因此处在两极的学生的学习需求通常难以得到精细满足;另外,创新实验活动和程序设计竞赛吸引了部分学有余力的学生,但课程教学和第二课堂缺乏深度结合。

计算机算法设计与分析

计算机算法设计与分析

中国地质大学研究生课程论文课程名称:算法设计与分析教师姓名:戴光明研究生姓名:研究生学号: ********** 研究生专业: *********** 所在院系:计算机学院类别: A.博士B.硕士√ C.进修生日期: 2017.01.13评语注:1、无评阅人签名成绩无效;2、必须用钢笔或圆珠笔批阅,用铅笔阅卷无效;3、如有平时成绩,必须在上面评分表中标出,并计算入总成绩。

目录第一章算法导引 (4)一、算法及其特性 (4)二、算法分析 (4)第二章分治法 (6)一、一般方法 (6)二、二分检索法 (6)三、归并分类 (7)四、特斯拉森矩阵乘法 (8)五、总结 (8)第三章贪心算法 (9)一、一般方法 (9)二、背包问题 (9)三、最小生成树 (10)四、单源点最短路径 (11)第四章动态规划 (12)一、优化问题 (12)二、一般原理 (12)三、多段图 (12)四、每对结点间的最短路径 (14)五、最优二分检索树 (14)六、0-1背包问题 (16)七、调度问题 (16)八、TSP问题 (17)第五章基本检索与周游算法 (18)一、一般方法 (18)二、双连通图和深度优先检索 (19)三、决策树(博弈树) (21)第六章回溯法 (22)第七章分支限界法 (22)一、一般方法 (22)二、回溯法解0-1背包问题 (22)三、分支限界法解0-1背包问题 (23)第八章总结 (24)第一章 算法导引课前题目: 编写程序:1、 编写两个矩阵相乘的程序;2、 如图,菱形ABCD 中,E 是AD 的中点,EF 垂直于AC 交CB 的延长线于F ,求证四边形AFBE 是平行四边形。

图1-1 平行四边形一、 算法及其特性1、算法是什么?算法是计算的方法。

2、什么是计算?1) 计算是基于规则的符号串的变换; 2) 计算是基于规则的物理信息的变换; 3) 计算是基于规则的信息的变换。

为了使计算机械化,图灵提出了图灵模型,在此基础上将理论进行技术实现,1946年诞生了第一台计算机(读写头、纸带、四元组),在内存条上进行输入输出。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算法设计与分析课程论文1.引言算法设计与分析是数据结构的有力补充,从中可以了解到算法设计的奥妙以及对数据结构中的数据存储结构更深层次的运用。

计算机算法设计与分析是面向设计的、处于核心地位的一门学科。

算法是一组有穷的规则,它规定了解决某一特定类型问题的一系列运算。

算法设计是一件非常困难的工作,常用的算法设计方法有:分治法、贪心方法、动态规划、回溯法、分枝-限界法、基本检索与周游方法、遗传算法等。

本文主要对算法设计与分析中的递归算法以及动态规划算法进行了总结、分析以及对具体问题的编程实现。

2.递归算法分析2.1递归算法简介与特点递归就是在函数或子过程的内部,直接或间接地调用自己的算法;递归算法是从下往上进行思维,需要对问题有全局的了解;在使用递归算法时,必须至少测试一个可以终止递归的条件,并且还必须对在合理的递归调用次数内未满足此类条件的情况进行处理,如果没有一个在正常情况下可以满足的条件,则过程将陷入执行无限循环的高度危险之中;递归算法的描述非常简洁而易于理解,但因重复计算和较大的堆栈消耗使递归算法的解题的运行效率较低;并不是所有的语言都支持递归,在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储,递归次数过多容易造成栈溢出等不利编程的因素,所以一般不提倡用递归算法设计程序。

2.2递归过程递归过程是直接调用自己或通过一系列的过程调用语句间接调用自己的过程。

在一个过程的运行期间调用另一个过程时,在执行被调用过程之前,系统要先把所有的实在参数返回地址等信息传递给被调用的过程保存,为被调用过程的局部变量分配存储空间,将控制转移到被调用入口。

接下来从被调过程返回调用过程要保存被调用过程的计算结果,释放被调用过程的数据区,依照被调过程保存的返回地址将控制转移到调用过程。

该过程服从后调用先返回的原则。

2.3递归算法的优缺点递归算法易于理解,结构清晰,所编写的代码简洁精练,可读性好,有利于代码的维护。

然而递归算法的效率却较低,占用较大的内存开销,消耗更多的系统堆栈,算法的空间复杂度大,故可以实现的深度是有限制的。

而且要考虑函数或算法是否具备收敛性,当且仅当一个算法存在预期的收敛效果时,采用递归算法才是可行的,否则,就不能使用递归算法。

2.4递归算法的适用范围由于递归算法的运行效率较低,堆栈容易溢出的特点,递归算法适用于问题规模较小且那些不存在简明的数学模型以阐明问题的本质,或者存在数学模型,但是难于实现的问题,这样可以减少代码的复杂度。

递归算法所适用的问题一般有这样的特征:为求解规模为N的问题,设法先将它分解为规模较小的子问题,然后从这些子问题的解构造出整个问题的解,并且这些子问题也能采用同样的分解和综合方法,分解成规模更小的子问题,并从这些更小的子问题的解构造出较大规模的问题的解,特别地,当规模N=1时,能直接得解。

例如很多的数学函数是递归定义的(阶乘函数)、有的数据结构(广义表,二叉树)还有一类本身没有明显的递归结构但用递归求解更为简单的问题(汉诺塔问题,八皇后问题)。

2.5递归与递推的关系①递推法是求解递归方程的基本方法,对于某些递归关系可由逐级递推求得递归方程的解。

②递归算法会引起一系列的函数调用,并且可能会有一系列的重复计算,所以当某个递归算法能较方便地转化成递推算法时,通常按递推算法编写程序。

③递归算法的执行过程分递推与回归两个阶段。

在递推阶段,把较复杂的问题(规模为N)的求解推到比原问题简单一些的问题(规模小于N)的求解。

在回归阶段,当获得最简单的情况后,逐级返回,依次获得稍复杂问题的解。

递推是利用问题本身所具有的递推关系对问题求解的一种方法。

采用递推法建立起来的算法一般要有重要的递推性质,即当求得问题规模为i-1的解后,由问题的递推性质,能从已求得的规模为1,2,…,i-1的一系列的解,构造出问题规模为i的解。

若设这种问题的规模为N,当N=0或N=1时,解或为已知,或能很容易地求得。

2.6用递归算法来解决“骨头的诱惑”问题2.6.1问题描述一只小狗在一个古老的迷宫里找到一根骨头,当它叼起骨头时,迷宫开始颤抖,它感觉到地面开始下沉。

它才明白骨头是一个陷阱,它拼命地试着逃出迷宫。

迷宫是一个N×M大小的长方形,迷宫有一个门。

刚开始门是关着的,并且这个门会在第T秒钟开启,门只会开启很短的时间(少于一秒),因此小狗必须恰好在第T秒达到门的位置。

每秒钟,它可以向上、下、左或右移动一步到相邻的方格中。

但一旦它移动到相邻的方格,这个方格开始下沉,而且会在下一秒消失。

所以,它不能在一个方格中停留超过一秒,也不能回到经过的方格。

小狗能成功逃离吗?2.6.2问题分析小狗要在迷宫中到处搜寻可以逃离道路,如果找到则成功逃离,如果找不到则会被困住。

此骨头的诱惑问题可以用典型的递归与回溯方法进行求解。

对问题进行建模并用非形式化语言描述如下:①递归搜索阶段:给定小狗当前位置,按照一定的顺序对下一步的走向进行深度递归搜索,算法需要保存现场。

②回溯恢复阶段:当某条路径的终点并不是出口时,算法需要回退,这就恢复现场,一边从另一个方向进行搜索。

③结束条件:当搜索了所有的路径,让没有找到出口,则结束算法,此结果代表没有出路;当找到一个出口,同样结束算法,此结果代表找到出路,递归路径即为小狗逃离路径。

2.6.3程序设计C语言实现的主要代码如下:int fun(int si,int sj,int time){int i;int g,h;if(si==di&&sj==dj&&time==t)return1;for(i=0;i<4;i++){g=si+move[i][0];h=sj+move[i][1];if(maze[g][h]=='.'){maze[g][h]='X';//走过之后,设置为墙壁if(fun(g,h,time+1))//递归下一分支是否有通路return1;maze[g][h]='.';//回溯,恢复现场}}return0;}3.动态规划分析3.1动态规划简介与特点动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。

20世纪50年代初美国数学家R.E.Bellman 等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。

动态规划程序设计是对解最优化问题的一种途径、一种方法,而不是一种特殊算法。

不象搜索或数值计算那样,具有一个标准的数学表达式和明确清晰的解题方法。

动态规划程序设计往往是针对一种最优化问题,由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题,有各具特色的解题方法,而不存在一种万能的动态规划算法,可以解决各类最优化问题。

因此必须具体问题具体分析处理,以丰富的想象力去建立模型,用创造性的技巧去求解。

3.2动态规划基本思想动态规划算法通常用于求解具有某种最优性质的问题。

在这类问题中,可能会有许多可行解。

每一个解都对应于一个值,我们希望找到具有最优值的解。

动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。

若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。

如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。

我们可以用一个表来记录所有已解的子问题的答案。

不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。

这就是动态规划法的基本思路。

具体的动态规划算法多种多样,但它们具有相同的填表格式。

3.3适合动态规划解决的问题①具有最优子结构性,即原问题的最优解包含子问题的最优解。

②子问题重叠性,也就是说子问题之间不是独立的,一个子问题在下一阶段决策中可能被多次使用到。

对有分解过程的子问题还表现在:自顶向下分解问题时,每次产生的子问题并不总是新问题,有些子问题会反复出现多次。

3.4算法设计步骤①找出最优解的性质,并刻划其结构特征。

②递归地定义最优值。

③以自底向上的方式计算出最优值。

④根据计算最优值时得到的信息,构造最优解。

3.5用动态规划来解决“0/1背包”问题3.5.1问题描述给定n种物品和1个背包。

物品i的重量是wi,其价值为vi,背包的容量为C。

问应如何装入背包中的物品,使得装入背包中物品的总价值最大?在选择装入背包的物品时,对每种物品i只有两种选择,即装入背包、不装入背包。

不能将物品i装入背包多次,也不能只装入部分的物品i。

该问题称为0/1背包问题。

3.5.2问题分析令V(i,j)表示在前i(1<=i<=n)个物品中能够装入容量为就j(1<=j<=C)的背包中的物品的最大价值,则可以得到如下的动态规划函数:(1)V(i,0)=V(0,j)=0(2)V(i,j)=V(i-1,j)j<wiV(i,j)=max{V(i-1,j),V(i-1,j-wi)+vi)}j>wi(1)式表明:如果第i个物品的重量大于背包的容量,则装人前i个物品得到的最大价值和装入前i-1个物品得到的最大价是相同的,即物品i不能装入背包;(2)式表明:如果第i个物品的重量小于背包的容量,则会有一下两种情况:(a)如果把第i个物品装入背包,则背包物品的价值等于第i-1个物品装入容量位j-wi的背包中的价值加上第i个物品的价值vi;(b)如果第i个物品没有装入背包,则背包中物品价值就等于把前i-1个物品装入容量为j的背包中所取得的价值。

显然,取二者中价值最大的作为把前i个物品装入容量为j的背包中的最优解。

3.5.3程序设计C语言实现的主要代码如下:int KnapSack(int n,int w[],int v[],int x[],int C){int i,j;for(i=0;i<=n;i++)V[i][0]=0;for(j=0;j<=C;j++)V[0][j]=0;for(i=0;i<=n-1;i++)for(j=0;j<=C;j++)if(j<w[i])V[i][j]=V[i-1][j];elseV[i][j]=max(V[i-1][j],V[i-1][j-w[i]]+v[i]);j=C;for(i=n-1;i>=0;i--){if(V[i][j]>V[i-1][j]){x[i]=1;j=j-w[i];}elsex[i]=0;}printf("选中的物品是:\n");for(i=0;i<n;i++)printf("%d",x[i]);printf("\n");return V[n-1][C];}4.总结递归和动态规划是算法设计中的重要方法,它们涉及面很广泛,本文只是对其进行了初步探讨,还有很多更加深入的东西等着大家去深入研究。

相关文档
最新文档