一、测试中使用过的方案
所有模拟结果(赢、输、平局)都是相对于电脑方,因此无论当前回合是棋手还是电脑,只要局面对电脑来说能赢,就算赢,其他情况同样使用这种方式。表中的赢、输、平局对应的数字表示对于模拟结果给予的奖励分数。最大模拟次数表示进行mcts模拟的次数。
|
赢
|
平局
|
输
|
最大模拟次数
|
UCB常量
|
方案1
|
+ 1
|
- 0.5
|
- 1
|
60,000
|
根号2
|
方案2
|
+ 2
|
- 1
|
- 2
|
60,000
|
根号2
|
方案3
|
+ 3
|
- 2
|
- 3
|
60,000
|
根号2
|
方案4
|
+ 3.5
|
- 2
|
- 3
|
60,000
|
根号2
|
方案5
|
+ 1
|
- 0.5
|
- 1
|
80,000
|
根号2
|
方案6
|
+ 2
|
- 1
|
- 2
|
80,000
|
根号2
|
方案7
|
+ 3
|
- 2
|
- 3
|
80,000
|
根号2
|
方案8
|
+ 3.5
|
- 2
|
- 3
|
80,000
|
根号2
|
方案9
|
+ 3.5
|
- 2
|
- 3
|
80,000
|
1 / 根号2
|
二、不同方案下的效果
根据下棋的性能与下棋的结果,我们采用以下指标进行描述:
1.智能度:
· 高——电脑走法能够符合目前五子棋的水准。棋手如果稍不注意,可能会输给电脑。
· 中——电脑虽然存在不合理的走法,但是还是有一定智能度。很多时候不会堵棋,只会自己想方设法连成5个,但胜率并不高。
· 低——电脑几乎是随便下棋,没有智能度,不懂堵棋,完全随机。就算已经连成四个,也不会去尝试完成第五个。
PS:智能度中或智能度低,都不能很好的满足人机五子棋要求。只是作为一个反映棋力的指标。
2.耗时:由于随着局面越来越清晰,每一步的耗时会逐渐减少。所以采用第一步棋作为衡量标准。单位为秒/s。
统计结果如下:
|
7 * 7
|
8 * 8
|
9 * 9
|
15 * 15
|
方案1
|
耗时3.46s,智能度高
|
耗时5.89s,智能度高
|
耗时8.58s,智能度中
|
耗时50.71s,智能度高
|
方案2
|
耗时3.55s,智能度高
|
耗时6.59s,智能度中
|
耗时8.92s,智能度高
|
耗时52.82s,智能度低
|
方案3
|
耗时3.58s,智能度低
|
耗时7.01s,智能度高
|
耗时9.72s,智能度中
|
耗时51.29s,智能度高
|
方案4
|
耗时2.97s,智能度高
|
耗时6.89s,智能度高
|
耗时8.53s,智能度中
|
耗时53.55s,智能度低
|
方案5
|
耗时5.47s,智能度高
|
耗时7.05s,智能度中
|
耗时14.02s,智能度中
|
耗时65.67s,智能度高
|
方案6
|
耗时4.94s,智能度中
|
耗时7.13s,智能度中
|
耗时9.56s,智能度中
|
耗时58.42s,智能度中
|
方案7
|
耗时3.17s,智能度中
|
耗时7.45s,智能度高
|
耗时13.56s,智能度中
|
耗时61.14s,智能度中
|
方案8
|
耗时4.25s,智能度中
|
耗时7.57s,智能度中
|
耗时13.52s,智能度高
|
耗时61.25s,智能度高
|
方案9
|
耗时2.13s,智能度中
|
耗时3.36s,智能度中
|
耗时5.33s,智能度中
|
耗时61.14s,智能度中
|
· 我们还测试过15 * 15棋盘下,采用方案9,但是模拟25万次。耗时为4分25秒,由于太不现实了,就没有继续测试。
· 由于时间太长了,因此上述表格每种情况都是在相同环境下只测试了一次,存在一定误差。
三、对现象的总结
①在8 * 8棋盘中采用与7 * 7相同的参数,依然可以保证棋力。但变成9 * 9后,智能度下降的很快,必须调整参数。
②在15 * 15棋盘中,我们预想理论上至少应该模拟7 * 7棋盘次数的平方倍,即25万次才能够保持棋力。但是现实中无法达到,因为耗时太多。
③15 * 15棋盘中,由于模拟次数受限,必须改参数使电脑更偏向胜率而不是探索,但是这样做会导致电脑十分短视,无法预见到潜在威胁,并且当电脑有四子连珠时,电脑将会仅考虑自己的赢面,而忽略棋手的局势(原因是电脑把自己的胜利看的比自己的失败重要)。
④15 * 15棋盘中,无论哪种方式,开局时都是类似随机位置下棋(与棋手的棋相隔很远),直到快输的时候偶尔才会堵棋。到了中期智能度会变高。
⑤在刚开始的走步中,电脑模拟的并不精确,随着棋局展开,电脑的精确度会越来越高,速度也会也来越快(这是因为可供选择的位置变少了),甚至到最后明明是棋手先手,却被电脑牵着鼻子走。这一点尤其在15 * 15,方案3的时候十分明显。
⑥上述表中,智能度为中的情况大多数都是由一个bug状态引起。我们截取了比较有代表性的三张图片:



