问题定义


游戏规则:

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. ES6内建对象的继承

    在ES6之前, JS是无法通过继承的方式创建属于自己的特殊数组的, 也就是说可以使用原型链来继承数组的一些方法, 但是某些返回一个数组的方法返回的值还是一个Array的实例, 例如slice, len ...

  2. 基于JOSE4J 实现的OAUTH TOKEN

    jose4j / JWT Examples View History JSON Web Token (JWT) Code Examples Producing and consuming a sign ...

  3. python面向对象内置方法关于属性篇

    1.关于__xxxattr__之__getattr__.__setattr__.__delattr__ 2.关于__xxxitem__之__getitem__.__setitem__.__delite ...

  4. react ant design TreeNode——树形菜单笔记

     2017-12-04补充说明——树形菜单版本号2.x 设置默认该树形组件展开(默认展开所有树节点) 参考文档的写法: defaultExpandAll={true} //经过测试并不生效, 另外注意 ...

  5. sklearn.svc 参数

    sklearn.svc 参数 sklearn中的SVC函数是基于libsvm实现的,所以在参数设置上有很多相似的地方.(PS: libsvm中的二次规划问题的解决算法是SMO). 对于SVC函数的参数 ...

  6. 【POJ - 3268 】Silver Cow Party (最短路 Dijkstra算法)

    Silver Cow Party Descriptions 给出n个点和m条边,接着是m条边,代表从牛a到牛b需要花费c时间,现在所有牛要到牛x那里去参加聚会,并且所有牛参加聚会后还要回来,给你牛x, ...

  7. sed练习,一些sed常用方法

    1.复制/etc/rc.d/rc.local 文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#. sed -ri 's/^ +/#/g'  rc.loc ...

  8. java 画图 Graphics 文字自动换行

    /** * 文字超出限定长度自动换行 * * @param g 画布 * @param font 字体样式 * @param text 文字 * @param widthLength 最大长度 (多少 ...

  9. 48.javascript基础学习

    javascript基础学习:   http://www.w3school.com.cn/jsref/index.asp jS的引入方式: 1.行间事件:为某一个具体的元素标签赋予js内容,oncli ...

  10. Linux程序Segmentation fault (core dumped)

    1 问题原因 Segmentation fault (core dumped)多为内存不当操作造成.空指针.野指针的读写操作,数组越界访问,破坏常量等.对每个指针声明后进行初始化为NULL是避免这个问 ...