黄金点游戏作业要求及项目源码
假设有M个玩家,P1,P2,…Pm
在 (0-100) 开区间内,所有玩家自由选择两个正有理数数字提交(可以相同或者不同)给服务器
假设提交N11,N12,N21,N22,Nm1,Nm2等M2个数字后,服务器计算:(N11+N12+N21+N22+…+Nm1+Nm2)/(M2)*0.618 = Gnum,得到黄金点数字Gnum
查看所有玩家提交的数字与Gnum的算术差的绝对值,值最小者得M分,值最大者扣2分。其它玩家不得分
此回合结束,进行下一回合,多回合后,累计得分高者获胜。
我们的bot收到的输入是游戏当前轮和历史所有轮次的Gnum和所有玩家的预测值,输出两个对下一轮黄金点的预测值。
项目源码地址:https://github.com/Turtlesyu-27/ASE-course
预估时间PSP表
PSP各阶段 | 预估时间(hour) | 实际记录(hour) |
计划: 明确需求和其他因素, 估计以下的各个任务需要多少时间 |
1 | 1 |
开发 (包含8项子项目) | 8 | 11.5 |
·需求分析 | 1 | 1 |
·生成设计文档 | 0.5 | 0.5 |
·设计复审 | 0.5 | 1 |
·代码规范 | - | - |
·具体设计 | 1 | 2 |
·具体编码 | 3 | 5 |
·代码复审 | 1 | 1 |
·测试 | 1 | 1 |
报告 | 1.5 | 2 |
·测试报告 | 0.5 | 0.5 |
·计算工作量 | 0.5 | 0.5 |
·事后总结 | 0.5 | 1 |
总花费时间 | 9.5 | 13.5 |
接口设计与实现
函数原型 | 功能 |
LineToNums(line, type=float) | 将输入的行按间隔符分割,并转换为某种数字类型的可迭代对象(默认为float类型) |
Mean(iter, len) | 用于计算均值的帮助函数 |
Run_RL_model() | 用Q-learning来运行module最终根据reward决定下一步的策略 |
强化学习中根据具体module的不同类型,也就是根据环境做出的反应来决定下一步的action,涉及函数较多,此处没有列举出来
Design by Contract
契约式设计的好处在于能够较为明确的分配好各个函数模块的之间的调用关系,使得代码变得更加清晰可读。同时能够更加清晰地明白整个数据的数据流,方便编码之后的进一步调试和代码复审。
代码及设计规范说明
在编码过程中达成一致的协议,涉及的各个功能尽量通过函数来模块化,哪怕是一些细小的功能也尽量做到封装,方便之后的调用和修改。然后所有的变量定义尽量清晰明确,同时在分工编程的过程中添加必要的注释。
结对编程的过程
2018-10-12 明确分工,同时熟悉老师给提供的代码框架与接口
2018-10-13 开始尝试用强化学习来知道复盘过程中对策略的即时调整。
2018-10-14 完成代码的调试和样例测试
合作方式及优缺点
结对编程的一个好处是可以提高效率,避免其中一个人效率低下,同时在结对编程的过程中出现的问题也可以通过两个人之间的交流及时得到解决。缺点就是相比自己一个人编程来说,有时候会比较缺少自己思考的时间,一个想法当一个人提出来的时候另一个人容易被这个想法带着走。
一些心得
这次的作业我们小组两轮拿到了第五名的成绩,听了其他组的分享,应该是我们在qtabel的更新的时候没有用很好的更新机制,例如应该根据上一部的黄金点的值来计算出下一步的概率,取概率最大的那个作为下一轮的黄金点的值。恰逢这次实验我们两个基本都在敢论文和组里的项目,所以没有太多的时间来进一步地优化模型,后期如果有更多的数据的话其实可以将模型训练的更完善一些。