打飞机
以 《打飞机》 为例聊聊随机博弈游戏
这玩意因为随机性较强,书上大抵是没有,比赛场上也基本用不到,但是它对 代码能力 ,思维方式 以及 测试算法能力 提高都有很大帮助,并且对解决现实问题意义更大。
本文主要有两部分,为 主要算法 与 测试评估。
一.主要算法——价值决策
究竟采取哪一种决策会更优?关键在于以合适的方式为每种决策计算价值,然后挑选价值最大的那一着。
这个要分成两步:
-
搜集必要的信息。
-
赋予合适的价值。
考虑第一步,
最直接有效的 信息 ,显然是枚举出所有可能的情况(当然并不是所有题都适用,如围棋显然情况太多)。
以本题为例,凭直觉可以感受到合法的放置飞机防止并不会特别多:我们先不考虑出格与重叠,从 \(100\) 个格子里 选 \(3\) 个放飞机头,每架飞机方向有 \(4\) 种选法,那么仅有 \(\dbinom {100}3\times4^3=10^7\) 种放法。这是一个计算机常识:解决 \(10^7\) 规模的问题基本不会超过 \(100\text{ms}\)。再加上出格与重叠的剪枝,这显然是可以短时间处理出来的。
每一次探测完一个点后,我们重新枚举所有合法情况,便完美地处理出了所有的必要信息。
接下来是第二步
价值策略 是这类游戏最个性化且具决定作用的内容。
初级简单的的价值策略,一般是结合自身对游戏的理解,让算法拟合自己的实战策略。
以这道题为例,可能有一些常见的想法:
-
直击机头:游戏目标探测出三个机头,那么我每次挑选机头出现概率最高的位置进行探测。因为枚举了所有合法情况,以频率作为概率即可。
-
排可能性:有些时候当前形状可能对应了很多种放机头的方式,专门打机头又容易打空而降低效率,这时打一些能够排出很多情况的位置会比较好。事实上,如果当前剩余的合法情况是 \(1\) 个,那么游戏已经胜利了。找一些期望消掉较多情况数的位置即是不错的选择。
-
随机大法:在很多位置价值差不多时,随便乱丢几次(除去边角)可能带来美妙的结果。
-
……(发挥你的聪明才智吧!)
经测试,上面几种价值策略都有较优秀的表现,通过适当调节参数,平均步数可以达到 \(16\) 步左右,但是都会有一些波动性。
二.测试评估自己的算法
你问我平均 \(16\) 步是怎么算出来的?难道是手动和自己的程序玩了几百次得到的数据?
事实上,你需要写一段代码来评测自己的程序。
这个也很简单,可以直接加在原来的程序里。每次不断随机生成三个位置与方向看看是否合法,合法了就放好飞机开始测试,然后模拟一下探测与得到结果的过程,记录一下步数就好。单次运行进行多次测试,就可以得到大数据结果。
结束了

浙公网安备 33010602011771号