动态规划的一个简单列子

该博客介绍了如何使用动态规划解决一个矩阵寻路问题,从左上角出发,每次只能向右或向下移动,目标是找到路径和最小的路径。通过分析得出状态转移方程dp[n][m] = min(dp[n-1][m], dp[n][m-1]),以此求解最小路径和。" 27971435,2276703,Unity 3D游戏开发:Label控件详解,"['Unity', '游戏开发', 'GUI系统', '用户界面', '编程']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:
有一个矩阵map,它每个格子有一个权值。从左上角的格子开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有的路径中最小的路径和。
* 给定一个矩阵map及它的行数n和列数m,请返回最小路径和

分析:
设dp[n][m]为走到n*m位置的路径长度,那么显而易见dp[n][m] = min(dp[n-1][m],dp[n][m-1]);

代码:

public class Dynamaic {
    public static void main(String[] args) {
        int[][]  map={
  
  {
  
  2,6,9},{
  
  3,7,1},{
  
  9,2,7}};

        
### 贝尔曼方程的代码示例 以下是基于贝尔曼方程实现的一个简单状态价值迭代算法的 Python 代码示例。此代码模拟了一个线性网格世界的环境,并通过动态规划方法求解最优状态价值函数。 ```python import numpy as np # 定义环境参数 NUM_STATES = 5 # 线性世界的状态数量 (编号0-4) GAMMA = 0.9 # 折扣因子 THETA = 1e-5 # 收敛阈值 TERMINAL_STATE = 4 # 终止状态编号 # 初始化状态转移概率和奖励表 P = { (0, 'right'): [(0.8, 1, 0), (0.2, 0, -1)], (1, 'right'): [(0.8, 2, 0), (0.2, 1, -1)], (2, 'right'): [(0.8, 3, 0), (0.2, 2, -1)], (3, 'right'): [(0.8, 4, 1), (0.2, 3, -1)] } # 初始化状态价值函数 V = np.zeros(NUM_STATES) def bellman_iteration(): """ 使用贝尔曼方程进行状态价值迭代。 """ while True: delta = 0 # 记录本次迭代的最大变化量 for state in range(NUM_STATES): if state == TERMINAL_STATE: # 终止状态无需更新 continue v_old = V[state] # 当前状态的旧价值 action = 'right' # 假设只有一种动作 'right' # 更新状态价值函数 V_new = sum([p * (r + GAMMA * V[s_prime]) for p, s_prime, r in P.get((state, action), [])]) V[state] = V_new # 更新最大变化量 delta = max(delta, abs(v_old - V[state])) # 判断是否满足收敛条件 if delta < THETA: break bellman_iteration() # 输出最终状态价值函数 for state in range(NUM_STATES): print(f"State {state}: Value = {V[state]:.3f}") ``` --- ### 代码解释 1. **初始化环境参数**: - `NUM_STATES`: 定义了线性世界的总状态数。 - `GAMMA`: 设置折扣因子,用于平衡当前奖励与未来奖励之间的权重[^1]。 - `THETA`: 设定收敛阈值,当状态价值的变化小于该值时认为已经收敛。 - `TERMINAL_STATE`: 指定了终止状态的位置。 2. **状态转移概率和奖励表 (`P`)**: - 字典结构存储每个状态下的动作以及对应的转移概率、下一状态和奖励。 - 例如 `(0, 'right')` 表示从状态 0 执行动作为右移的情况。 3. **状态价值函数 (`V`)**: - 数组形式保存每个状态的价值初始值为零。 4. **贝尔曼迭代逻辑**: - 遍历所有非终止状态,按照贝尔曼方程更新状态价值函数。 - 迭代停止条件为两次连续迭代间的最大变化量小于设定的阈值 `THETA`。 5. **输出结果**: - 最终打印每个状态对应的最佳价值估计。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值