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软件工程 第一次阅读作业 项目 内容 这个作业属于哪个课程? 北航软工 这个作业的要求在哪里? 第一次个人作业 我在这个课程的目标是? 学习高效严谨的软件工程开发过程,建立团队意识 这个作业在 ...
随机推荐
- Spring 中的几个常用的钩子接口
1.Aware接口 Awear 这个单词的意思是知道的,所以可以猜想以Awear 结尾的接口意思可以把他知道的东西告诉我们.常用的Awear接口有 ApplicationContextAware和 B ...
- ABC050D/ARC066D Xor Sum
题目链接 题目大意 可表为 $(a \xor b, a + b)$ 的二元组有多少个? $a, b$ 满足下列约束条件: ① $a, b$ 是非负整数: ② $a + b \le N$,$N$ 是给定 ...
- Intel Driver and Support Assistant 安装失败
Intel Driver and Support Assistant 以下简称 Intel DSA. Intel DSA 依赖 Microsoft Visual C++ 2015-2019 Redis ...
- 2019CCPC-江西省赛 -A Cotree (树形DP,求树上一点到其他点的距离之和)
我是傻逼我是傻逼 #include<bits/stdc++.h> using namespace std; const int maxn=4e5+50; typedef long long ...
- Sleepy Game CodeForces - 936B
大意: 给定有向图, 初始点S, 两个人轮流移动, 谁不能移动则输, 但后手睡着了, 先手可以控制后手操作, 求最后先手结果. 刚开始看错了, 还以为后手也是最优策略.... 实际上判断是否有偶数个节 ...
- Spring经典高频面试题,原来是长这个样子
Spring经典高频面试题,原来是长这个样子 2019年08月23日 15:01:32 博文视点 阅读数 719 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文 ...
- 自定义字段的设计与实现(Java实用版)
前言 自定义字段又叫做"开放模型",用户可以根据自已的需求,添加需要的字段,实现个性化定制. 使用自定义字段的目的,使用自定义字段解决哪些问题 如现有一套CRM系统,客户模块中客户 ...
- cut--修剪小能手
cut命令 cut原理:以每一行位一个处理对象. 参数选项 解释说明 -b 以字节为单位进行分割 -c 以字符为单位进行分割(对切割中文有奇效) -d 自定义分隔符号,默认以tab为分隔符 1:-b ...
- hdfs 配置文件详解
– dfs.name.dir – NameNode 元数据存放位置 – 默认值:使用core-site.xml中的hadoop.tmp.dir/dfs/name – dfs.block.size – ...
- 微信小程序获得高度
wx.getSystemInfo({ success: (res) => { wx.createSelectorQuery().select('#scrollbox').boundingClie ...