ASE高级软件工程 第一次结对作业
黄金点游戏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高级软件工程 第一次结对作业的更多相关文章
- ASE——第一次结对作业
ASE--第一次结对作业 问题定义 很早就听说了MSRA的黄金点游戏,让大家写Bot来参加比赛看谁的AI比较聪明可以操盘割韭菜.深感ASE课程老师设计的任务太用心了,各种接口都准备好了,大家只用专注于 ...
- [BUAA软工]第一次结对作业
[BUAA软工]结对作业 本次作业所属课程: 2019BUAA软件工程 本次作业要求: 结对项目 我在本课程的目标: 熟悉结对合作,为团队合作打下基础 本次作业的帮助:理解一个c++ 项目的开发历程 ...
- 【ASE高级软件工程】第一次结对作业
问题定义 具体规则见:讲义.大致规则如下: N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数 ...
- 【ASE高级软件工程】第二次结对作业
重现baseline 我们选择重现CODEnn模型(论文:Deep Code Search),因为它结构简单.端到端可训练,且相比其它方法拥有较高的性能. Baseline原理 为了根据给定的quer ...
- ASE高级软件工程 第一周博客作业
1.自我介绍 我叫姚顺,是来自哈尔滨工业大学计算机学院的一名大四本科生,专业方向计算机科学,目前在KC组实习.平时的业余时间主要用来打篮球,听音乐,跑步,当然还有游戏(划掉).之前的大学三年主要用来做 ...
- ASE —— 第一次结对作业
问题定义 游戏规则: N个玩家,每人写一个或两个0~100之间的有理数 (不包括0或100),提交给服务器,服务器在当前回合结束时算出所有数字的平均值,然后乘以0.618,得到G值. 提交的数字最靠近 ...
- 高级软件工程第二次作业:随机生成N个不重复的已解答完毕的数独棋盘
#include <stdio.h> #include "SuduCheck.h" ][],int i,int j,int k) //判断是否可以将第i行.第j列的数设 ...
- 【ASE高级软件工程】Alpha 阶段 backend组 scrum1 记录
本次会议于11月4日,19:10 在微软北京西二号楼13478召开,持续40分钟. 与会人员:Haifeng Chen, Zhikai Chen, Hao Wang, Jia Ning 请假: Xin ...
- 【BUAA软件工程】第一次阅读作业
BUAA软件工程 第一次阅读作业 项目 内容 这个作业属于哪个课程? 北航软工 这个作业的要求在哪里? 第一次个人作业 我在这个课程的目标是? 学习高效严谨的软件工程开发过程,建立团队意识 这个作业在 ...
随机推荐
- Python学习【day02】- 运算符与基本类型
Python语言支持以下类型的运算符: 算术运算符 操作符 描述 示例(a=10.b=21) + 加法 相加运算两侧的值 a + b = 31 - 减法 操作符右侧数减去左侧操作数 a – b = - ...
- 网络信息统计netstat|ss|ip
1:netstate[弃用] netstat的作用: 需求 原命令 新命令 1:网络连接 netstat -a ss 2:路由表 netstat -r ip route 3:统计接口 netstat ...
- bash脚本测试总结
bash脚本测试总结 跟踪脚本的执行 可以让bash打印出你脚本执行的过程中的所有语句.这很简单,只需要使用bash的-x选项就可以做到,下面让我们来看一下. 下面的这段脚本,先是输出一个问候 ...
- 深入理解hadoop之机架感知
深入理解hadoop之机架感知 机架感知 hadoop的replication为3,机架感知的策略为: 第一个block副本放在和client所在的datanode里(如果client不在集群范围内, ...
- 树莓派 ubuntu mate 16.4 frp使用什么版本 如何让外网访问
首先 frp选择frp arm 我选的是32位 你先需要一个有公网ip的服务器,然后搜索网上frp的教程,网上很多足够
- 多线程之实现Runnable接口及其优点
多线程之实现Runnable接口: 1.创建一个Runnable接口的实现类 2.在实现类中重写Runnable接口的run方法 3.创建一个Runnable接口实现类的对象 4.创建Thread类对 ...
- docker 网络 实现
最近在学习docker网络相关的知识,关于网络这块儿记下来,以便review dokcer安装完成之后默认提供三种网络 bridge host none docker默认使用bridge brid ...
- 1、linux基础优化
1.添加一个用户 [root@oldboy ~]# useradd oldboy [root@oldboy ~]# id oldboy uid=500(oldboy) gid=500 (oldboy) ...
- vmware虚拟机安装centos7.3
vmware准备 CentOS准备,这里下载的是CentOS 7.3CentOS-7-x86_64-Everything-1611.iso 创建新的虚拟机 选择自定义安装 硬件兼容性默认最新的,不用动 ...
- Lua语言基本语法~运算符
Lua 变量 变量在使用前,必须在代码中进行声明,即创建该变量. 编译程序执行代码之前编译器需要知道如何给语句变量开辟存储区,用于存储变量的值. Lua 变量有三种类型:全局变量.局部变量.表中的域. ...