机器学习解十滴水游戏
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
机器学习解十滴水游戏(共9页) --本页仅作为文档封面,使用时请直接删除即可--
--内页可以根据需求调整合适字体及大小--
[键入文档标题] [键入文档副标题]
黄青虬
自23
38
2014/10/19
目录
1.概述 ................................................................................................................错误!未定义书签。
2.游戏简介.........................................................................................................错误!未定义书签。
3.游戏界面设计及功能简介.............................................................................错误!未定义书签。
选择关卡 ..................................................................................................错误!未定义书签。
搜索求解 ..................................................................................................错误!未定义书签。
开挂 ..........................................................................................................错误!未定义书签。
注意事项 ..................................................................................................错误!未定义书签。
4.算法设计.........................................................................................................错误!未定义书签。
搜索算法 ..................................................................................................错误!未定义书签。
宽度优先搜索 .................................................................................错误!未定义书签。
A算法 .............................................................................................错误!未定义书签。
A*算法 ............................................................................................错误!未定义书签。
遗传算法 ..................................................................................................错误!未定义书签。
算法优劣比较 ..........................................................................................错误!未定义书签。
5.参考资料及备注.............................................................................................错误!未定义书签。
参考资料 ..................................................................................................错误!未定义书签。
备注 ..........................................................................................................错误!未定义书签。
1.概述
本次作业在VS2012平台下使用C#语言完成了两件事情。
一是实现了十滴水小游戏;二是使用了多种算法对其求解,包括三种搜索算法:宽度优先搜索、A算法、A*算法,以及一种智能优化算法:遗传算法。
2.游戏简介
如图一所示,十滴水游戏是在一个6×6的棋盘上,通过填补水滴来引爆原有的水滴,直到棋盘上所有水滴消失。
棋盘上每个格子可以放0、1、2、3、4滴水,当格子上有4滴水时,再往上面滴一滴水,则该水滴会爆,即格子上的水滴变为0,同时向四周各溅出一滴水,溅出的水如果遇到其他水滴就会并入,如果并入后水滴数又大于4了,则会有新一轮的引爆。
点击格子则在其上面滴一滴水。
水滴是有限制的,如图一,右上角会有一个水缸显示当前你还可以用的水滴数。
每引爆三滴水可以让水缸增加一滴水。
图一.网络上十滴水游戏界面
3.游戏界面设计及功能简介
本次作业主界面如图二所示,左方的棋盘和右上角的水缸与原游戏的功能一样,点击相应的格子即可在格子上加水,同时水缸的水量会根据使用的水量和奖励的水量做相应的变化。
同时在游戏原有的模块上又增加了以下模块和功能:
图二.游戏主界面图三.关卡选择界面
选择关卡
主界面右下方有“选择关卡”按钮,点击该按钮,会弹出选择关卡界面,如图三所示。
点击想要的关卡即可跳转到该关卡。
在主界面的中上方会显示当前在第几关。
搜索求解
搜索求解包括主界面右方的算法选择按钮、搜索结果显示文本框和“搜索求解”按钮。
算法选择按钮中可以选择“宽搜”、“A*”、“A”、“遗传算法”中的一种,然后点击“搜索求解”按钮,就会在搜索结果显示文本框中显示搜索到的解。
搜索到的解如图四所示,从上往下表示每一次要点击的格子。
每一次要点击的格子表示为(x,y)的形式。
以左上角为起点(即左上角的格子表示为(1,1)),横向为x轴,向右递增,竖向为y轴,向下递增。
对于搜索算法,由于十滴水游戏的状态空间巨大,如果不对搜索深度和时间做限制,对于比较复杂的解,将会出现内存不足或者在有限时间内无法求解的情况。
所以求解时对时间和搜索深度做了限制。
宽搜和A*的限制为:时间小于30s,深度小于5;A限制为:时间小于30s。
如果计算过程中不满足这些限制条件,将不再计算,退出并给出提示。
提示如图五所示。
对于遗传算法,由于有迭代代数的限制,所以无需再对时间做限制,但由于迭代代数的限制,所以有一定概率不能给出解,此时也会给出提示(由于在有限的测试集内未出现这种情况,这里无法给出图示)。
图四.搜索结果图五.解不满足限制条件提醒
开挂
由于有些关卡难度较大,而且对于步数大于5的解,宽搜和A*在有限的时间和空间内无法计算出来,而A和遗传算法给出的不是最优解,所以得到的解可能会有比较长的步数。
所以增设了“开挂”按钮,每点击一次水缸中增加10滴水。
注意事项
1. 点击水滴爆破后可能会引起一连串水滴爆破,所以动画时间较长,在动画过程中为了防止玩家乱按,将屏幕点击响应以及“搜索求解”、“开挂”、“选择关卡”三个按钮全部锁定,即此时不可点击格子放置水滴,也不能点击相应按钮实现其功能(按钮上的字会变颜色,如图六),直到不再有飞溅的水滴了,才恢复正常。
2.对于一些比较复杂的情况,搜索求解时时间可能会比较久,此时屏幕和按钮也会失去响应,但并非程序死了,而是在计算,计算完成后即恢复正常。
图六.水滴还在飞溅时按钮锁定
4.算法设计
本次作业针对十滴水游戏设计了三种搜索算法和一种智能优化算法,用6×6矩阵来表示状态,矩阵上的元素为数字0~4,分别表示有0~4滴水。
现在对每种算法分别做一定分析:
搜索算法
搜索算法的总体框架基本是一致的,总体框架如图七所示。
三种搜索算法的区别就在于队列的维护,即队首元素是怎么选择出来的,也就是f(n)的选取不同。
图七.搜索算法流程图
宽度优先搜索
估计函数
f(n)=g∗(n)
即只以过去所走的步数作为评价。
队列维护
而所走步数小的状态肯定会先进入队列,即f(n)越小越先进入队列,也应该越先出队被拓展。
所以只需使用“先进先出”的普通队列即可实现,无需对队列里的元素进行排序。
A 算法
估计函数
f (n )=
g (n )+h(n)
即不仅考虑过去所走的步数,还要对达到目标状态所要走的步数有一个估值h(n),通过这个估值来指导应该先拓展那个状态。
程序中所使用的h(n)是这样定义的:h (n )=ℎ1(n )+ℎ2(n)
其中
ℎ1(n )=−5m +∑∑−drop[i,j]6
j=1
6i=1
ℎ2(n )=3l
注:m 表示没有水滴的格子数量,因为没有水滴的格子不必再去消除,所以加了最大的负权值;drop[i,j]表示第i 行第j 列的格子上的水滴数,因为水滴越大越容易消除,所以加了负的权值,且水滴越大数值越小;l 表示孤立水滴的数量,孤立水滴即同一行同一列的格子上均没有水滴,因为孤立水滴是不利于消除的,所以加了一个正的权值。
而g (n )是这样定义的:g (n )=k ∗g ∗(n)
即实际所走步数乘上一个权值k 。
k 的选取将对A 算法的性能产生比较大的影响。
K 越大则得到的结果越优(即解的步数越短),但同时要搜索的空间也越大,当k →∞时,A 算法实际上就是宽度优先搜索。
反之,k 越小则搜索的空间会越小,但得到的结果可能越差。
经过试验测算,综合考虑了性能,最后程序中的A 算法k 取值为2。
队列维护
由于每次出队的状态都必须是队列里f (n )最小的,所以队列不能是普通的队列。
最简单的解决办法是每次要出队之前对队列里的元素按照f (n )从小到大做一个排序,但是这样的话复杂度是n log n ,明显会使得效率大大降低。
实际上我们每次只要取到最小值就够了,也就是说我们并不用保持全局有序。
考虑到这个,程序中用了优先队列(弗洛伊德最小堆)来维护这种有序关系。
即将队列里的元素存储成一个二叉堆的形式,保证所有父节点小于等于子节点。
这样每进来一个元素,只需做一次复杂度为log n 的上滤操作即可(出队同理)。
A*算法
估计函数
f (n )=
g (n )+h(n)
与A 算法类似,所不同的是A*算法要保证
{g (n )≥g ∗(n)h (n )≤ℎ∗(n)
所以程序中所使用的g(n)和h(n)分别是这样定义的:
g (n )=g ∗(n)
h (n )=∑∑{[5−t (a [i,j ]+drop [i,j ])]∗δ(drop [i,j ])}6
j=1
6i=1
其中t (x )= {
x,x ≤45,x >4,δ(x )= {1,x >00,x ≤0
,a [i,j ]=∑[δ(drop [i,k ])6k=1+δ(drop [k,j ])]−2.
下面证明h (n )≤ℎ∗(n):
首先看δ(drop [i,j ]),与δ(drop [i,j ])相乘代表只考虑原来有水的格子。
再看a[i,j],a[i,j]代表的是drop [i,j ]上下左右总共有多少滴水,即drop [i,j ]至多能接受到的来自其他水滴引爆的水滴。
所以{[5−t (a [i,j ]+drop [i,j ])]∗δ(drop [i,j ])}实际上代表的是:要使
drop [i,j ]爆破至少需要手动在drop [i,j ]上添加的水滴数。
所以有h (n )≤ℎ∗(n) 队列维护
同A 算法。
遗传算法
遗传算法主要是模拟生物进化过程,通过不断地优胜劣汰最终选出一个较优解。
其流程如图八所示。
图八.遗传算法流程图
遗传算法概念在十滴水游戏中的具体实例
1.
染色体:一个点,代表在该格子上舔一滴水。
2.
个体:一个长度为50的染色体(点)数组,代表添水序列,即一个解。
3.
种群:一个规模为500的个体数组。
4. 适应度:
fit (s )={36∗4+∑∑−drop [i,j ],个体无法清空棋盘6
j=1
6i=136∗4+(50−l )∗4,个体可以清空棋盘
其中l 代表该个体清空棋盘后所需要的染色体数。
5. 选择:根据个体的适应度,算出该个体被选出的概率,然后在种群中选出个体进行交
配
个体i 被选出的概率为:
P s (i)=fit(i)∑fit(k)
500k=1 从这个公式可以看出,适应度越大的被选出的概率越大,所以可以实现优胜劣汰。
6. 交叉:根据概率Pc (程序中取),两个个体交换部分染色体。
7. 变异:根据概率Pm (程序中取),该个体变异一个染色体。
8. 最大迭代代数M :程序中取200。
算法优劣比较
宽度优先搜索可以给出最优解,但是搜索量巨大,在游戏中,基本上四步以上的解法就无法在可接受时间内(30s )给出解。
A*算法也可以给出最优解,理论上来讲搜索量也会比宽搜小,但由于游戏中水滴比较密集,设计的h (n )实际上无法很好的起到作用,在很多情况下会退化成宽搜,再加上logn 的维护优先队列的成本,改善效果并不非常明显,四步以上也无法在可接受时间内(30s )给出解。
A 算法虽然无法给出最优解,但是搜索的空间大大减小,特别是在水滴密集的情况下,由于解比较多,所以很快就能搜到。
在最难的一关(30关,每个格子上都有一滴水),大概14s 左右也能给出解。
遗传算法与搜索算法的最大不同在于其随机性,即性能并不是非常稳定的(由于时间有限,迭代代数不能给的太多),所以对于步数非常短的解它并没有什么优势,给出的解往往步数比较长。
但是对于复杂的解它的优势就显示出来了,因为它的计算量是几乎不受状态空间大小影响的。
在第30关,遗传算法也能在60s 左右给出解,而且一般会优于A 算法的解。
5.参考资料及备注
参考资料
1. 《遗传算法原理》,网址:《第2章 产生式系统的搜索策略》,人工智能导论课资料 十滴水游戏,网址:备注
1. 程序所使用的部分贴图来自于网络
2.A*算法的估值函数h(n)的设计是与陈逸伦同学讨论之后得到的结果
3.除以上两点以外,其他模块的设计以及全部程序代码均为自己独立完成
9。