问题定义


游戏规则:

N个玩家,每人写一个或两个0~100之间的有理数 (不包括0或100),提交给服务器,服务器在当前回合结束时算出所有数字的平均值,然后乘以0.618,得到G值。 提交的数字最靠近G(取绝对值)的玩家得到N分,离G最远的玩家得到-2分,其他玩家得0分。 只有一个玩家参与时不得分。

我们的比赛中,每个玩家在每个回合提交两个数,最后的得分也即两个数字分别的得分之和。

难点分析:

这个游戏的难点在于他是一个多人决策游戏,如果采用强化学习作为策略,它的state和action都不是那么好去定义,而且很难去直接的判断定义的优劣,即使是在某一场游戏中表现的很好,也很难直接地认为是由于state和action定义的好。再一个就是它也很难像其他游戏那样可以预先去训练好一个通用的模型,因为每次一起参与游戏的玩家都不一样,很难有一个通用的model去应对所有的情况。

方法建模


在选择方法上面,我们选择了DQN(深度强化学习)来作为我们的策略,选择DQN的原因一个就是之前提到的state定义的问题,传统的Q Learning需要定义若干个离散的state,而DQN则可以将连续的state作为输入,还有一个原因也是我们两个之前接触这方面不多,也想通过这次机会对DQN有个更深入的了解。

DQN的伪代码和算法流程如下所示:

简单来说,就是输入state到定义的网络Q中,得到n个输出,n为定义的action的数目,每个输出代表了该action的一个得分(reward)。而通过游戏中实际选择的action和执行action后得到的next state,可以计算出该action对应的一个target reward,用这个target就可以更新网络参数,其实也就类似于Q Table的一个学习过程,只不过state连续化了。还一个不同就是DQN会存放一个记忆单元,每次从中采样出若干个样本来作为一个batch更新网络,而不仅仅是使用最近的这一次的数据。

在我们的这次任务中,state(即图中的s)为倒数十个黄金点组成的一维向量,而action(即图中的a)为提供的RLDemo里前7个action两两组合再加上第8个action,所以总共有22个action,每个action产生两个不一样的数。我们的实验中采用的网络模型比较简单,为三层的全连接网络,具体网络定义如下:

class DQN(nn.Module):

    def __init__(self, state_size, action_size, mid_dim=128):
super().__init__()
self.net = nn.Sequential(
nn.Linear(state_size, mid_dim),
nn.ReLU(inplace=True),
nn.Linear(mid_dim, mid_dim),
nn.ReLU(inplace=True),
nn.Linear(mid_dim, action_size)
) def forward(self, x):
return self.net(x)

我们之前也尝试过了更复杂一些的网络模型,如LSTM等,但似乎在我们自己测试的时候效果表现的并不好。由于也不确定更复杂的其他网络模型效果会不会更好,所以还是先采用了简单的网络结构。

在实验测试时,我们发现有一些固定策略的Bot会表现的特别好,于是我们后来有在代码里增加了一个策略比较简单的Bot,然后根据每个Bot历史得分情况,按照概率去选择,有些类似于“集成学习”的思想。

结果分析


在正式比赛前进行测试的时候,我们的Bot表现的其实非常好,当然也可能是测试的Bot中有许多类似于我们的action的简单Bot,以至于我们对最后的比赛还是比较有信心。

在第一轮的表现中,我们的Bot也能排到第三,而且领先其他组较多,因此第一轮后也没有对Bot进行调整。第二轮比赛中,我们的Bot则表现的有些可怜,一开始还能在中下游起起伏伏,到了后期直接变成倒数第一。分析原因,我们的state定义、action定义以及网络结构其实都并不是那么合理,但是由于测试时表现还不错,也就没有过多的去思考有没有更合理的方式。从比赛结果来看,我们的策略确实不够通用,可能只能再某一些特定的情况,才会有较好的表现。

如果每轮提交数字变为3个,我们的代码中action的定义需要做一些调整,因为每个action对应的数目还是固定的。

我的合作伙伴是一个代码能力非常强的人,我们大部分的代码是由他来完成具体编写的,我主要是在后期对代码进行了一些测试,以及完善了一些细节(包括概率选择部分代码等)。虽然比赛结果可能不是特别理想,但这次合作还是非常愉快的,也学到了不少东西。

