【强化学习】基于蒙特卡洛MC与时序差分TD的简易21点游戏应用
1. 本文将强化学习方法(MC、Sarsa、Q learning)应用于“S21点的简单纸牌游戏”。
类似于Sutton和Barto的21点游戏示例,但请注意,纸牌游戏的规则是不同且非标准的。
2. 为方便描述,过程使用代码截图,文末附链接。(如果耐心读完的话)
一. S21环境实现
游戏的规则我们设置如下:
- 游戏是用无限副牌进行的(即用替换牌进行采样)
- 从牌组中抽取的每一张牌的值都在1到10之间(均匀分布),颜色为红色(概率0.4)或黑色(概率0.6)。
- 此游戏中没有王牌或图片牌。
- 在游戏开始时,玩家和发牌人都抽到一张黑卡(双方都可以完全观察)
- 每轮玩家可以选择停止拿牌stick或继续拿牌hit
- 如果玩家hit,则从牌组中抽取另一张牌
- 如果玩家stick,她将不会收到更多的牌
- 黑色牌会增加玩家的牌值,红色牌不改牌值(等于无效)
- 如果玩家的总和超过21,或小于1,则她将输掉游戏(奖励-1)
- 如果玩家stick,则发牌人开始它的回合。对于大于等于20的总和,庄家总是保持stick,否则就会继续拿牌hit。如果经销商爆牌,则玩家获胜;否则总和最大的玩家获胜。
- 获胜(奖励+1)、失败(奖励-1)或平局(奖励0)
相比复杂的21点游戏,本游戏主要简化如下:
1. 可以无视前面已发的牌的牌面,不需要根据开始拿到的牌来推断后续发牌的概率。
2. 庄家和玩家分开游戏,并非轮流决定拿牌还是弃牌。
3. 牌值从1-10,且1的值不会变化。
4. 庄家策略固定,总和<20时持续拿牌。
根据任务1,我们针对上述规则定义相关类如下:
环境类Envi功能如下:
- 主要记录当前玩家和庄家的卡牌,游戏是否结束。
- 在玩家每步step之后 ,返回新的状态、奖励、是否结束标志。
- 当玩家选择stick之后,将后续的所有庄家操作纳入环境中计算。(任务1要求)
游戏的每步操作step逻辑如下:(其中在玩家决策内更新当前的奖励和状态,存储在环境类对象上)
玩家的取牌、弃牌实现如下:
- 当玩家取牌时,增加一张牌到player_cards中,并且更新状态和奖励
- 当玩家弃牌时,转为庄家操作(取牌直到20以上),结束后判定胜负。
实现发牌的操作如下图所示,在1-10之间选择卡牌,并且依照概率赋予颜色。开局必发黑牌。
最后,我们根据双方牌值,计算是否发生爆牌的情况或者胜负情况。若玩家仍可继续选择,则继续游戏,更新状态和奖励。
二. 游戏代理实现
2.1 通用代理(玩家类)
我们定义通用代理具有选择动作和训练的基本方法。后续通过不同的策略代理进行继承并实现。(蒙特卡洛代理、Sarsa代理、Q-learning代理)
2.2 蒙特卡洛代理
2.2.1 算法过程
蒙特卡洛方法是一种模型无关(Model Free)的方法,这意味着我们需要通过模拟多次环境交互来估计出策略价值函数。
评估基本步骤如下:
- 生成轨迹: 在每一轮蒙特卡洛模拟中,从环境的初始状态开始,根据当前的策略生成一个完整的轨迹(也称为episode)。轨迹包括状态、动作和即时奖励的序列,直到达到终止状态。
- 计算回报: 对于轨迹中的每个状态,计算从该状态开始的累积回报。回报是从当前状态开始,经过一系列动作和环境反馈后获得的奖励的总和 。在这一环节,我们采用First-Visit MC这种方法,只考虑在一个episode中首次访问某个状态时计算的回报。如果同一个状态在同一个episode中被多次访问,只有第一次访问的回报会被计算在内。这样的话,一个状态在一个episode中只有一个相关的回报值。
- 更新价值函数: 使用得到的回报更新每个状态的价值函数。具体地,对于每个状态,将其之前的价值估计更新为其在多次模拟中获得的平均回报。
- 重复模拟: 重复执行多次模拟,不断累积对状态价值函数的估计。
- 收敛: 当状态价值函数的估计不再发生显著变化时,认为蒙特卡洛策略评估已经收敛。
即基本过程如下:
基于上述分析,我们定义蒙特卡洛代理如下:
其中属性为折扣因子(默认为1),贪心策略的参数ε,以及计算状态和选择动作的次数N、所有回报总和Gs以及状态价值函数V
2.2.2 动作选择
由于蒙特卡洛需要靠初始策略进行采样,我们设置其采样策略为epsilon 贪心的策略。此策略也可以保证玩家在前期尽可能地去探索,到达所有的牌值状态。
2.2.3 Q值更新
由上图可知,我们采取求累计回报后,再平均更新Q值的方法。实现为:
为了提高性能,我们优化实现为增量式更新期望。
2.2.4 训练agent
训练方法设置如下,在每个迭代里面存储过往的数据到episode,并最后更新状态价值。由于初始的获胜率较低,我们在迭代过程中逐步降低epsilon,以在初期explore,后期exploit。
2.2.5 测试agent
我们定义main方法,用于测试并为比较后续不同策略的agent表现。
在测试方法test_agent中,我们采取模型认为的最优策略进行游戏,测试10000局并统计游戏结果,计算模型胜率。
执行结果如下,我们训练10万次后再测试1万次。并且统计每1万次的结局分布。不难发现结局为“庄家爆牌”的概率随着训练次数的增加而不断增加。
我们可以看到庄家在小于20点持续拿牌的固定策略会导致庄家爆牌的概率极大,但是在不爆牌的情况下,庄家牌值大于玩家牌值的概率较大。综合两者,在多次测试后,可知蒙特卡洛代理的胜率可达66%。
2.2.6 效果分析
为了便于分析,我们编写一个三维可视化的工具函数,主要绘制三幅图:
- x、y轴分别表示“庄家初始牌值”,“玩家牌值”,纵轴z轴表示选择第0个动作(Action.STICK)的价值。
- 平面的x、y轴分别表示“庄家初始牌值”,“玩家牌值”,纵轴z轴表示选择第1个动作(Action.HIT)的价值。
- 平面的x、y轴分别表示“庄家初始牌值”,“玩家牌值”,纵轴z轴表示选择两个动作的平均价值。
主要代码如下:
呈现效果如下:
下面我们逐个分析:
- Action.Stick:操作的q值均为正,当牌值逼近21的时候,q值可达到0.8附近,由于+1为胜利的奖励,这也预示着此时胜利概率极大。而由于庄家采取的是低于20牌值持续拿牌的激进策略(容易爆牌)。这意味着选择一个适中的牌值就停止拿牌是一个好的策略。
- Action.HIT:操作中Q值存在一些负值,尤其是玩家牌值接近20时,此时拿牌大概率会爆牌,故接近失败的惩罚-1。而在初始牌值小于10的时候,颜色均为浅绿色,此时的agent拿牌会得到一定的奖励。
- 平均价值:
- 对比庄家牌轴后,可知在本次实验环境下,仅依靠庄家的初始牌的信息,对玩家决策的意义较小。
- 当玩家牌值约为10时,此时价值较高。牌值从17到20,风险高,Q值较低。
最后通过FuncAnimation库函数实现每隔1000次训练记录,总计100帧的gif。可以看到,随着时间迭代,agent采取单个动作的q_value坡度会渐渐变得平缓。而由于HIT与STICK方法在逼近21点牌值后的决策结果会有较大的不同,所以导致平均价值即便在后期有锯齿状的表面。(相较后续的TD方法,收敛十分平缓。)
2.3 Sarsa代理
2.3.1 算法过程
State-Action-Reward-State-Action这个名称清楚地反应了其学习更新函数依赖的5个值,分别是当前状态S1,当前状态选中的动作A1,获得的奖励Reward,S1状态下执行A1后取得的状态S2及S2状态下将会执行的动作A2。
这是一种在线更新Q值的算法,算法流程大致如下:
其中在每个episode中,都通过episilon贪心策略选择一个动作,并通过G乘以α(学习率)来更新状态价值Q,重复步骤直到收敛。这里的预期回报G是单步TD(0),即只考虑未来一步收益的。
2.3.2 训练agent
显然,Sarsa代理的最佳决策依旧是选择最优的Q值,而与蒙特卡洛不同只是更新方法。故这里仅展示Sarsas的核心代码,不再赘述相同部分。
如下所示,为依据上述算法流程实现的训练代码。需要注意的是,当这个状态是最后一个状态时,我们需要判断是否为结束,并且去除公式中下一个状态的Q值。
我们依据公式:
实现如下更新Q值函数:
2.3.3 效果分析
依据上述相同方法,训练10万次并每隔1万次记录对局结果。结果如下:Sarsa的胜率约为0.63,比MC方法(0.66)稍低一点。但是联合MC方法的测试结果可知,胜利原因大部分是因为庄家爆牌而引起。
同MC方法进行可视化,可以得到动作STICK、HIT以及平均的状态价值图。
由上图可知,
- 动作STICK和HIT的最优价值分布的牌值区间恰好相反:
- 对于STICK操作而言,牌值越小,STICK奖励越低。牌值接近21时,STICK操作价值越高。
- 对于HIT操作而言,牌值越大,HIT奖励越低。牌值越小,HIT操作价值越高。
- 两者均在牌值约为12的情况下,产生较大的价值差异。分析可知,当牌值取得12时,HIT操作就有可能溢出。
- 从平均结果来看,保持牌值在11以下的平均价值大于高牌值的情况。
- 相比于MC方法的可视化图像,Sarsa方法的价值平面明显更加平滑。
我们取100帧(每帧迭代训练1000次),fps=5的图像叠加为gif查看价值函数的动态收敛过程,除去平均结果外,但看动作STICK与HIT都可清晰地观测到其中变化幅度较大。
2.4 Q-learning代理
2.4.1 算法流程
和Sarsa类似,q-learning也是单步TD方法,但不同的是,它是离线学习的,通过选择当前状态下价值最大的动作来更新Q值。更新公式中使用了max操作。核心公式如下:
算法流程如下图所示:
2.4.2 Q值更新
依据上述公式,我们在Sarsa代理的基础上修改值更新部分。核心的“Q值更新”实现如下:
2.4.3 效果分析
同理,我们测试了Q-learning代理对局结果如下:其胜率为0.6378,与Sarsa代理大致相当。
不同动作的价值函数可视化部分如下:大致分布也与Sarsa代理相同。可知在两者收敛的情况下,Q-learning与Sarsa代理实现的策略与效果都是相当的。
观察其收敛过程(1000次训练记录一帧,共100帧),QLearning的迭代过程变化幅度同Sarsa方法,比MC方法更加剧烈。
三. 对比分析
3.1 胜率分析
通过wandb可视化三种代理的胜率情况,我们设置每隔1000次训练进行一次测试,,一共进行100轮。(总计10万次训练)每次测试通过1000次游戏来获取胜率。结果如下:
由图可知,胜率较快进入收敛情况,我们采取Smooth可知MC与TD方法的趋势。其中MC方法越到后面(训练10万次后)仍有提升胜率的趋势,而Q-learning与Sarsa方法反而有胜率降低的趋势。(有可能陷入局部最优解。)
我们缩小训练步长,调整为每隔100次记录1点。得到曲线如下:可以看到,在小规模情况下的三种代理的胜率具有一定的提升,但是幅度较少。
3.2 均方误差对比
我们将三种代理两两比较Q值的均方差,得到三条曲线如下:
红色为sarsa与qlearning的均方差对比,初始两者相似,随着训练两者均方差有略微提升,后期又会降低。而橙色和蓝色的曲线分别为sarsa、qlearning与mc方法的均方差,初始差异较大,但是后期随着训练增大,也渐渐收敛趋于一致。
3.3 总结
本次实验所应用的三种策略Q-learning、Sarsa和蒙特卡洛都是解决强化学习问题的算法,它们在学习过程中都通过与环境的交互来优化策略。且都用于值函数估计,这三种算法的目标都是学习状态或状态动作对的值函数,即Q值或V值。
区别:
- 更新方式不同:
Q-learning: 使用了离线学习的方式,通过选择当前状态下值最大的动作来更新Q值。更新公式中使用了max操作。
Sarsa: 使用在线学习的方式,通过选择当前状态下的某个动作来更新Q值。更新公式中使用了当前实际选择的动作。
蒙特卡洛: 通过整个回合(episode)的经验来更新值函数,它直接使用了整个回合的累积奖励。
- 探索策略不同:
Q-learning和Sarsa: 使用ε-greedy策略进行探索,以一定概率随机选择动作,以概率1-ε选择当前估计值最高的动作。
蒙特卡洛: 通过在整个回合内的探索来学习。
- 适用场景不同:
Q-learning: 适用于离散状态和动作的问题,能够在未知模型的情况下学习最优策略。
Sarsa: 同样适用于离散状态和动作的问题,但由于使用在线学习,更适合实时决策。
蒙特卡洛: 适用于离散或连续状态和动作的问题,更擅长处理整个回合的经验。
四. 最终代码
https://github.com/YYForReal/ML-DL-RL-Learning/tree/main/RL-Learning/MC_TD_S21
相关文章:
【强化学习】基于蒙特卡洛MC与时序差分TD的简易21点游戏应用
1. 本文将强化学习方法(MC、Sarsa、Q learning)应用于“S21点的简单纸牌游戏”。 类似于Sutton和Barto的21点游戏示例,但请注意,纸牌游戏的规则是不同且非标准的。 2. 为方便描述,过程使用代码截图,文末附链…...
Pandas 高级教程——高级时间序列分析
Python Pandas 高级教程:高级时间序列分析 Pandas 提供了强大的时间序列处理功能,使得对时间序列数据进行高级分析变得更加灵活和方便。在本篇博客中,我们将深入介绍 Pandas 中的高级时间序列分析技术,并通过实例演示如何应用这些…...
解决Pycharm pip安装模块太慢问题,pycharm2022没有manage repositories配置镜像源
解决方案 方法清华阿里云中国科技大学华中理工大学 或者直接-i 加镜像 方法 URL写下面任意一个 清华 https://pypi.tuna.tsinghua.edu.cn/simple阿里云 http://mirrors.aliyun.com/pypi/simple/中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/华中理工大学 http:/…...
十二:爬虫-Scrapy框架(上)
一:Scrapy介绍 1.Scrapy是什么? Scrapy 是用 Python 实现的一个为了爬取网站数据、提取结构性数据而编写的应用框架(异步爬虫框架) 通常我们可以很简单的通过 Scrapy 框架实现一个爬虫,抓取指定网站的内容或图片 Scrapy使用了Twisted异步网…...
BUUCTF Reverse/[2019红帽杯]Snake
BUUCTF Reverse/[2019红帽杯]Snake 下载解压缩后得到可执行文件,而且有一个unity的应用程序,应该是用unity编写的游戏 打开是一个贪吃蛇游戏 用.NET Reflector打开Assembly-CSharp.dll。(unity在打包后,会将所有的代码打进一个Ass…...
概率论相关题型
文章目录 概率论的基本概念放杯子问题条件概率与重要公式的结合独立的运用 随机变量以及分布离散随机变量的分布函数特点连续随机变量的分布函数在某一点的值为0正态分布标准化随机变量函数的分布 多维随机变量以及分布条件概率max 与 min 函数的相关计算二维随机变量二维随机变…...
C#中的Attribute详解(上)
C#中的Attribute详解(上) 一、Attribute是什么二、Attribute的作用三、Attribute与注释的区别四、系统Attribute范例1、如果不使用Attribute,为了区分这四类静态方法,我们只能通过注释来说明,但这样做会给系统带来很多…...
天津医科大学临床医学院专升本药学专业有机化学考试大纲
天津医科大学临床医学院高职升本科专业课考试大纲药学专业《有机化学》科目考试大纲 一、考试基本要求 本考试大纲主要要求考生对《有机化学》基本概念有较深入的了解,能够系统地掌握各类化合物的命名、结构特点及立体异构、主要性质、反应、来源和合成制备方法等…...
电脑开机自动断电,简单4招,快速解决!
“不知道我的电脑最近是怎么回事,每次一开机就会出现自动断电的情况,有什么方法可以解决吗?” 在使用电脑时,由于电源供应不稳定或过热,以及各种硬件问题,可能会导致电脑开机自动断电。遇到这种情况&#x…...
线程基础知识(三)
前言 之前两篇文章介绍了线程的基本概念和锁的基本知识,本文主要是学习同步机制,包括使用synchronized关键字、ReentrantLock等,了解锁的种类,死锁、竞争条件等并发编程中常见的问题。 一、关键字synchronized synchronied关键…...
elasticsearch系列七:聚合查询
概述 今天咱们来看下es中的聚合查询,在es中聚合查询分为三大类bucket、metrics、pipeline,每一大类下又有十几种小类,咱们各举例集中,有兴许的同学可以参考官网:https://www.elastic.co/guide/en/elasticsearch/refere…...
SQL面试题挑战11:访问会话切割
目录 问题:SQL解答: 问题: 如下为某电商公司用户访问网站的数据,包括用户id和访问时间两个字段。现有如下规则:如果某个用户的连续的访问记录时间间隔小于60秒,则属于同一个会话,现在需要计算每…...
2023“楚怡杯”湖南省赛“信息安全管理与评估“--应急响应(高职组)
2023“楚怡杯”湖南省“信息安全管理与评估”(高职组)任务书 2023“楚怡杯”湖南省“信息安全管理与评估”(高职组)任务书第一阶段竞赛项目试题第二阶段竞赛项目试题网络安全事件响应:需要环境私聊博主:2023“楚怡杯”湖南省“信息安全管理与评估”(高职组)任务书 第一…...
【Python百宝箱】Python引领制造变革:CAM技术全景解析与实战指南
Python 驭技术潮流:探索计算机辅助制造的全方位工具库 前言 在当今制造业的快速发展中,计算机辅助制造(Computer-Aided Manufacturing,CAM)技术扮演着至关重要的角色。为了提高制造效率、优化工艺流程以及实现数字化…...
【新版Hi3559AV100 旗舰8K30 AI摄像机芯片】
新版Hi3559AV100 旗舰8K30 AI摄像机芯片 一、总体介绍 Hi3559AV100是专业的8K Ultra-HD Camera SOC,它提供了8K30/4K120广播级图像质量的数字视频录制,支持8路Sensor输入,支持H.265编码输出或影视级的RAW数据输出,并集成高性能ISP…...
小样本学习idea(不断更新)
在此整理并记录自己的思考过程,其中不乏有一些尚未成熟或者尚未实现的idea,也有一些idea实现之后没有效果或者正在实现,当然也有部分idea已写成论文正在投稿,都是自己的一些碎碎念念的思考,欢迎交流。 研一上学期 9.…...
表情包搜索网站
一个非常不错的表情包搜索网站,输入关键词即可得到所有相关的表情,还可以选择套图下载,自制表情,非常给力666 可以点击下载,会新建窗口打开图片,鼠标右键“图片另存为”,下载文件名手动补充“…...
Linux账号和权限管理
目录 一、用户账号和组账号概述 1、用户账号类型 2、组账号 1.基本组(私有组) 2.附加组(公共组) 3、ID 1.UID 2.GID 4、用户和账号管理 1.文件位置 2.useradd-----创建用户 3.userdel——删除用户账号 4.usermod---修…...
Qt/QML编程学习之心得:QML和C++的相互调用(十五)
Qt下的QML说到底是类似于JavaScript的一种解释性语言,习惯了VC的MVC(Veiw+Control)的模式,那种界面视图任何事件都是和C++的cpp中处理函数一一对应,在类中也有明确的说明的。一下子玩Qt会觉得哪里对不上,比如使用QML这种节脚本语言贴了图做了layout布局,那么一个按钮的o…...
月入10.5K,专科小伙转行网优:据说每个领域都有一个“显眼包”
网络热词流行的今天,显眼包一词又上热搜。除了熟知的内娱显眼包外,其实各行业也都有自己的“显眼包”。 显眼包又叫“现眼包”看似丢人现眼,实则是个“褒义词”,他们勇敢自信,积极乐观,敢于展示自己&#x…...
Python自动化测试:选择最佳的自动化测试框架
在开始学习python自动化测试之前,先了解目前市场上的自动化测试框架有哪些? 随着技术的不断迭代更新,优胜劣汰也同样发展下来。从一开始工具型自动化,到现在的框架型;从一开始的能用,到现在的不仅能用&…...
Ubuntu16.04 安装Anaconda
步骤 1: 去官网下载安装包,链接如下: https://repo.anaconda.com/archive/ 找到对应版本下载至本地电脑,并上传至服务器。 步骤2: 通过命令解压 sh Anaconda3-2023.03-0-Linux-x86_64.sh 一路选择yes或则回车,直到安装成功出现下面画面&…...
MR实战:统计总分与平均分
文章目录 一、实战概述二、提出任务三、完成任务(一)准备数据1、在虚拟机上创建文本文件2、上传文件到HDFS指定目录 (二)实现步骤1、创建Maven项目2、添加相关依赖3、创建日志属性文件4、创建成绩映射器类5、创建成绩驱动器类6、启…...
Redux与React环境准备、实现counter(及传参)、异步获取数据
环境说明: 一:说明 在React中使用redux,官方要求安装两个其他插件:Redux Toolkit和react-redux 1. Redux ToolKit(RTK) - 官方推荐编写Redux逻辑的方式,是一套工具的集合集,简化书写方式 (简化…...
网站服务器被入侵,如何排查,该如何预防入侵呢?
在我们日常使用服务器的过程中,当公司的网站服务器被黑客入侵时,导致整个网站以及业务系统瘫痪,将会给企业带来无法估量的损失。作为服务器的维护人员应当在第一时间做好安全响应,对入侵问题做到及时处理,以最快的时间…...
应用在网络摄像机领域中的国产音频ADC芯片
IPC:其实叫“网络摄像机”,是IP Camera的简称。它是在前一代模拟摄像机的基础上,集成了编码模块后的摄像机。它和模拟摄像机的区别,就是在新增的“编码模块”上。模拟摄像机,顾名思义,输出的是模拟视频信号…...
Unity3D 安装和下载指南及汉化
Unity3D是一款强大的游戏开发引擎,为开发者提供了丰富的工具和资源,使得游戏制作变得更加简单和高效。本文将介绍Unity3D的安装和下载步骤,以帮助初学者迅速入门。 步骤一:访问Unity官网 首先,打开浏览器,…...
【SpringCache】SpringCache详解及其使用,Redis控制失效时间
一、使用 在 Spring 中,使用缓存通常涉及以下步骤: 1、添加缓存依赖: 确保项目中添加了缓存相关的依赖。如果使用 Maven,可以在项目的 pom.xml 文件中添加 Spring Cache 的依赖。 <dependency><groupId>org.spring…...
MyBatis的基本使用及常见问题
MyBatis 前言MyBatis简介MyBatis快速上手Mapper代理开发增删改查环境准备配置文件完成增删改查查询添加修改删除 参数传递注解完成增删改查 前言 JavaWeb JavaWeb是用Java技术来解决相关Web互联网领域的技术栈。 MySQL数据库与SQL语言 MySQL:开源的中小型数据库。…...
[RoarCTF2019] TankGame
不多说,用dnspy反编译data文件夹中的Assembly-CSharp文件 使用分析器分析一下可疑的FlagText 发现其在WinGame中被调用,跟进WinGame函数 public static void WinGame(){if (!MapManager.winGame && (MapManager.nDestroyNum 4 || MapManager.n…...
怎样查看网站日志/广州白云区疫情实时动态
onclick点击跳转页面实例2则亲测分享 跳转页面,在新建窗口打开网页 <div onclick"window.open(http://www.yfi6.com);"></div>跳转页面,在当前窗口打开网页 <div onclick"window.location.hrefhttp://www.yfi6.com;&q…...
如何做淘宝cms导购网站/百度网址链接是多少
前些天在学习linux下的驱动编写,找到了一块之前淘到的液晶屏,主控芯片是ili9341,分辨率为240*320的屏幕,接口方式是SPI的,心血来潮想搞一下。不过奈何驱动水平不到家,只是开发出了一种杂交方法,…...
网站建设上海网站建设公司网站/百度免费资源网站
PV 预算:成本估算部分的总价值 AC 实际成本:在规定时间内完成的成本总额 EV 挣值 ETC 剩余工作的成本估算 ETC PV - EV ETC=剩余的工作的PVCPI&a…...
专业广州网站设计/安卓aso优化工具
python在ros中订阅雷达数据并可视化处理 文章目录python在ros中订阅雷达数据并可视化处理参考教程:预设条件:图片:程序:接着上一次的博客,我可视化激光雷达的数据还是整好了,记录一下吧,国内现成…...
危险网站怎么做腾讯云认证/网盘搜索引擎入口
这几天主要在做公司微信小程序项目2.0版本的一些新增功能,其中就包括把原来的地址等个人固定信息独立成一个模块进行管理(选择收货地址),包括新增地址、地址修改、删除等可以直接选取个人地址而不需要每次都填写,话不多…...
一手房哪个网站做信息效果好/百度推广代理商有哪些
一开始是碰到没有caffe/caffe.hpp文件的问题,不知道怎么弄。通过百度,知道了在makefile文件里加入头文件路径和库文件路径就行。 首先是caffe.pb.h丢失问题,解决方法:https://github.com/muupan/dqn-in-the-caffe/issues/3 protoc…...