技术标签: tensorflow 机器学习 ARPG游戏深度强化学习 深度学习
图示:
序贯决策,主要的方法是:马尔科夫决策过程。
一个马尔可夫过程叫:MDP。
一个MDP由一个五元组构成:S A P R r
S 是所有状态的集合
A 是所有动作的集合
P 是某状态S’在某A‘动作下的转移概率
策略P就是在状态S下做A的概率多大。
R 是奖励
r 是回报有时候也用G标示(gain)
当前状态,当前要做的动作,以及下一个状态,三者共同决定环境反馈给智能体,什么样的R(奖励),通常R是标量函数,返回一个标量,标量对应的向量,向量自带方向标量是一个值。
例如:
王者荣耀:R(还有200点血,施展加血魔法magic1,有400点血)=5
当前要做的动作是:施展加血魔法magic1,就是加血,下一个状态,加血.
这个5是自己认为可以设计的。
回报的概念就是:每个动作执行后,所有的R累加。回报是评估当前MDP的一个得分。
什么叫有模型的方法呢?
比如百度地图 能够瞬间给出A到B地点的 最短路径 ,是站在上帝视角上 得到了全局的城市交通数据 然后 直接最短路径求解 。
**无模型的方法,往往是用于不可能站在上帝视角,信息不够全的各种即时策略方法 **
Monte Carlo 方法 适用于工程学 和各个行业领域 以及数学问题 。
用MC去解决问题 主要有经典的三个步骤:
例如:
算一个不规则的 2D 面积 。
微积分:
用多个长方形切割开 这个不规则凹封闭曲线
只要长方形的宽足够的短,把各个长方形的面积累加 ,就非常接近这个不规则封闭曲线内部的面积 。
用Monte Carlo
直接拿200粒米 ,随机均匀的撒在方块内(撒出方块的不统计),最后 只要分别统计 在封闭曲线内的米的数量 A 和 在方块内 但是不在曲线内的米B , 这样 A/ (A+B) = 曲线内面积/方块面积,方块面积* A/ (A+B) = 曲线内面积。
我们以上的方法 用了同样的三个步骤:
AlphaGo 也用到了MC方法:
先是随机走(均匀撒米)
建立概率分布抽样(匹配棋盘结果,生成蒙特卡罗搜+
建立估计量:得到比较好的决策依据
MC方法特别适合 没有明显规律 或者规律很复杂 没有解析解的问题
区分的方式就是:
on-policy :agent(智能体)从环境学习的策略和它与环境交互的策略,一样。
off-policy:agent(智能体)从环境学习的策略和它与环境交互的策略,不一样。
on-policy例子:
如果每次了解到周围最好的动作值,就直接走过去。并且学习策略也一样(告诉自己的大脑,自己以后也要这样更新自己的价值表)
这种 和环境的交互策略 和 自己学习更新自己的行动决策依据的表 的 方案是一样的 就是on-policy。
off-policy 例子:
眼前有一块红烧肉,我脑中模拟自己吃了一口,模拟吃的时候很好吃,然后更新了一下策略表,告诉自己,吃这块红烧肉会得到奖励。关键是 : 我只是脑袋里模拟的吃了一口。这不代表和环境交互 ,真正的环境交互是:我实际怎么做了?
如果脑袋里模拟吃了一口后,更新策略表,告诉自己,吃红烧肉可以得到奖励。(这叫【学习】)如果是on-policy,那就会直接和环境交互的过程中,也会实际吃一口红烧肉这个动作。但是如果是off-policy,则可能采取和【学习】的时候模拟的做法不一样,就是说,学习的策略并不用于直接决策用于执行如何和环境交互。这个时候 ,off-policy的做法是,虽然吃红烧肉比当前状态s下做别的动作回报多。但是我不一定选它这叫off-policy ,我保留了 一定的概率 我会随机选 或者其他方法 。
这种方法的robust(鲁棒性)非常强。
大家知道,我们吃红烧肉,立马获得了当前状态下能够获得的最好R(回报),但是不代表吃红烧肉在未来若干个时间内是最好的选择。(比如带来了增肥,脂肪肝,三高)。如果按on-policy ,当前学习的策略可能并不代表未来 。但是智能体如果用on-policy,就会过于相信自己学到的眼前的东西。off-policy的智能体,则会说:虽然吃红烧肉我感觉是当前状态的最佳回报选择,但是我还是保留不吃的可能性,避免后面碰到更多的红烧肉,把我引入了某种深渊(三高和肥胖、亚健康和脂肪肝、肝癌、死亡)。这样 ,就不会一直吃红烧肉,偶尔还会不吃,去做别的事。这样才会有更多的机会学到新的可能性和探索新的优化。
几乎现在所有的深度强化学习应用,都用到了Q-Learning这一类的,off-policy的算法
Q-Learning 就是一个数学公式 比较简洁。
由公式看出:
s,a 对应的 Q 值等于 即时奖励 结合 未来奖励的 折扣discount
具体落地到怎么执行 可以用 bellman 公式:
举例:
第一步:
Q(饿了,吃红烧肉)= Reward(饿了,吃红烧肉) + Discount*max(Q(不饿了,吃红烧肉))
我们定义了如下的 MDP
S={饿了,不饿,很饱,超级胖,三高}
A={吃红烧肉,运动,吃素,看书}
choose_action(饿了,吃红烧肉)=不饿
R(饿了,吃红烧肉)=10
choose_action(不饿,吃红烧肉)=很饱
R(不饿,吃红烧肉)=0
choose_action(很饱,吃红烧肉)=超级胖
R(很饱,吃红烧肉)=-5
choose_action(超级胖,吃红烧肉)=三高
R(超级胖,吃红烧肉)=-20
第二步:
Q(饿了,吃红烧肉)= R(饿了,吃红烧肉) + Discountmax( R(不饿了,吃红烧肉) + Discountmax(Q(很饱,吃红烧肉)) )
再继续展开 就是更进一步 把 Q(很饱,吃红烧肉) 展开,其中 Discount 如果=1 ,那么 未来的所有步骤获得回报值 都会不打折扣的累加到当前的Q。如果Discount =0.6 ,就是说 每往后一步 回报值对当前Q估计决策 的 累加 逐步影响递减。
如何更新Q-Table
Q-Table就是S(s,a)
其中y= R + discount*max Q(S’,a)
Q是一张表,所以用Q-table 表示 ,老Q(s,a)值 的意思是 表还没更新的时候 对应的 Q(s,a)值 ,等同于python的 =。
Q-Table的更新 就是agent学习的过程,而agent每一次决策,则是 选取 argmax Q(s, )。
argmax 的意思是 比如 :集合A={2,5,1,3,6} max (A) = 6。argmax(A) = 4 。因为从0数起 , 6在序号4 。index=4 。argmax(A)的意思是 A里的最大值对应的 index
import numpy as np
import pandas as pd
import time
np.random.seed(2) #reproducible
class QLearning():
T=10 #target
W=-2 #wall
F=1 #flower
M=0# Moving road
MAP=[[W,W,W,W,W,W,W,W],
[W,0,0,0,0,0,F,W],
[W,0,0,0,0,0,F,W],
[W,0,W,W,W,0,W,W],
[W,0,W,T,0,0,F,W],
[W,0,W,W
文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib
文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang
文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些
文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器
文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距
文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器
文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn
文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios
文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql
文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...
文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120
文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数