什么是,自适应动态规划?
是人工智能学术语
自适应动态规划(Adaptive/approximate Dynamic Programming,ADP),又叫近似动态规划,是人工智能和控制领域发展而交汇形成的新兴学科。
ADP方法主要包括三种基本类型:启发式动态规划(Heuristic Dynamic Programming,HDP),双启发式动态规划(Dual Heuristic Programming,DHP)和全局双启发式动态规划(Globalized Dual heuristic Programming,GDHP)。这三种类型都包含三个模块,如果每个模块都用神经网络来代替,这样我们也称这三个模块为三个网络,即评价网络(Critic Network)、模型网络(Model Network)和执行网络(Action Network)。如果我们省略了模型网络,使得执行网络直接与评价网络相连接,这样的结构称为它们的动作依赖(Action-Dependent)形式,即ADHDP,ADDHP,ADGDHP。
全网大佬能推荐下比较通俗的动态规划的文章吗?有何推荐?
你好!
本人的原创连载《算法素颜》系列中的第6~8篇从全新的原创视角诠释了递归算法与动态规划的算法本质,并将之套路化、自动化。您可以关注本人的头条号,参考对应的文章:
《算法素颜(第6篇):再不会“降维打击”你就Out了!》:
《算法素颜(第7篇):史上最猛之递归屠龙奥义》:
《算法素颜(第8篇):史上最猛之递归屠龙奥义》:
动态规划和回溯算法区别?
动态规划和回溯算法都是常用的算法,但在解题思路和应用场景上有一些区别。
1. 解题思路:
- 动态规划:通过维护一个表格(通常是一个二维数组),将问题划分为若干个子问题,并将子问题的解保存在表格中,最后利用保存的结果求解原问题。动态规划的关键是找到问题的状态转移方程,利用已解决的子问题的解来求解当前问题。
- 回溯算法:通过逐步构建解空间树,遍历所有可能的解,当找到一个解时,记录下来或者直接使用,然后回退到上一个节点,继续进行搜索。回溯算法的核心是遍历解空间和剪枝,以减少搜索空间。
2. 应用场景:
- 动态规划:适用于具有重叠子问题和最优子结构的问题,例如最长公共子序列问题、背包问题等。动态规划常用于求解最优化问题,通过保存已解决的子问题的解,避免重复计算,从而提高效率。
- 回溯算法:适用于在搜索问题的解空间时,需要遍历所有可能的解的场景。回溯算法常用于求解排列组合问题、图的遍历等。
3. 时间复杂度:
- 动态规划:通过保存子问题的解,避免重复计算,时间复杂度通常是子问题个数乘以求解每个子问题的时间复杂度。
- 回溯算法:需要遍历解空间的所有可能解,时间复杂度往往比较高,取决于解空间的规模。
虽然动态规划和回溯算法有一些共同点,但在解题思路、应用场景和时间复杂度上存在一些差异,根据具体的问题特点来选择相应的算法。
回溯算法虽好,但是复杂度高,即便消除一些冗余计算,也只是「剪枝」,没有本质的改进。而动态规划就比较玄学了,经过各种改造, 从一个加减法问题变成子集问题,又变成背包问题,经过各种套路写出解法,又搞出状态压缩,还得反向遍历。
转化为背包问题注重三个细节点:
dp[i][j] i 索引从1开始; j 可以从0开始遍历 —— 因为此处背包包含 0重量物品。 注意分情况状态转移: j>=nums[i-1] 回溯-> 动规问题转化 == 整体等式的推导 以及 问题转换时的0-1背包问题 。
「回溯算法」需要记录每一个步骤、每一个选择,用于回答所有具体解的问题;
「动态规划」需要记录的是每一个步骤、所有选择的汇总值(最大、最小或者计数);
「贪心算法」由于适用的问题,每一个步骤只有一种选择,一般而言只需要记录与当前步骤相关的变量的值。
动态规划和回溯算法有以下区别:1. 动态规划是一种自底向上的算法思想,而回溯算法是一种自顶向下的算法思想。
2. 动态规划通过将问题分解为子问题,并将子问题的解存储起来,以避免重复计算,从而提高效率。
而回溯算法则是通过尝试所有可能的解决方案,直到找到满足条件的解。
3. 动态规划通常适用于具有重叠子问题和最优子结构性质的问题,而回溯算法适用于需要穷举所有可能解的问题。
4. 动态规划算法的时间复杂度通常较低,而回溯算法的时间复杂度较高,因为回溯算法需要遍历所有可能的解空间。
5. 动态规划算法的空间复杂度较高,因为需要存储子问题的解,而回溯算法的空间复杂度较低,因为只需要存储当前的解。
总结:动态规划和回溯算法在算法思想、解决问题的方式、时间复杂度和空间复杂度等方面存在明显的区别。
动态规划适用于具有最优子结构性质的问题,而回溯算法适用于需要穷举所有可能解的问题。
动态规划和回溯算法都是解决最优化问题的方法,但它们的实现方式和适用场景略有不同。以下是它们之间的主要区别:
1. 动态规划(Dynamic Programming):
动态规划是一种解决最优化问题的方法,通过将问题分解为更小的子问题来解决。这些子问题通常是相互独立的,因此可以并行计算。动态规划将每个子问题的解决方案存储起来,以便在后续计算中重用,从而提高计算效率。
动态规划适用于具有重叠子问题、最优子结构和无后效性的问题。这类问题通常可以通过某个状态转移方程来描述,通过迭代计算各个状态的最优解,最后得到全局最优解。
2. 回溯算法(Backtracking):
回溯算法是一种深度优先搜索方法,通过探索所有可能的解决方案来找到最优解。在搜索过程中,一旦发现当前路径不可能导致最优解,就会回退到上一步,尝试其他路径。
回溯算法适用于需要寻找所有可行解决方案的问题,或者需要找到所有最优解的问题。这类问题通常具有组合爆炸的特性,即随着问题规模的增大,可能的解决方案数量会急剧增加。因此,回溯算法在实际应用中需要谨慎处理效率问题。
总结:
动态规划和回溯算法都是解决最优化问题的有效方法,但适用场景不同。动态规划更适用于有状态转移方程、重叠子问题和最优子结构性质的问题;回溯算法更适用于需要寻找所有可行解决方案或所有最优解的问题。在实际应用中,需要根据问题的特性来选择合适的方法。
动态规划法和分治法的区别?
2. 分治法与动态规划实现方法:
① 分治法通常利用递归求解.
② 动态规划通常利用迭代法自底向上求解,但也能用具有记忆功能的递归法自顶向下求解.
3. 分治法与动态规划主要区别:
① 分治法将分解后的子问题看成相互独立的.
② 动态规划将分解后的子问题理解为相互间有联系,有重叠部分.
两者的区别是:
动态规划法:是把一个复杂的问题分成若干个子问题,动态规划的问题分解后的子问题通常是不互相独立的。若还用分治的话,会因为子问题太多以至于最后解决问题需要耗费指数级的时间。
分治法:将整个问题分解成若干小问题后再分而治之。如果分解得到的子问题相对来说还是太大,则可反复使用分治策略将这些子问题分成更小的同类型子问题,直至产生方便求解的子问题,必要时逐步合并这些子问题的解,从而得到问题的解。