David Silver Lecture 3: planning by dynamic programming

news2024/11/24 6:19:44

1 Introduction

1.1 定义

定义:

Dynamic: sequential or temporal component to the problem
Programming: optimising a program: a policy

核心思想:
将复杂问题拆解成简单子问题

1.2 Requirements for dynamic programming

  • Optimal substructure
    • principle of optimality applies
    • optimal solution can be decomposed into subproblems
  • overlapping subproblems
    • subproblem会调用很多次
    • solution需要存储起来和进行复用
  • MDP 满足以下性质
    • bellman 方程提供递归的分解
    • value 函数存储和复用solutions

1.3 planning by dynamic programming

几种假设:
1)DP 假设对MDP可观测结果
2)for prediction
在这里插入图片描述
3)for control
在这里插入图片描述

1.4 动态规划的其他应用

  • Scheduling algorithm
  • String algorithms (e.g. sequence alignment)
  • Graph algorithms (e.g. shortest path algorithms)
  • Graphical models (e.g. Viterbi algorithm)
  • Bioinformatics (e.g. lattice models)

2 Policy Evaluation

在这里插入图片描述
动态问题的结构可以拆成下面三个部分:
state transition s n = f ( s n − 1 , a n ) value function J ∗ ( s ) = min ⁡ a ∈ A { l ( s , a ) + γ ∑ s ′ ∈ S P ( s ′ ∣ s , a ) J ∗ ( s ′ ) } policy π ( s ) = arg ⁡ min ⁡ a { l ( s , a ) + γ ∑ s ′ ∈ S P ( s ′ ∣ s , a ) J ∗ ( s ′ ) } \begin{aligned} \text{state transition} & \quad s_{n} = f(s_{n-1}, a_{n}) \\ \text{value function} & \quad J^*(s) = \min \limits_{a\in A} \{l(s,a)+\gamma \sum_{s' \in S} P(s' | s, a) J^*(s')\} \\ \text{policy} & \quad \pi(s)=\arg\min \limits_{a} \{l(s,a)+\gamma \sum_{s' \in S} P(s' | s, a) J^*(s')\} \end{aligned} state transitionvalue functionpolicysn=f(sn1,an)J(s)=aAmin{l(s,a)+γsSP(ss,a)J(s)}π(s)=argamin{l(s,a)+γsSP(ss,a)J(s)}
代码的结构大概是这样的

