摘要:本文阐述了动态规划法的原理、解决思路和解决步骤,同时列举了动态规划法如何解决计算机专业常出现的多段图的最短路径问题、资源分配问题以及背包问题,进而结合动态规划法的数学思想和解决步骤分析其在实际工程中的应用,为实际生活生产的决策问题提供理论依据。
关键词:动态规划算法; 工程; 计算机语言;
目录
1动态规划法原理概述..................................1
2解动态规划法的基本方法..................................2
2.1解决思路..................................3
2.2解决步骤..................................3
3动态规划法的应用..................................4
3.1多段图的最短路径问题..................................5
3.2动态规划算法在工程中的应用..................................5
4结束语..................................6
文内图表..................................7
图1..................................7
参考文献..................................8
动态规划算法最早提出于20世纪50年代,由美国数学家提出,最初是为了优化简单的多阶段生产决策问题,其数学思想的实质是将复杂的多阶段问题分割成为一系列的单阶段问题,进而逐个分析单个阶段,确定各阶段的关系,最终分析出多阶段问题的最优方案,即对实际生产多阶段问题形成动态规划思维,通俗来讲,动态规划法具有实时性,依据前一阶段动态分析下一阶段的最优路径法,动态规划法不仅能够正确分析当前阶段,同时也能结合各阶段的条件合理判断最优方案,动态规划法以其高效性、简化性等优点被广泛应用于各类生产调度、优化控制等问题。
1 动态规划法原理概述
动态规划算法的实质是阶段拆分,将复杂的多阶段和多条件拆分为单阶段问题,结合各阶段条件状态对其进行合理的定义,明确各阶段之间的关系,使得当前阶段的问题能够结合当前条件和下一阶段的实际情况合理选择下一阶段的路径。动态规划的数学思维与递推思维类似,均是为了着重解决重叠子问题和最优子结构选择问题而设计的数学算法,其在数学、计算机学、经济学以及生产调度中应用极为广泛,计算机学中主要通过多种计算机语言实现数学算法,相对于传统的整体规划法能极大程度节约算法调度的时间和效率。
不同于排序算法或二叉树前序、后序、中序等遍历算法固有的分析范式,可以依据既定算法进行问题处理,而动态规划算法的重点是分析,即使存在固有算法,在实际问题决策中仍然需要结合各阶段条件和状态动态分析下一阶段的路径选择,仅依靠其数学思想去解决实际问题是远远不够的,更重要的是合理构造动态规划算法所需形式,进而结合动态规划算法的思想才能解决实际调度问题。
形如:初始状态→│决策1│→│决策2│→…→│决策n│→结束状态,动态规划法的基本思想就是将复杂问题分为若干子问题,子问题之间是相互关联的,最终形成一条最优化的解决方式。动态规划算法在各子阶段都需要做出相应的决策,确保路径规划的整体过程都达到最优化,子阶段的决策依据当前阶段的状态,当前阶段的状态可能由前一阶段生成,是前一状态的总结,但前一阶段的状态并不会影响当前状态的下一状态,即历史无关性,历史性状态只能决定下一阶段的状态,并不会影响未来阶段的状态,阶段3的决策只依赖阶段2的输出状态,与状态1无关。各阶段决策的总体称为决策序列,决策序列即最优的解决方案,多决策过程即将一个具有多种分支路径或阶段的复杂问题拆分成为前后相关且具有链状结构的子阶段。
2 解动态规划法的基本方法
2.1 解决思路
图1
动态规划相比于朴素算法解决了重复子问题,动态规划算法对任一子问题都只解决一次,其需要通过计算机的二维数组保存重叠子问题的状态和阶段,二维数组的引入可以有效避免子阶段重复运算的问题。因此,动态规划算法多依靠计算机学相关语言实现。其解决步骤主要分为将实际问题拆分为子阶段、依据实际情况定义问题状态和状态关系。
2.1.1 实际问题分割
从生产问题的实际出发分析问题,将其分为若干子阶段处理分析,子阶段的划分需要结合实际,注意子问题之间的共性,确保可以通过递推或递归的方式解决各子问题,动态规划算法的重要步骤就是分析子问题的递推或递归的可能性,递推或递归具有一定的关联性,当前子问题的决策方法应该适用于下一子问题。动态规划算法不仅可以从前至后推导,也可从后至前推导,因此问题的分割也具有多样性,可以考虑多方面的分割方式,问题可以分割为大问题和小问题,分割应考虑大问题和小问题的共有特性,寻找状态各子问题状态转移的规律,当然这需要一定的数学思维和经验,根据状态转移规律分析设计出适合子问题的决策方案。
2.1.2 定义子问题状态和状态的共性及关系
即确定状态转移方程式,类似于数学公式的推导,将子问题的状态进行合理有效的量化,使用程序化的方式推导各子问题的状态,一般多以计算机语言表达状态转移公式,计算机语言相较于数学可以表达抽象的状态转移公式,有助于推导状态的共性和转移方式。因此,动态规划算法多使用计算机语言实现,其数学思想和方法也成为近年来互联网企业机试考察的重点和难点。
其实,动态规划算法的原理和思想与分治算法有异曲同工之处,分治法同样是拆分复杂问题,将其分解为若干同类型的子问题,但分治法与动态规划算法不同的是历史无关性,动态规划法的下一子阶段状态与决策与当前阶段的之前阶段和状态无关,而分治法则依赖于之前阶段决策出的最优值。
2.2 解决步骤
动态规划算法的整体步骤可分为如下阶段:
2.2.1 分析最优解的性质,并刻画其结构特征
首先需要全面分析实际问题,其是否适合使用动态规划算法求解,动态规划法使用于生产调度、路径规划等实际问题,因此分析过程需要总结出问题的结构特征,通过拆分算法将问题简单化,分析各子问题的共性,这也是动态规划算法的首要步骤,确定子问题共性是分析最优质的基础。
2.2.2 递归的定义最优解
子问题的共性是为了使各问题都能满足递归或递推法的决策方式,递归递推方式能否适用是规划算法拆分的最终目的也是动态规划算法的核心,当然动态规划法与二叉树遍历算法的区别也在于此,二叉树遍历算法是固有范式的算法思想,满足条件的二叉树都可使用遍历算法查找,而动态规划算法则不同,为并不存在固有范式进行最优解计算,决策过程是通过子问题的共性进行合理的递推和递归算法。
2.2.3 以自底向上或自顶向下的记忆化方式(备忘录法)计算出最优值
动态规划算法的最优值可以自底向上也可自顶向下决策,不同方向的决策过程如出一辙,都是利用递归算法决策当前阶段的最优值,实际生产问题中多采用自顶向下的决策过程。不断的递归决策出每个子问题的最优值,在顶端或底端决策的结果就是整个问题的最优值。
3 动态规划法的应用
3.1 多段图的最短路径问题
阶段:如图1所示,将整体阶段划分为12个子阶段。
状态:每个子阶段到下一子阶段都有若干个可供选择的路径,路径的判断需要结合输入的状态。
决策:根据输入状态判断当前子问题应进行的下一步子问题,即最优值的决策。决策必须满足计算机语言表达的方程式,即递归算法的本质,方程式也同样适用于各子问题。如多段图最短路径的算法方程式为:
规划方程:f(k)表示状态k到终点状态的最短距离。
初始条件:f(k)=0;
方程:f(k-1)=min{f(k)+W(k-1,k)}其中W(k-1,k)表示状态k-1到状态k的距离。
3.2 动态规划算法在工程中的应用
动态规划算法已经被广泛应用于地铁修建、人流量疏通、水电资源分配等实际工程应用中,文章选取某市的地铁修建问题分析动态规划算法在实际工程中的应用。
假如某市有n个交通线,其中1号和n号非常重要,为了加强运输能力,某市决定在1号到n号枢纽间修建一条地铁。地铁由很多段隧道组成,每段隧道连接两个交通枢纽。经过勘探,有m段隧道作为候选,两个交通枢纽之间最多只有一条候选的隧道,没有隧道两端连接着同一个交通枢纽。现在有n家隧道施工的公司,每段候选的隧道只能由一个公司施工,每家公司施工需要的天数一致。而每家公司最多只能修建一条候选隧道。所有公司同时开始施工。基于此实际工程问题,如何选择最优方案实现最少天数内完成整条地铁修建。
工程的资源分配问题已经简化了问题拆分步骤,初始化已经将问题分解为资源和生产,即阶段和状态问题,因此上述的工程问题中阶段即生产间,状态即条件,需要在生产设备总数一定的情况下求解可以产生最大利润的分配方式,这就是最优化的问题。又因为在当前设备分配选择中都跟前面已经做出的选择有关,具有一定的重叠性问题,类似于这种子问题具有重叠性的最优化问题求解,动态规划占有很大的优势。
首先确定交通枢纽的数量和候选隧道的数量,总数范围内枢纽a和枢纽b之间可以修建一条隧道,需要时间为dist[i]天。那么修建整条地铁所需总数最小的算法思想如下。
第1步:从第一个枢纽开始,找到与其邻接的点:1,2,3,更新dist[]数组,因0不与4邻接,故dist[4]为正无穷。在dist[]中找到最小值,其顶点为2,即此时已找到0到2的最短路。
第2步:从2开始,继续更新dist[]数组:2与1不邻接,不更新;2与3邻接,因0→2→3比dist[3]大,故不更新dist[3];2与4邻接,因0→2→4比dist[4]小,故更新dist[4]为4.在dist[]中找到最小值,其顶点为3,即此时又找到0到3的最短路。
第3步:从3开始,继续更新dist[]数组:3与1邻接,因0→3→1比dist[1]小,更新dist[1]为5;3与4邻接,因0→3→4比dist[4]大,故不更新。在dist[]中找到最小值,其顶点为4,即此时又找到0到4的最短路。
第4步:从4开始,继续更新dist[]数组:4与1不邻接,不更新。在dist[]中找到最小值,其顶点为1,即此时又找到0到1的最短路。
第5步:所有点都已找到,停止。
根据上面的证明,动态规划算法每次循环都可以确定一个顶点的最短路径,故程序需要循环n-1次。
总结:当我们通过分析得到相应的动态规划状态方程时,用其求解问题的效率会优于普通的理论计算。
4 结束语
总之,动态规划算法在解决多阶段最优决策问题上具有很大的优势,可以有效的结合工程调度和资源分配问题,且对比于递归算法,动态规划的算法效率更高。当然它也具有一定的局限性,因为每个问题对应的模型不同,要找到其相应的状态转移方程并不是一件容易的事情。因此,如何有效地运用动态规划来解决问题还待做进一步的探究。
参考文献
[1]吕丹,杨子寒,周君。动态规划算法在生活中的应用[J].电脑知识与技术,2018,14(17):253-255+268.
[2]封震震。动态规划变形算法在递归函数中的应用[J].电脑知识与技术,2019,15(03):67-68.
[3]郭世伟,孟昱煜,陈绍立。改进的PSOGM算法在动态关联规则挖掘中的应用[J].计算机工程与应用,2018,54(08):160-165.