首页 > 其他分享 >强化学习代码实战-02马尔科夫决策(蒙特卡洛方法)

强化学习代码实战-02马尔科夫决策(蒙特卡洛方法)

时间:2022-11-08 21:12:02浏览次数:48  
标签:02 rewards get 0.0 马尔科夫 states values 蒙特卡洛 100.0

import numpy as np
import random

#状态转移概率矩阵
#很显然,状态4(第5行)就是重点了,要进入状态4,只能从状态2,3进入(状态2,3对于完成此项任务价值很大)
P = np.array([
    [0.5, 0.5, 0.0, 0.0, 0.0],
    [0.5, 0.0, 0.5, 0.0, 0.0],
    [0.0, 0.0, 0.0, 0.5, 0.5],
    [0.0, 0.1, 0.2, 0.2, 0.5],
    [0.0, 0.0, 0.0, 0.0, 0.0],
])

#反馈矩阵,-100的位置是不可能走到的。奖励
R = np.array([
    [-1.0, 0.0, -100.0, -100.0, -100.0],
    [-1.0, -100.0, -2.0, -100.0, -100.0],
    [-100.0, -100.0, -100.0, -2.0, 0.0],
    [-100.0, 1.0, 1.0, 1.0, 10.0],
    [-100.0, -100.0, -100.0, -100.0, -100.0],
])
P, R

# 生成一个chain(采样生成样本)
def get_chain(max_lens):
    states = []
    rewards = []
    
    # 随机选取一个状态作为起点(非4)
    s = random.choice(range(4))
    states.append(s)
    
    for _ in range(max_lens):
        # 依据P的概率分布,找到下一个状态
        s_next = np.random.choice(np.arange(5), p=P[s])
        # 得到对应的奖励
        r = R[s, s_next]
        # 更新状态,继续循环
        s = s_next
        states.append(s)
        rewards.append(r)
        
        if s==4:
            break
    return states, rewards

# 生成N个链
def get_chains(N, max_lens):
    states, rewards = [], []
    for _ in range(N):
        s, r = get_chain(max_lens)
        states.append(s)
        rewards.append(r)
    return states, rewards

# 给定一条链,计算回报
def get_values(rewards):
    V = 0
    for i, r in enumerate(rewards):
        # 折扣回报,随着步数衰减,权重越来越低
        V += 0.9**i*r
    return V

# 蒙特卡洛方法评估每个状态的价值
def get_values_by_monte_carlo(states, rewards):
    # 记录5个不同开头的价值
    values = [[] for i in range(5)]
    for s, r in zip(states, rewards):
        # 计算不同开头的价值
        values[s[0]].append(get_values(r))
    # 每个开头的平均价值即时该状态的价值评估
    return [np.mean(e) for e in values]

get_values_by_monte_carlo(*get_chains(1000, 20))
"""
[-2.26601097881321,
 -1.5128666270632725,
 2.094763097612923,
 6.982357335671139,
 nan]
"""

计算出状态2,3对于完成目标意义重大

标签:02,rewards,get,0.0,马尔科夫,states,values,蒙特卡洛,100.0
From: https://www.cnblogs.com/demo-deng/p/16871225.html

相关文章

  • 【2022-11-08】Git使用
    一、Git介绍#Git简介Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很......
  • 702001 TXT 22G101-2图集的简介
    22G101-2图集的全称:混凝土结构施工图平面整体表示方法制图规则和构造详图(现浇混凝土板式楼梯)本图集制图规则适用于现浇混凝土板式楼梯。......
  • DASCTF X CBCTF 2022九月挑战赛
    DASCTFXCBCTF2022九月挑战赛期中考结束了有点时间,做点题熟一下手,欢迎讨论dino3D审计源码找到了发送请求的部分importrequestsfromhashlibimportmd5import......
  • [蓝桥杯 2022 省 B] 积木画
    [蓝桥杯2022省B]积木画题目描述小明最近迷上了积木画,有这么两种类型的积木,分别为\(I\)型(大小为\(2\)个单位面积)和\(L\)型(大小为\(3\)个单位面积):同时......
  • 【流水】2022.11.08
    今天有是信息课看python,孩子人傻了赶紧luogu上用python水了几道题。今天考试除了暴力分拿的十分健全就没啥优点了可怜紫飨被gank到三机房去了,可怜(悲听说要......
  • 2022.11.08 NOIP2022 模拟赛五
    「LibreOJNOIPRound#1」DNA序列注意到\(k=10\),\(|\Sigma|=4\),故本质不同的子串个数只有\(4^10\)种,可以直接压位存下来。时间复杂度\(O(nk)\)。Codeconstint......
  • Linux命令基础——08-linux-day02(vim-gcc-library)
    在学习Linux命令基础总结了笔记,并分享出来。08-linux-day02(vim-gcc-library)目录:一、学习目标二、vim1、vim光标的移动2、vim删除内容3、vim复制粘贴与可视模式4、vim查找......
  • 2022-11 学习计划
    2022-11学习计划技术redis源码基本类型aeNet集群技术实现调优和配置项分析分布式锁事务,内存,阻塞,发布,订阅redis+mysql双写一致性node源码......
  • NOIP2022游寄
    本文中部分人名使用mrfz的材料代替(与CSP游寄中不一定对应)11.7计算几何,教练连续讲了3hrs没有休息/jk晚上写了一会complex的板子。11.8上午写了个凸包。下午是线段树合......
  • 2022ICPC区域赛参后感悟
    第一次参加正式的大类赛事,在某种程度上挺激动的。我呢,可以说是刚步入竞赛一年,在此期间遇见了一些志同道合的朋友,最重要的是遇见了我的队友。开始前,我幻想过我们小队可以超......