```matlab
for state = 1:num_state
	for action = 1:nun_action
		Q = instaneous_cost(state, action);
		next_state = transition(state, action);
		Q = Q + J(next_state);
	end
end

用iterative policy Evaluation 表示:
在这里插入图片描述
在这里插入图片描述

解决一个gridworld的问题,首先,我们定义一个简化的 4x4 网格世界,其中有四个可能的动作:向上、向下、向左、向右。在这个示例中,我们将使用均匀随机策略,即在每个状态下,每个动作的概率都相等。
在这里插入图片描述

% Initialize the grid world and parameters
grid_size = 4;
num_actions = 4;
discount_factor = 1.0;
theta = 1e-4;

% Initialize state-value function
V = zeros(grid_size);

% Define the reward function
reward = -1;

% Define the transition probabilities for the uniform random policy
policy = ones(grid_size, grid_size, num_actions) / num_actions;

% Iterative Policy Evaluation
while true
    delta = 0;
    
    % Loop over all states
    for i = 1:grid_size
        for j = 1:grid_size
            
            % Skip the start and terminal states
            if (i == 1 && j == 1) || (i == grid_size && j == grid_size)
                continue;
            end
            
            % Store the old value
            old_value = V(i, j);
            
            % Calculate the new value by averaging over actions
            new_value = 0;
            for action = 1:num_actions
                [next_i, next_j] = apply_action(i, j, action);
                reward_next = (next_i == grid_size && next_j == grid_size) * (1 - discount_factor);
                new_value = new_value + policy(i, j, action) * (reward + reward_next + discount_factor * V(next_i, next_j));
            end
            
            % Update the value function
            V(i, j) = new_value;
            delta = max(delta, abs(old_value - new_value));
        end
    end
    
    % Check for convergence
    if delta < theta
        break;
    end
end

% Apply the given action to the current state (i, j)
function [next_i, next_j] = apply_action(i, j, action)
    grid_size = 4;
    
    % Actions: 1 = up, 2 = down, 3 = left, 4 = right
    if action == 1
        next_i = max(i - 1, 1);
        next_j = j;
    elseif action == 2
        next_i = min(i + 1, grid_size);
        next_j = j;
    elseif action == 3
        next_i = i;
        next_j = max(j - 1, 1);
    else
        next_i = i;
        next_j = min(j + 1, grid_size);
    end
end

3 policy Iteration

3.1 how to improve policy

Give a policy π \pi π

  • Evaluate the policy π \pi π
    V π ( s ) = ∑ a ∈ A π ( a ∣ s ) [ R ( s , a ) + γ ∑ s ′ ∈ S P ( s ′ ∣ s , a ) V π ( s ′ ) ] V_{\pi}(s) = \sum_{a \in \mathcal{A}} \pi(a|s) \left[R(s, a) + \gamma \sum_{s' \in \mathcal{S}} P(s'|s, a) V_{\pi}(s')\right] Vπ(s)=aAπ(as)[R(s,a)+γsSP(ss,a)Vπ(s)]
    Improve the policy by acting greedily with respect to v π v_{\pi} vπ
    π ′ = g r e e d y ( v π ) \pi'=greedy(v_{\pi}) π=greedy(vπ)

每一步都找出optimal的value function, 作为state的value function
在这里插入图片描述
在这里插入图片描述

这里我们将使用一个简单的网格世界(Grid World)环境作为Policy Iteration的范例。这个环境中,智能体(agent)可以执行四个操作:上、下、左、右。智能体的目标是从初始位置移动到终点位置,同时最小化行动次数。
假设我们有一个4x4的网格世界,终点位置在右下角。每次行动的奖励(reward)是-1。使用Policy Iteration方法,我们将找到一个策略,使得智能体以最少的行动次数到达终点。

import numpy as np

def gridworld_policy_iteration():
    n_states = 16
    n_actions = 4
    terminal_state = 15
    rewards = -1 * np.ones((n_states, n_actions))
    rewards[terminal_state, :] = 0

    transition_matrix = np.zeros((n_states, n_actions, n_states))

    for state in range(n_states):
        for action in range(n_actions):
            if state == terminal_state:
                transition_matrix[state, action, state] = 1
                continue

            next_state = state

            if action == 0:  # Up
                next_state = max(state - 4, 0)
            elif action == 1:  # Down
                next_state = min(state + 4, n_states - 1)
            elif action == 2:  # Left
                next_state = state - 1
                if state % 4 == 0:
                    next_state = state
            elif action == 3:  # Right
                next_state = state + 1
                if (state + 1) % 4 == 0:
                    next_state = state

            transition_matrix[state, action, next_state] = 1

    gamma = 0.99
    max_iter = 1000
    theta = 1e-10

    policy = np.ones((n_states, n_actions)) / n_actions

    for _ in range(max_iter):
        policy_stable = True

        # Policy Evaluation
        V = np.zeros(n_states)
        while True:
            delta = 0
            for state in range(n_states):
                v = V[state]
                V[state] = np.sum(policy[state, :] * (rewards[state, :] + gamma * transition_matrix[state, :, :] @ V))
                delta = max(delta, abs(v - V[state]))
            if delta < theta:
                break

        # Policy Improvement
        for state in range(n_states):
            old_action = np.argmax(policy[state, :])
            action_returns = np.zeros(n_actions)
            for action in range(n_actions):
                action_returns[action] = rewards[state, action] + gamma * np.dot(transition_matrix[state, action, :], V)
            best_action = np.argmax(action_returns)
            policy[state, :] = 0
            policy[state, best_action] = 1

            if old_action != best_action:
                policy_stable = False

        if policy_stable:
            break

    optimal_policy = policy
    state_values = V

    return optimal_policy, state_values

optimal_policy, state_values = gridworld_policy_iteration()
print("Optimal Policy:")
print(optimal_policy)
print("State Values:")
print(state_values)

代码的关键在于

# 找到最大reward对应的action,对其policy为1,其他为0
            for action in range(n_actions):
                action_returns[action] = rewards[state, action] + gamma * np.dot(transition_matrix[state, action, :], V)
            best_action = np.argmax(action_returns)
            policy[state, :] = 0
            policy[state, best_action] = 1

在这里插入图片描述

> consider

4 value iteration

4.1 value iteration in MDPs

4.1.1 principle of optimality

任何的优化策略可以划分成两个组成部分,
1.第一步采用最优动作 A ∗ A_{*} A
2.对successor state采用optimal policy
在这里插入图片描述

4.1.2 deterministic value iteration

  • 子问题的solution v ∗ ( s ′ ) v_{*}(s') v(s)
  • 问题的solution v ∗ ( s ) v_{*}(s) v(s)可以通过往前走一步得到
    在这里插入图片描述
  • 直觉理解,start with final rewards and work backwards
  • still works with loopy, stochastic MDPs
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    值迭代的思想非常简单,代码看起来更美观一点
import numpy as np

# GridWorld environment
rows = 4
cols = 4
terminal_states = [(0, 0), (rows-1, cols-1)]
actions = [(0, 1), (1, 0), (0, -1), (-1, 0)]

def is_valid_state(state):
    r, c = state
    return 0 <= r < rows and 0 <= c < cols and state not in terminal_states

def next_state(state, action):
    r, c = np.array(state) + np.array(action)
    if is_valid_state((r, c)):
        return r, c
    return state

# Value iteration
def value_iteration(gamma=1, theta=1e-6):
    V = np.zeros((rows, cols))
    while True:
        delta = 0
        for r in range(rows):
            for c in range(cols):
                state = (r, c)
                if state in terminal_states:
                    continue

                v = V[state]
                max_value = float('-inf')
                for a in actions:
                    next_s = next_state(state, a)
                    value = -1 + gamma * V[next_s]
                    max_value = max(max_value, value)
                V[state] = max_value
                delta = max(delta, abs(v - V[state]))

        if delta < theta:
            break
    return V

# Find optimal policy
def find_optimal_policy(V, gamma=1):
    policy = np.zeros((rows, cols, len(actions)))
    for r in range(rows):
        for c in range(cols):
            state = (r, c)
            if state in terminal_states:
                continue

            q_values = np.zeros(len(actions))
            for i, a in enumerate(actions):
                next_s = next_state(state, a)
                q_values[i] = -1 + gamma * V[next_s]
            optimal_action = np.argmax(q_values)
            policy[state][optimal_action] = 1
    return policy

# Find the shortest path using the optimal policy
def find_shortest_path(policy):
    state = (0, 0)
    path = [state]
    while state != (rows-1, cols-1):
        action_idx = np.argmax(policy[state])
        state = next_state(state, actions[action_idx])
        path.append(state)
    return path

V = value_iteration()
policy = find_optimal_policy(V)
path = find_shortest_path(policy)

print("Shortest path:", path)

5 extensions to DP

5.1 Asynchronous Dynamic Programming

在这里插入图片描述
在这里插入图片描述

5.1.1 in place dynamic programming

  • synchronuous value iteration
    在这里插入图片描述
  • in place value iteration
    在这里插入图片描述

5.1.2 prioritised sweeping

  • Use magnitude of Bellman error to guide state selection, e.g.
    在这里插入图片描述

5.1.3 real time dp

在这里插入图片描述

在这里插入图片描述

6 Contraction Mapping

类似于李雅普诺夫稳定性的定义

6.1技术问题

在这里插入图片描述

6.2 value function space

在这里插入图片描述
在这里插入图片描述

6.3 bellman expectation backup is a contraction

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/489753.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【SWAT水文模型】SWAT水文模型建立及应用第三期:基于世界土壤数据库HWSD建立土壤库(待更新)

SWAT水文模型建立及应用&#xff1a;土壤库建立 1 简介2 土壤数据下载2.1 数据下载方式2.1.1 世界土壤数据库HWSD数据2.1.2 中国土壤数据库 2.2 数据下载 3 土壤数据的准备3.1 SWAT土壤数据库参数3.2 土壤质地转化3.3 土壤参数的提取3.4 其他变量的提取3.5 土壤类型分布图的处理…

高级IO涉及的编程模型

目录 五种IO模型引入IO模型阻塞IO非阻塞IO信号驱动IOO多路转接异步IO IO重要概念同步通信 vs 异步通信阻塞 vs 非阻塞 其他高级IO 非阻塞IOfcntl基于fcntl将文件描述符设置为非阻塞轮询方式读取标准输入 I/O多路转接之select初识selectselect函数原型参数timeout取值fd_set结构…

React Native中防止滑动过程中误触

React Native中防止滑动过程中误触 在使用React Native开发的时&#xff0c;当我们快速滑动应用的时候&#xff0c;可能会出现误触&#xff0c;导致我们会点击到页面中的某一些点击事件&#xff0c;误触导致页面元素响应从而进行其他操作,表现出非常不好的用户体验。 一、问题…

Kafka安装以及入门基本命令操作

文章目录 1.单节点搭建1.1 下载安装包1.2 配置环境变量1.3 配置配置文件1.4 启动启动zookeeper启动kafka 1.5 创建启动脚本startKafka.sh 2.简单的使用2.1 创建topic2.2 查看topic2.3 producer生产数据2.4 consumer消费者拉取数据 1.单节点搭建 1.1 下载安装包 #解压 tar -xz…

Android framework的底层原理,再不看就真有可能被淘汰

前言 从事Android开发的人都知道&#xff0c;目前市面上有各种类型跨平台技术诞生&#xff0c;严重冲击了Android市场&#xff0c;越来越多的Android开发者不再做移动应用开发&#xff0c;而另一方面&#xff0c;系统开发由于其复杂的逻辑&#xff0c;形成了独有的核心竞争力&…

Java 基础进阶篇(一)—— String 与 StringBuilder

文章目录 一、String 类概述二、String 创建对象的方式2.1 创建对象的两种方式2.2 面试&#xff1a;两种方式的区别 ★2.3 常见面试题 ★ 三、String 类常用方法3.1 字符串内容比较3.2 常用 API&#xff1a;遍历、截取、替换、分割 四、StringBuilder 字符串操作类4.1 构造器4.…

JavaScript 数据类型判断

&#xff08;生活的道路一旦选定&#xff0c;就要勇敢地走到底&#xff0c;决不回头。——左拉&#xff09; typeof typeof是在javascript编码过程中最常用的判断数据类型的方法&#xff0c;常用来判断数字&#xff0c;字符串&#xff0c;布尔值和undefind console.log(typeo…

ROS Noetic版本 rosdep找不到命令 不能使用的解决方法

使用rosdep指令来安装开源包所需的依赖是很方便的&#xff0c;本文主要介绍ROS Noetic版本中使用rosdep&#xff0c;报错找不到命令 &#xff0c;rosdep不能使用的解决方法。 rosdep&#xff1a;找不到命令 Command rosdep not found, but can be installed with:sudo apt ins…

怎么取消parallels更新,关闭Parallels Desktop 更新提示

自动更新问题 使用Parallels Desktop一段时间后&#xff0c;会主动提示更新&#xff0c;MacOS上最好的虚拟机&#xff1a;Parallels Desktop&#xff0c;但在使用过程中每次启动都要检查更新&#xff0c;比较烦人 如图&#xff1a; 解决方法 取消parallels更新 点击Parall…

v4l2框架

v4l2框架 文章目录 v4l2框架框架1.硬件相关层uvc_probeuvc_register_chainsuvc_register_termsuvc_register_video 2.核心层__video_register_device 3.虚拟视频驱动vivid分析入口vivid_init注册vivid平台驱动vivid_probevivid_create_instance 框架 1.硬件相关层 driver/medi…

2023 hnust 大三下 嵌入式 期中考试复习笔记

前言 ★&#xff1a;重点※&#xff1a;补充内容❓&#xff1a;还没搞懂的内容主要来源&#xff1a;教材、PPT、百度百科、AI重点来源&#xff1a;4-6班感谢&#xff1a;lyf总结得很草率&#xff0c;因为没听过课&#xff0c;也玩不懂 重点汇总 考试题型 选择&#xff08;40…

C#_Struct与Class的差异

简述 struct属于值类型&#xff0c;class属于引用类型 存储地址 struct储存于栈&#xff0c;class储存于堆&#xff08;class于栈中储存引用&#xff09; 传参性质 struct属于值传递&#xff0c;在函数内对参数进行修改&#xff0c;不会修改struct class处于引用传递&…

day40—选择题

文章目录 1.上网的时候&#xff0c;访问某个网页却突然出现了某个运营商的网页&#xff08;如联通、电信&#xff09;。出现此问题可能的原因是&#xff08;A&#xff09;2.某浏览器发出的HTTP 请求报文如下&#xff0c;下列叙述中&#xff0c;错误的是&#xff08;C&#xff0…

阿里云CentOS服务器安装Redis教程(一步步操作)

使用阿里云服务器ECS安装Redis数据库流程&#xff0c;操作系统为CentOS 7.6镜像&#xff0c;在CentOS上安装Redis 4.0.14&#xff0c;云服务器选择的是持久内存型re6p实例&#xff0c;新手站长分享阿里云CentOS服务器安装Redis流程方法&#xff1a; 目录 在CentOS系统中部署R…

【内网】面试·HVV专题

【内网】面试HVV专题 1.目标主机没有nc时如何获取反向shell2.说说你了解的隧道技术SSH隧道HTTP/HTTPS协议DNS协议1.目标主机没有nc时如何获取反向shell Python反向shell执行如下命令,在VPS上监听本地2222端口 nc -lvp 2222在目标主机上执行如下命令: bash反向shell执行如下命…

数据结构/栈实现队列

前言 在学习数据结构的过程当中&#xff0c;我们会学到栈和队列&#xff0c;在本篇文章中&#xff0c;重点讲解的是栈实现队列&#xff0c;故关于栈和队列的讲解只是简单带过。 一、栈 栈是一种后进先出的线性表&#xff0c;即只能在固定的一端进行插入和删除。 栈 方法 Stac…

(2)Qt的UI入门

目录 1. QWidget类&#xff08;重点&#xff09; 2. 子组件 1. QWidget类&#xff08;重点&#xff09; QWidget类是Qt中所有组件和窗口的基类&#xff0c;其内部规定了组件和窗口的基本规则和功能。 Qt中每个属性的文档中都有Access functions部分&#xff0c;表示其支持的读写…

机器学习实战教程(十二):聚类算法Kmeans

聚类概念 聚类是一种无监督的机器学习方法&#xff0c;它主要是通过在数据集中找到相似的样本并将它们分组来发现数据中的模式和结构。聚类算法可以将数据分成具有相似特征的组&#xff0c;每个组被称为一个簇。 常见的聚类算法有以下几种&#xff1a; K-means聚类算法&#…

python面向对象三大特性详解 - 封装 继承 多态

前言 面向对象编程有三大特性&#xff1a;封装、继承、多态&#xff0c;本文带大家来认识和了解这三个特性~ 补充 - 新式类 & 经典类 在python2.x中&#xff0c;新式类是继承了object类的子类&#xff0c;以及该子类的子类 子子类...&#xff1b;经典类就是没有继承没有…

java基础入门-05

Java基础入门-05 13、面向对象进阶&#xff08;static&继承&#xff09;1.1 如何定义类1.2 如何通过类创建对象1.3 封装1.3.1 封装的步骤1.3.2 封装的步骤实现 1.4 构造方法1.4.1 构造方法的作用1.4.2 构造方法的格式1.4.3 构造方法的应用 1.5 this关键字的作用1.5.1 this关…