ASE —— 第一次结对作业的更多相关文章

  1. ASE——第一次结对作业

    ASE--第一次结对作业 问题定义 很早就听说了MSRA的黄金点游戏,让大家写Bot来参加比赛看谁的AI比较聪明可以操盘割韭菜.深感ASE课程老师设计的任务太用心了,各种接口都准备好了,大家只用专注于 ...

  2. [BUAA软工]第一次结对作业

    [BUAA软工]结对作业 本次作业所属课程: 2019BUAA软件工程 本次作业要求: 结对项目 我在本课程的目标: 熟悉结对合作,为团队合作打下基础 本次作业的帮助:理解一个c++ 项目的开发历程 ...

  3. 【ASE高级软件工程】第一次结对作业

    问题定义 具体规则见:讲义.大致规则如下: N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数 ...

  4. ASE高级软件工程 第一次结对作业

    黄金点游戏Bot Bot8前来报道 1.问题定义 a) 问题描述 N个玩家,每人写一个0~100之间的有理数 (不包括0或100),提交给服务器,服务器在当前回合结束时算出所有数字的平均值,然后乘以0 ...

  5. 软件工程第三次作业-结对作业NO.1

    第一次结对作业 结对人员: 潘伟靖 170320077 张 松 170320079 方案分析 我们对所供的资料进行分析,如下: 从提供的资料可以看出,需要解决的问题以及满足的需求主要有两类目标用户,各 ...

  6. ASE —— 第二次结对作业

    目录 重现基线模型 基线模型原理 模型的优缺点 模型重现结果 提出改进 改进动机 新模型框架 评价合作伙伴 重现基线模型 基线模型原理 我们选用的的模型为DeepCS,接下来我将解释一下它的原理. 我 ...

  7. 第6次结对作业--郑锦伟&古维城

    第6次结对作业 在线英语学习平台客户端原型 1.结对成员 郑锦伟 2015034643034 古维城 2015034643033 2.原型设计工具实现-Photoshop 3.需求分析 使用NABCD ...

  8. [2019BUAA软件工程]结对作业

    Tips Link 作业链接 [2019BUAA软件工程]结对作业 GitHub地址 WordChain PSP表格 psp2.1   预估耗时(分钟) 实际耗时(分钟) Planning 计划 60 ...

  9. 【BUAA软件工程】第一次阅读作业

    BUAA软件工程 第一次阅读作业 项目 内容 这个作业属于哪个课程? 北航软工 这个作业的要求在哪里? 第一次个人作业 我在这个课程的目标是? 学习高效严谨的软件工程开发过程,建立团队意识 这个作业在 ...

随机推荐

  1. 123457123456#0#-----com.threeapp.MakerHanBao01----儿童汉堡制作游戏

    ----com.threeapp.MakerHanBao01----儿童汉堡制作游戏

  2. C#读取带命名空间的xml

    首先带有命名空间的xml读取可以使用Xml.Linq,也可以使用xpath,本文将采用xpath的方式解析. 原文参考了:https://www.cnblogs.com/duanjt/p/544054 ...

  3. 腾讯ios内部视频,什么垃圾视频

    前几天朋友在网上花钱买了个,腾讯ios内部视频,我也跟着下载了, 看着这列表,我感觉没什么东西,一看就是基础的东西,完全没有实战的内容,就像培训机构骗学生的东西啊,讲些毛理论,结果一到实战了,问个Sc ...

  4. fetch jsonp请求接口

    function loadTbbRec() { var fetchJsonp = require('fetch-jsonp'); fetchJsonp(ext.info.tbbRecUrl, { he ...

  5. win10 安装MySQL过程和遇到的坑

    环境:win10系统,MySQL5.7.18 “mysql-5.7.18-winx64.msi” 首先是要运行mysql-5.7.18-winx64.msi,选择安装在C盘(可自定义安装) 第一步 打 ...

  6. charles 查找

    本文参考:charles 查找 查找设置 界面如上图,也没啥好说的: 这个还是非常常用的:需要了解 界面如上图,也没啥好说的: 这个还是非常常用的:需要了解 查找需要了解的关键字是: 查找的内容 正则 ...

  7. 欧姆龙_NX1P_PLC功能模块_限定安全作业空间

    程序  和说明 以及流程图 已上传到百度云盘 https://pan.baidu.com/s/1kYF11pQHJ4VxyaXr8E_gAA 主要是用来向量的叉乘  判断俩向量正向夹角

  8. 【C/C++开发】C++ Thread对象封装

    Pthread库是posix linux的线程库,调用接口如下,我们模仿JDK,对Thread进行封装,具体的业务逻辑只需要如同Thread一样实现run方法即可. 线程操纵函数(简介起见,省略参数) ...

  9. sql语句中,取得schema中的所有表信息及表的定义结构

    postgressql下'検索スキーマの中で.全てテーブルselect tablename from pg_tables where schemaname='test' mysql下'検索スキーマの中 ...

  10. 4、2 java 使用es

    1.导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...