当前位置: 首页 > news >正文

动态规划的核心性质——最优化原理 (Principle of Optimality)

好的,我们来详细解释一下动态规划的另一个核心性质——最优化原理 (Principle of Optimality)

这个原理是动态规划算法能够成立的基石,它与我们之前讨论的“无后效性”密切相关。


1. 什么是“最优化原理”?

最优化原理最早由动态规划的提出者、美国数学家理查德·贝尔曼 (Richard Bellman) 提出。其经典描述是:

“一个最优策略的子策略,对于它所对应的子问题来说,也必须是最优的。”
(An optimal policy has the property that whatever the initial state and initial decision are, the remaining decisions must constitute an optimal policy with regard to the state resulting from the first decision.)

这句话听起来有点绕,我们把它拆解成更通俗的语言:

  • 如果一个大问题的最优解包含了一个小问题的解,那么这个小问题的解也必须是它本身的最优解。
  • 换句话说,最优解的组成部分也必须是局部的最优解

2. 一个直观的类比:最短路径

假设你要开车从北京广州,并且找到了最短的一条路线。这条路线恰好经过了武汉

北京 → … → 武汉 → … → 广州 (这是全程的最短路线)

那么,最优化原理告诉我们:

  • 北京武汉的这段路,必然是所有从北京到武汉的路线中最短的
  • 武汉广州的这段路,也必然是所有从武汉到广州的路线中最短的

为什么?
我们可以用反证法来思考:假设从北京到武汉的这段路不是最短的,那么肯定存在另一条更短的路从北京到武汉。如果我们用这条更短的路替换掉原来路线中的北京-武汉部分,那么全程的总路程就会变得更短。这就与我们“已经找到了全程最短路线”的前提相矛盾了。

因此,一个全局最优解,其内部的每一个子决策序列,相对于其起点和终点,也必须是局部最优的。这就是最优化原理。

3. 在动态规划问题中的体现

动态规划通过状态转移方程来求解问题。这个方程的设计本身就蕴含了最优化原理。

我们以经典的0-1背包问题为例:

  • 问题:有一组物品,每个物品有自己的重量和价值。给定一个固定容量的背包,如何选择物品,使得装入背包的物品总价值最高?

  • 状态定义dp[i][w] 表示在前 i 个物品中,选择若干个放入容量为 w 的背包中所能获得的最大价值。

  • 决策:对于第 i 个物品,我们只有两种选择:

    1. 不放入背包:那么 dp[i][w] 的值就等于只考虑前 i-1 个物品在容量 w 下的最大价值,即 dp[i-1][w]
    2. 放入背包:前提是背包能装得下。此时的价值等于第 i 个物品的价值,加上“在前 i-1 个物品中,选择若干个放入容量为 w - weight[i] 的背包中所能获得的最大价值”。这个子问题的解就是 dp[i-1][w - weight[i]]
  • 状态转移方程
    dp[i][w] = max( dp[i-1][w], value[i] + dp[i-1][w - weight[i]] )

  • 最优化原理的体现
    这个方程明确地告诉我们:要求解“前 i 个物品,容量 w”这个大问题的最优解,我们依赖于两个子问题的最优解:

    1. “前 i-1 个物品,容量 w”的最优解 (dp[i-1][w])
    2. “前 i-1 个物品,容量 w-weight[i]”的最优解 (dp[i-1][w-weight[i]])

    我们相信 dp[i-1][w]dp[i-1][w - weight[i]] 已经包含了它们各自子问题的最优信息。我们用这些子问题的最优解来构造当前问题的最优解。这正是最优化原理的直接应用。

总结:最优化原理 vs. 无后效性

  • 最优化原理(Optimal Substructure):关注的是解的结构。它断言全局最优解可以由局部最优解构建而成。这是我们能够写出状态转移方程的理论依据
  • 无后效性(No Aftereffect):关注的是状态的定义。它要求当前状态包含了所有对未来决策有用的信息,我们不需要回头看历史路径。这是最优化原理能够成立的前提条件

可以说,正因为状态的定义满足“无后效性”,我们才能够保证子问题的最优解可以被直接用于构建父问题的最优解,从而使得“最优化原理”成立。 这两个性质是动态规划一体两面、相辅相成的核心支柱。


但是像是下围棋和象棋总是存在着某种程度上的先弃后取?
难道AI能够判断出先手和势的存在并且放到价值函数的计算里面?
那这可真的是太厉害了…

http://www.lryc.cn/news/590389.html

相关文章:

  • git的diff命令、Config和.gitignore文件
  • Python编程基础(六)| 用户输入和while循环
  • slurm设置用户节点和分区权限
  • Telink的GPIO
  • 系统思考场景应用
  • Node.js基础用法
  • 3DGS之COLMAP
  • iOS 抓包工具选择与配置指南 从零基础到高效调试的完整流程
  • VR 污水厂初体验:颠覆传统认知​
  • CSS全面系统教程:从入门到精通网页样式设计
  • 安全初级作业2
  • 基于SpringBoot+Uniapp球场预约小程序(腾讯地图API、Echarts图形化分析、二维码识别)
  • Vue在线预览Excel和Docx格式文件
  • 【IDEA】格式化代码工具配置
  • STM32硬件I2C的注意事项
  • c语言-数据结构-二叉树的遍历
  • 2025华为ODB卷-宜居星球改造计划200分-三语言题解
  • Jenkins credentials 增加了github credential 但是在Git SCM 凭证中不显示
  • Redis持久化RDB和AOF实现原理详细介绍
  • 将Android Studio创建的一个apk工程放到Android15源码中构建
  • mysql- 存储结构、存储函数,批量生成测试数据
  • ssl相关命令生成证书
  • 代码随想录算法训练营第五十天|图论part1
  • Python 日志轮换处理器的参数详解
  • watermark的作用
  • JS逆向 - YandexSmartCaptcha (worker线程)
  • Spring Boot 解决跨域问题
  • 基于SD-WAN的智慧高速解决方案:高效、低成本的智能交通实践
  • 高频面试雷区:Java Object六大核心方法源码剖析
  • socket和websocket的区别