黄金点游戏Bot

Bot8前来报道

1.问题定义

a) 问题描述

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

b) 简单的思考

  • 拿到这个问题想的是如果大家都不冒险的话,那么结果会无限接近0
  • 所以显然要有扰动来使游戏变得更有趣,而且扰动很关键(这里扰动指输出显然不正确的值使黄金点偏移)
  • 我们要做的就是预测下一轮的黄金点

2.方法建模

a) 环境分析

  • 经过在Room 1和几个bot简单的较量,可以发现黄金点变化的十分剧烈,这使精准预测的难度的大大提高
  • 由于变化剧烈,所以考虑前100个或者10个黄金点显得没有道理,所以应该考虑更少的黄金点,最多5个足够了(最后我们只用最后2个的差)
  • 在考虑数据的时候,显然小的数据的细微变化的价值要大于大的数据的剧烈变化,所以应该有适当的针对措施(比如小值细分,大值粗分)
  • 对于扰动,向上扰动(50-100)效果明显,而向下扰动(输出0)效果不明显,很容易被截胡,所以扰动应该只向上扰动
  • 连续扰动其实效果不大,因为会有其他人的策略很快适应这个环境

b) 选择模型

  • 根据助教的提示,我们在非机器学习算法、Q-learning、DQN直接进行对比,尝试选出合适的策略
  • 首先尝试干扰策略,干扰的目的是干扰其他机器学习算法模型的正确学习,具体策略有每20回合连续干扰10回合,每10回合连续干扰5回合,每回合都干扰,不干扰,随机泊松分布连续干扰
  • 干扰同时要预测在干扰下的黄金点,这里我们假设其他人不干扰,得到黄金点的值
  • 基于之前的环境分析,我们可以知道状态不需要存储很多前面的数字,这样最近的黄金点的特性如何提取成我们的状态表示是一个核心问题
  • 由于数字较少,特性较少,所以我们认为DQN的作用不会太大,反而会影响模型训练速度
  • 我们最后考虑Q-learning
  • 剩下的就是action了,首先要有上一个黄金点,上一个黄金点*0.618,然后还要尝试截胡其他人的干扰

c) Q-learning简介

  • 类似于动态规划,有状态和状态转移,在状态转移时会有得分产生,我们的目标就是学出一个状态转移表。
  • 想学出来的话需要有action的反馈,让我们知道下次遇到这个状态时倾向于使用哪个action。
  • 具体公式: NewValue = CurrentValue + lr * [Reward + discount_rate * (highestValue between possible actions from the new state s’) — CurrentValue]

d) 实现细节

  • 预先训练好model,提前加载,并即时存下model
  • 经过测试,干扰选择随机概率干扰,而且上回合如果干扰过了,这回合要抑制干扰,如果一直没干扰要提升干扰概率
  • 在Q-learning中去除自己干扰回合的黄金点,使model尽快成型
  • 状态表示这里只考虑上个黄金点和当前黄金点的差值,通过放大小区间,缩小大区间来转换为100个状态(原因在环境分析里有说)
  • 行动策略除了上个黄金点,上个黄金点*0.618,截胡干扰之外还要加入上下浮动(开始用0.001,最后用0.011,其实只要比其他bot多一点或者少一点就好了)

e) 工作流程

  • 用Q-learning预测action,得到两个数字
  • 判定本回合是否干扰,具体分4个干扰阶段,每个阶段有概率(0.05, 0.2, 0.4, 0.7)干扰,每回合若未干扰有0.9概率转移下个阶段,若干扰则阶段清零(即变为0.05概率干扰的阶段)
  • 若干扰,用(50-100)的随机数替换number2,同时在假定其他人不干扰的情况下估计出新的number1

3.结果分析

a) 两轮得分
第一轮1690分(1000轮)
第二轮13850分(10000轮)