上述3张图片产生原因是,电脑不知道当前是谁的回合,仅通过棋盘上的棋子状态判断。如果上述是棋手回合,电脑会误认为是自己的回合,将不防守而直接选择进攻,这就导致图片中的失败情况。这个bug与程序设计时的策略有关,目前无法解决此问题。在程序设计中,正确的做法应该分开电脑回合与玩家回合考虑,而不应该无论是电脑还是玩家,都从电脑方考虑,这种做法是片面的。
四、解决方案
如果在9 * 9及以下的棋盘进行,采用方案1
如果在15 * 15棋盘下进行,采用方案3
对于测试过程中出现的bug,如果修复,需要改动大量代码。因此我们选择不做处理。
附录:在15 * 15棋盘上,第一次不放水,电脑赢了的控制台信息:
采用的是15 * 15,方案3
棋手: (7,7)
当前棋子数: 1
电脑: (5,7) 用时51.29秒
当前棋子数: 2
棋手: (7,6)
当前棋子数: 3
电脑: (10,5) 用时41.77秒
当前棋子数: 4
棋手: (7,5)
当前棋子数: 5
电脑: (7,8) 用时40.87秒
当前棋子数: 6
棋手: (7,4)
当前棋子数: 7
电脑: (7,3) 用时40.39秒
当前棋子数: 8
棋手: (6,6)
当前棋子数: 9
电脑: (5,5) 用时39.67秒
当前棋子数: 10
棋手: (8,5)
当前棋子数: 11
电脑: (6,4) 用时37.63秒
当前棋子数: 12
棋手: (4,6)
当前棋子数: 13
电脑: (5,6) 用时33.41秒
当前棋子数: 14
棋手: (5,8)
当前棋子数: 15
电脑: (9,1) 用时29.65秒
当前棋子数: 16
棋手: (8,2)
当前棋子数: 17
电脑: (5,3) 用时24.43秒
当前棋子数: 18
棋手: (5,4)
当前棋子数: 19
电脑: (6,7) 用时30.50秒
当前棋子数: 20
棋手: (4,5)
当前棋子数: 21
电脑: (9,10) 用时24.51秒
当前棋子数: 22
棋手: (8,9)
当前棋子数: 23
电脑: (6,3) 用时28.27秒
当前棋子数: 24
棋手: (8,3)
当前棋子数: 25
电脑: (4,3) 用时17.30秒
当前棋子数: 26
棋手: (3,3)
当前棋子数: 27
电脑: (8,4) 用时30.20秒
当前棋子数: 28
棋手: (4,8)
当前棋子数: 29
电脑: (6,2) 用时27.88秒
当前棋子数: 30
棋手: (6,1)
当前棋子数: 31
电脑: (9,5) 用时18.63秒
当前棋子数: 32
棋手: (5,1)
当前棋子数: 33
电脑: (10,6) 用时1.20秒
当前棋子数: 34
电脑胜,请重置开始新的游戏