结对编程作业博客

结对编程作业

成员: 陈灿 王子博 刘泽

github地址:https://github.com/Smart-Hypercube/golden_number


 

PSP表格

我们事先开了个会,没有详细的PSP表格。

 

前期准备

 

规则

  • 假设有M个玩家,P1,P2,…Pm在 (0-100) 开区间内,所有玩家自由选择两个正有理数数字提交(可以相同或者不同)给服务器,假设N11,N12,N21,N22,Nm1,Nm2
  • 等M*2个数字都提交后,服务器做如下计算:(N11+N12+N21+N22+…+Nm1+Nm2)/(M*2)*0.618 = GN由此得到黄金点数字GN
  • 查看所有玩家提交的数字与GN的算术差的绝对值,值最小者得分,值最大者扣分。其它玩家不得分
  • 此回合结束,进行下一回合,多回合后,累计得分高者获胜
 

要求

  1. 玩家编写程序或脚本,每次运行只提交该回合的数字,然后退出。
  2. 可以用C++/C#等语言,最终编译成可执行的EXE。如果运行该EXE需要额外的库支持,需要把对应的dll文件一并提交,保证绿色可直接运行。
  3. 可以使用Python,版本3.6,要求入口脚本文件必须命名为get_numbers.py。服务器支持的库的列表在https://docs.anaconda.com/anaconda/packages/py3.6_win-64/
  4. 可以使用Julia,版本1.0.1,要求入口脚本文件必须命名为get_numbers.jl。
  5. 可以使用第三方算法或者模型,但要注明出处,注意open source等版权问题。
  6. 猜一轮数字的程序代码必须在5秒之内运行完成,然后自动关闭。
  7. 比赛时提供一台服务器,所有程序拷贝并运行在该服务器上。玩家不得与该服务器交互,不得恶意攻击服务器。
  8. 服务器上的调度程序并行运行玩家的程序,输入为所有前Y轮的历史数据(包括G值和其他玩家的数字),输出为本轮猜测的两个数字。使用标准输入输出与玩家程序进行交互。
  9. Bot如果需要知道自己上一轮提交的值,或者需要多轮之间共享数据,可以通过本地文件存储中转数据,数据文件只可以放在Bot同级目录下,且大小不得超过100M。
  10. 比赛开始后,服务器实时计算本轮运行结果并在大屏幕上显示最新结果(G值,得分)。
  11. 课后会提供一些历史模拟数据,供大家参考,来决定如何编写代码及训练模型。在Data目录下, FirstData.txt是23个玩家某次比赛200回合的数据,SecondData.txt是该23个玩家调整策略后重新比赛400回合的数据。
  12. 在Player目录下有一个使用上述历史数据复盘的模拟程序,大家可以参考使用,同时还提供了简单的C#/Python/Julia的示例。
 

看教科书和其他资料中关于Information Hiding, Interface Design, Loose Coupling的章节,说明你们在结对编程中是如何利用这些方法对接口进行设计的。

在会议中,我们确定了程序的框架,最关键的思想是准备多个策略,利用历史数据来判断应该使用哪个策略。鉴于代码比较简单,我们没有严格按照书上提到的方法进行设计。

 

描述重要模块接口的设计与实现过程。设计包括代码如何组织,比如会有几个类、几个函数,他们之间的关系是如何的,关键函数是否需要画出流程图?说明你的算法的关键(不必列出源代码),以及独到之处。

我们的代码主要就是预先写好5000个weights,然后通过对历史黄金点数据的分析选出当下最合适的2个weights。
- predict(value, weight):接受至多50个黄金点以及一个50维的权值向量,从而预测下一个黄金点
- score(weight): score函数接受一个权值向量,利用最近8个黄金点来给每个weights打分。
- main(): 预先读入权值向量和历史黄金点,对所有策略进行测评,并输出得分最高的两个策略的预测值
我们算法的关键就是竞争器,写好多个策略,利用历史信息判断下一次使用哪个策略。

 

阅读有关UML的内容。画出UML图显示计算模块部分各个实体之间的关系(一个图即可)。

我们的项目没有用对象,逻辑非常简单,就在简单的main()函数中。

 

看Design by Contract的内容,描述这些做法的优缺点,说明你如何把它们融入结对作业中。

契约式设计最主要的目的是希望程序员能够在设计程序时清晰地规定一个模块单元(具体到面向对象,就是一个类的实例)在某个操作前后应当属于何种状态,感觉不是一种编程范型,而是一种设计风格。契约式设计强调三个概念:前置条件,后置条件和不变式。前置条件发生在每个操作(方法,或者函数)的最开始,后置条件发生在每个操作的最后,不变式实际上是前置条件和后置条件的交集。违反这些操作会导致程序抛出异常。优点是很规范,缺点是麻烦。在正规的结对编程过程中能帮助我们设计接口。

 

程序的代码规范、设计规范。你们俩如何达成共识、采用什么规范?程序中是否有异常处理?你如何处理各种异常?

这个项目代码量比较小,我们在第一次开会的时候就基本上确定了比赛时候的程序逻辑。所以没有特别考虑这些东西。

 

描述界面模块的详细设计过程。你的程序有用户界面么?在博客中详细介绍你如何设计你的界面模块。

没有。

 

描述界面模块与其他模块的对接。详细描述UI模块的设计与其他模块的对接,并在博客中截图实现的功能。界面/控制/数据模块体现了MVC的设计模式了么?

只有一个简单的机器界面。

 

描述结对的过程。提供两人在讨论的结对照片。遮挡和美化都是允许的。

我们三人组项目,我和另外一位同学中间都不在公司,是在一开始的时候,就确定了每个人应该干什么活,所以不存在严格的结对编程,每个人完成属于自己的一部分工作。总体是由王子博整合。

 

看教科书和其他参考资料中关于结对编程的章节,说明你们采用了哪种合作方式,以及结对编程的优点和缺点。a) 结对的每个人的优缺点在哪里(需列出至少三个优点和一个缺点)?b) 你如何说服你的伙伴改进他/她的缺点?请考虑一下三明治方法。

这个不太符合我们的项目。我们三个人地理位置是不同的,所以把任务分成三部分完成。结对编程的优点在于代码的质量会变高,缺点在于比较耗时间而且很考验两个人的磨合。由于项目比较小而且大家合作的时间比较短,不能很好地看出每个人地优缺点。

 

在你实现完程序后,请在PSP表格中记录下你在开发各个步骤上实际花费的时间。说明差异的原因。

我们这次没有PSP表格。

 

其他收获。例如,如何攻克技术难点,你做了哪些阅读和探索,可以把资料和经历描述一下。如果你的项目是和其他同学一起比赛(例如比赛速度),描述一下你的程序和其他程序的优劣。

Q-learning给我的直观感bu不靠谱,我和两个队友一致决定不使用Q-learning,而是采用了非常简单的线性卷积进行处理,我们相信传统的统计方法可能更加适合于这个问题。而对于Q-learning,比赛的时候的确有的组在这次比赛中做的非常好,这是让我所始料未及的。希望以后再遇到这类问题能更加客观地处理,看到更多可能性。

 

posted @ 2018-10-22 12:57  eeom  阅读(182)  评论(2编辑  收藏  举报