问题定义


游戏规则:

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. java如何生成 MD5?

    java生成 MD5最简单方法   答: 复制以下方法即可使用,不用依赖任何第三方包 public static String MD5(String data) throws Exception { ...

  2. std::function以及std::bind

    转自:https://blog.csdn.net/shuilan0066/article/details/82788954 示例1 : 普通函数 void gFunc() { cout << ...

  3. pyecharts绘画优美图形

    常用图形:柱形图-折线图-饼图-散点图 from pyecharts import Line, Bar, Pie, EffectScatter # 数据 attr =["衬衫", ...

  4. Mysql读写分离(Mycat版)

    (1).读写分离概述 1)工作原理 读写分离是让主数据库处理事务性增删改操作(insert.delete.update),让从数据库处理查询查询操作(select). 2)作用 1.分担负载 2.主从 ...

  5. 123457123457#0#-----com.yuming.YiZhiFanPai01--前拼后广--益智早教游戏记忆翻牌cym

    com.yuming.YiZhiFanPai01--前拼后广--益智早教游戏记忆翻牌cym

  6. Yarn简单介绍及内存配置

    本文出自:http://blog.chinaunix.net/uid/28311809/abstract/1.html 在这篇博客中,主要介绍了Yarn对MRv1的改进,以及Yarn简单的内存配置和Y ...

  7. java书籍推荐转

    http://blog.csdn.net/chaozhi_guo/article/details/51274634 一.<深入理解Java虚拟机:JVM高级特性与最佳实践> 如果你不满足于 ...

  8. 【c# 学习笔记】封装

    封装 指的是把类内部的数据隐藏起来,不让对象实例直接对其操作.c#中提供了属性机制来对类内部的状态进行操作. 在c#中,封装可以通过Public.Private.Protected和Internal等 ...

  9. 高级UI-Palette

    Google推出的Palette是用来调色的,正如其汉语意思一样,可以用来显示颜色,在显示图片的时候,会配合图片的色调来显示,这样就显得很融合,其实Palette可以分析出图片中的很多特性,例如主色调 ...

  10. Asp.Net Core集成Swagger

    工作中一个公司会有很多个项目,项目之间的交互经常需要编写 API 来实现,但是编写文档是一件繁琐耗时的工作,并且随着 API 的迭代,每次都需要去更新维护接口文档,很多时候由于忘记或者人员交替的愿意造 ...