b) 心得反思
两轮第一还是超出预期的,没想到效果还不错 ^v^
其实在交bot之前,我们也是用自己的bot在自己的房间中pk,在多轮中效果最好的作为最终的bot
如果将每轮提交的数字变成3个,只需改变action即可工作,不过model的效果和训练时间有待考究
若有更多的参赛者,可能要重新考虑干扰为我们带来的收益
强行三明治的话,就要怪队友CHF太强了,完全不需要我的发挥,我躺好了(咸鱼的姿势),溜了溜了

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高级软件工程】第二次结对作业

    重现baseline 我们选择重现CODEnn模型(论文:Deep Code Search),因为它结构简单.端到端可训练,且相比其它方法拥有较高的性能. Baseline原理 为了根据给定的quer ...

  5. ASE高级软件工程 第一周博客作业

    1.自我介绍 我叫姚顺,是来自哈尔滨工业大学计算机学院的一名大四本科生,专业方向计算机科学,目前在KC组实习.平时的业余时间主要用来打篮球,听音乐,跑步,当然还有游戏(划掉).之前的大学三年主要用来做 ...

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

    问题定义 游戏规则: N个玩家,每人写一个或两个0~100之间的有理数 (不包括0或100),提交给服务器,服务器在当前回合结束时算出所有数字的平均值,然后乘以0.618,得到G值. 提交的数字最靠近 ...

  7. 高级软件工程第二次作业:随机生成N个不重复的已解答完毕的数独棋盘

    #include <stdio.h> #include "SuduCheck.h" ][],int i,int j,int k) //判断是否可以将第i行.第j列的数设 ...

  8. 【ASE高级软件工程】Alpha 阶段 backend组 scrum1 记录

    本次会议于11月4日,19:10 在微软北京西二号楼13478召开,持续40分钟. 与会人员:Haifeng Chen, Zhikai Chen, Hao Wang, Jia Ning 请假: Xin ...

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

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

随机推荐

  1. selenium Grid2环境搭建和基本使用

    Selenium Grid简介 利用Selenium Grid可以使主节点(hub)的测试用例在不同主机即分支点(node)运行.可以使一份测试用例在不同环境下(操作系统.浏览器)执行自动化测试.Se ...

  2. SqlServer中union 和 union all的区别

    ⒈UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同.⒉对重复结果的处理:UNION在进行表链接后会筛选掉重复的数据,UNION ALL不会去除重复的 ...

  3. JavaScript处理股票数据

    1, 先使用Ajax发送异步请求到:http://hq.sinajs.cn/list=s_sh000001 2, 然后用[,]切割成数组https://www.w3school.com.cn/js/j ...

  4. Volatile可见性 与 Synchronization原子性的优化

    Volatile可见性 比如现在我们有这样一段代码:线程等待另一个线程将数据装载完就输出success,可是最后程序一直卡在while循环里没有往下执行. public class VolatileD ...

  5. php和java语法区别

    Java和PHP的基本语法基本相同,其实大部分的语言的基本语法也都相同,但是他们还是有一些细微的区别: 1.PHP是一种脚本语言,代码在服务器上执行,而结果以纯文本返回浏览器. 2.PHP能够运行在各 ...

  6. 利用yaml文件管理资源

    利用yaml配置文件管理资源 [root@master ~]# cat nginx-deployment.yaml apiVersion: apps/v1beta2 kind: Deployment ...

  7. 梳理common-io工具包

    title: 梳理common-io工具包 comments: false date: 2019-08-28 14:21:58 description: 对common-io工具包中的常用类进行整理, ...

  8. Vue中全局过滤器期与局部过滤器期的使用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. vue中,svg图标添加click事件,部分浏览器不生效

    vue项目中,使用svg图标,但是发现,为svg图标绑定click事件时,部分浏览器会出现,点击没有反应的情况,代码如下: <icon name="icon_add" @cl ...

  10. springboot 集成 swagger 自动生成API文档

    Swagger是一个规范和完整的框架,用于生成.描述.调用和可视化RESTful风格的Web服务.简单来说,Swagger是一个功能强大的接口管理工具,并且提供了多种编程语言的前后端分离解决方案. S ...