动态规划通常用于有很多种可行解,而找出最优解的问题。
具体可分为4个步骤:
1)描述最优解的结构。
2)递归定义最优解的值。
3)自底向上计算最优解的值。
4)由最优解的值构造出最优解。
下面通过一个具体问题来看究竟如何用动态规划算法来解决问题。
Colonel汽车公司在有两条装配线的工厂里生成汽车。每一条装配线上有n个装配站,
两条生产线上相同位置的装配站功能相同,但所需时间不同,并且汽车底盘在两条
装配线间转移要花费一定的时间。如下图所示两条生产线。
这里首先尝试下下一章的贪心算法,在每一步都取最省时间的装配站。首先进入装配线1时间为2 + 7
小于装配线2的4 + 8,因此进入装配线1。之后装配站2的时间9大于转移到装配线2的时间2 + 5,因此
转移到装配线2上。以此类推可以得到下图中标红的路线:
可以清楚地看出,在这个问题上采用贪心的策略是不对的,那么哪里出了问题呢?问题的关键就
在于两条装配线间转移是需要不同时间的。以装配站Station-1,3为例,虽然选择进入Station-1,4保证
了眼前的最优(Station-1,4的时间4大于转移到装配线2的时间1 + 4),但是接下来在Station-1,4至少
要耗费时间为8,一共需要时间为4 + 8 = 12。但若在Station-1,3时转移到了装配线2的Station-2-4,
花费时间1 + 4 = 5,接下来直接进入Station-2,5,那么一共需要时间5 + 5 = 10。
这就是问题的关键!在Station-1,3处只能看到眼前的两种选择哪个更节省时间,却没法知道后来的情况。
这也就是“步步最优不等于全局最优”的道理。然而所有路线的可能性为2 ^ n,其中n为每条装配线上
装配站的个数。因此当有很多装配站时,使用Brute force生成比较各条路线的值几乎是不可能的。
那么现在就要请出动态规划来帮忙了。
e1和e2表示进入装配线1和2所需时间,x1和x2表示出装配线时间。
a1和a2表示各个装配站花费时间,t1和t2则表示装配线间转移花费的时间。
装配线1和2的最优路线保存到数组L1和L2中用于构造一个最优解。
下面来看具体实现代码。
原来动态规划也是从装配站1开始到N逐步计算,但与贪心法不同的是,它用数组f1[j]和f2[j]记录了通过
装配站a1[j]和a2[j]的最优解。以a1[j]为例,计算通过a1[j]的最优解时,不是像贪心法那样只通过前一个
装配站a1[j-1]和a2[j-1]+t2[j-1]谁更省时间,而是比较了f1[j-1]和f2[j-1]+t2[j-1]来决定到底是从a1[j-1]直接
运送到a1[j],还是由a2[j-1]转移到装配线1。这样可以明显看出动态规划与贪心算法的区别,贪心算法只顾
眼前(前一个装配站的情况),而动态规划则是根据前面所有装配站的情况(f1和f2保存了前面所有装配站
的最优解)。重点是理解f1和f2的意义,从而明白这个问题的最优子结构是如何定义。
下图中标红的路线才是最优路线。
在使用L1和L2构造最优解时要注意,要从后向前处理,因为我们只知道最优路线是从装配线1中出来。
所以在这里可以采用递归地方式,来正序打印最佳路线。这也是习题15.1-1的答案。
分享到:
相关推荐
算法导论第15章-动态规划的课后习题参考答案,对于算法爱好者而言,是不错的参考资料。
算法导论 第二十五章 答案 算法导论 第二十五章 答案 算法导论 第二十五章 答案
本段代码提供了一个基于动态规划方法解决装配线调度问题的具体实现方案。通过对数据结构的定义、关键函数的设计以及主程序流程的控制,有效地解决了装配线调度问题,并能够输出最优路径。这种方法不仅适用于简单的双...
第十五章通常涉及图算法,包括最短路径、最小生成树、网络流等核心概念。在这个压缩包中,我们可能会找到一系列与这些主题相关的习题解答。 在图算法中,Dijkstra算法是一种广泛应用的寻找图中单源最短路径的方法。...
算法导论第四章答案算法导论第四章答案算法导论第四章答案算法导论第四章答案
**第31章:动态规划** 动态规划是一种解决最优化问题的强大方法,它通过将问题分解为子问题来求解。本章主要介绍了以下内容: 1. 动态规划的基本思想:将复杂问题拆分为相互重叠的子问题,存储子问题的解,避免...
第17章:动态规划 动态规划是一种解决优化问题的高效方法,通过将大问题分解为子问题来求解。本章主要介绍了基本的动态规划思想,如最优子结构和重叠子问题,并通过背包问题、矩阵链乘法、最长公共子序列等经典例子...
4. 动态规划:在某些情况下,装配线调度问题可以用动态规划方法解决。通过建立状态转移方程,可以找到最优的调度策略,避免重复计算。 5. 并行处理:如果系统资源允许,可以利用多核处理器的并行计算能力,通过并发...
算法导论第二十四章答案 算法导论第二十四章答案 算法导论第二十四章答案
《算法导论》第二十章习题解答涵盖了各种高级算法问题,主要涉及图论和网络流等内容。在这一章中,作者深入探讨了如何解决实际问题,如最短路径、最大流最小割以及网络调度等问题。以下是部分习题的解析和相关知识点...
《算法导论》第二十三章主要探讨的是图算法,包括图的基本概念、图的表示方法、图的遍历以及各种图的特殊结构如最小生成树、最短路径等。本章习题解答涵盖了这些核心知识点,旨在帮助读者深入理解和应用所学理论。 ...
本书覆盖了从排序和搜索到图算法,再到动态规划和贪心算法等一系列广泛的主题,旨在帮助学生和从业者提升算法思维能力,解决实际问题。 本书的习题解答部分是学习过程中不可或缺的辅助资料。每一道习题都是对理论...
《算法导论》是计算机科学领域的一本经典教材,涵盖了广泛的算法理论和实践知识。21至25章是该书的重要部分,涉及到许多关键的算法设计和分析方法。以下是对这五章主要内容的详细解释: 第21章:图算法 在这一章中...
第十七章通常涉及的是图算法,这部分内容在实际编程中有着广泛的应用,比如网络路由、最短路径计算、任务调度等。以下是对第十七章习题解答的详细解析。 1. **图的基本概念**:图是由顶点(节点)和边构成的数据...
算法导论大作业:股票买卖最佳时期系列问题 南开大学 算法导论源码算法导论大作业:股票买卖最佳时期系列问题 南开大学 算法导论源码算法导论大作业:股票买卖最佳时期系列问题 南开大学 算法导论源码算法导论大作业...
前者很显然是《算法导论》第三版的电子版,读者可以通过这份PDF文档深入学习书中涵盖的各种算法,如排序、搜索、图算法、动态规划、贪心算法、分治策略等。这些算法是计算机科学的基础,对于提升编程能力和解决复杂...
第八章,"动态规划",讲解了动态规划的基本原理和应用,如背包问题、最长公共子序列、编辑距离等。动态规划的关键在于找出最优子结构和重叠子问题。 第九章,"贪心算法",涉及贪心选择性质和最优子结构,如霍夫曼...
**第15章 排序算法** 排序是数据处理的基础,本章介绍各种排序算法: 1. 插入排序:简单直观的排序算法,适用于小规模或部分有序的数据。 2. 堆排序:基于完全二叉树的排序算法,时间复杂度O(n log n)。 3. 快速...
同时,对于无法用代码表示的部分,很可能涉及复杂的算法设计和分析,可能需要理解问题的复杂性、证明算法的正确性和效率,或者涉及到动态规划、回溯等高级技巧。 由于文件名称列表只给出了"chapter4",具体涵盖的...
《算法导论》第二十四章习题解答涵盖了各种高级算法问题,这些题目旨在深化对算法的理解,提升编程技能。在这一章中,我们通常会遇到动态规划、图论、最优化算法等主题。以下是部分习题的解析和知识点概述: 1. **...