黄金点游戏作业要求及项目源码
作业要求:https://edu.cnblogs.com/campus/ustc/InnovatingLeadersClass/homework/2231
项目源码:https://github.com/ZRJMoon/Golden_Number
预估时间
PSP各个阶段 | 预估时间(hrs) | 实际记录(hrs) |
---|---|---|
计划:明确需求和其他因素,估计以下的各个任务需要多少时间 | 1 | 2 |
开发(包括下面8项子任务) | ||
&需求分析 | 2 | 1 |
&生成设计文档 | - | - |
&设计复审 | - | - |
&代码规范 | - | - |
&具体设计 | 1 | 0.5 |
&具体编码 | 4 | 3 |
&代码复审 | 0 | 0.5 |
&测试 | 2 | 3 |
报告 | ||
&测试报告 | - | - |
&计算工作量 | 0.5 | 0.5 |
&事后总结,并提出改进计划 | 2 | 2 |
总共花费的时间 | 12.5 | 12 |
接口设计与实现
整体策略:事先定义若干种action和state,通过历史数据训练在不同的state情况下对应的可以采取的不同action的概率,并预测出下一轮的state和应该采用的action。
get_numbers.py,程序的输入输出接口,程序从标准输入读取历史数据,并输出(0,100)中的两个数,以制表符 分隔。包含的函数及其功能如下:
函数 | 功能 |
---|---|
LineToNums (line, type=float ) | 将读入的历史数据转为type类型 |
stage1(input) | 利用上一轮的黄金点决定所预测黄金点的base |
stage2(history) | 根据前五轮黄金点的走势决定所预测黄金点与base相比的变化趋势(上升、下降、震荡) |
stage3(history) | 根据其余玩家输入数据的方差大小决定所预测黄金点与base相比的变化大小 |
get_s(history) | 根据state1,stage2,stage3函数判断历史数据所处的state |
get_base(idx1) | 得到base |
get_ratio(history) | 根据历史数据得到参数ratio用于变化大小的计算 |
get_a(idx, base, ratio) | 若干种action的定义 |
create_state_dict(list_1,list_2,list_3,num_act) | 创建state-action字典,方便找寻对应的action |
main() | 读入历史数据,并输出下一轮的游戏数据 |
UML图
在我们的程序中主要由main函数和一些接口函数组成,所以没有画UML类图
Design by Contract
我认为契约设计的好处在于它关注了软件模块的权利和责任,也就是说,给定了对应模块的前提条件,在实现时可以不用考虑不满足相应条件的情况,明确了实现范围,特定的输入与输出属性可以让代码变得明了易读,使得模块要求更加清晰准确,同时也方便了代码的复审。我们在结对的过程中,设计相应的函数时,会先确定该函数的功能和输入输出,再具体实现。
代码及设计规范说明
尽量将常量单独定义,每一个功能都用一个函数实现,方便了修改,但因为项目本身不算太大,所以没有进一步细化规范。对于异常处理,在实现项目时,经过思考和推导认为我们的方法基本不会产生非法输入,所以没有进行异常处理。但当结束后再一次检查时发现我们的code会产生小于0的非法输出,这一点没有得到很好的处理,是需要改进的地方。
结对过程描述
2018/10/13:学习Q-learning相关知识,确定初步的思路,采用state-action方式
2018/10/14:初步实现了功能,并进一步细化state和action的定义
2018/10/15:再一次检验调试,确保没有错误
合作方式及优缺点
我们采取的合作方式有“桥梁”和“说服”。
我认为结对编程的优点有很多,首先它可以提高编程效率,两人一起coding在很大程度上避免了走神,而且有些bug在编程的过程中就可以被发现了,极大的节约了时间,其次在结对编程的过程中,通过及时讨论,策略得以优化,可以实现更好的效果,最后,因为需要同他人交流、讨论,个人的表达能力和沟通能力也得到了显著的提高。要说缺点的话,通过这一次的结对编程经历来看,感觉在整个project的过程中有些缺乏个人安静思考的时间。
队友的优点有思路明确,肯花时间,善于沟通,但是有时候可能稍微有些急躁。从我个人而言,做事不拖沓,过程中比较细心,学习新知识比较快,但是有时候可能不是很有耐心。当说服对方时,可以先强调一下我们的方法思路都是很好的,再说明时间还来得及,没有必要着急,最后表明我们一起努力,一定可以完成项目的。
其它收获
本次比赛一共经历了两轮,我们的程序在第一轮中表现较好,第二轮中表现较差,经过分析,我认为是由于我们的程序在预测下一轮的黄金点时是将上一轮的黄金点作为base,因此在第一轮中黄金点波动较小,我们的程序可以取得较好的结果,但由于这个假设较强,在第二轮中,黄金点幅度变化比较大,结果就比较差。