拼图游戏及其相关算法
From: http://blog.sina.com.cn/s/blog_4ed8b87701011c6x.html
?
??這個(gè)問題其實(shí)可以簡單表述成,3*3的格子裝了1至8,8個(gè)數(shù)字,數(shù)字是隨機(jī)分布于各個(gè)格子中,問是否可以利用空格的格子,移動裝有數(shù)字的格子最終達(dá)到某種序列?比如像常見的拼圖游戲,8個(gè)圖格,然后利用空白格移動圖片格子使其成為一幅完整的圖案。
如圖1所示
圖1 隨機(jī)打亂的數(shù)字圖格和目標(biāo)狀態(tài)
問題隱含的數(shù)學(xué)原理
這個(gè)問題其實(shí)涉及到數(shù)學(xué)中群論。目標(biāo)狀態(tài)問題可以歸結(jié)為一個(gè)置換群的問題,一個(gè)任意的狀態(tài)A最終如果能夠達(dá)到目標(biāo)狀態(tài)F,那么我們可以說置換群的個(gè)數(shù)為1,如果只有50%的可能性,那么這個(gè)置換群的個(gè)數(shù)就是2了。置換群內(nèi)部的狀態(tài)可以互相轉(zhuǎn)換,但是卻不可能有A群中的狀態(tài)轉(zhuǎn)向B群中的狀態(tài)互相轉(zhuǎn)換的情形發(fā)生。九宮格的問題其實(shí)是一個(gè)奇偶置換群的實(shí)例,該群無論如何置換奇偶性都不變,所以如果開局和目標(biāo)的奇偶性相同,就一定有解(因?yàn)榻?jīng)過有限次的置換一定循環(huán)),如果奇偶性不同,一定無解。
n*n的方格中放入1,2,3,…,n-1及一個(gè)空格,在任何一種狀態(tài)A下,??
定義:f(i)=k,表示i放在第k個(gè)格子中,k按照從左至右,從上到下排序;??
定義:g(i,j)=1,?如果(f(i)-f(j))(i-j)<0;否則為0;
定義:F(A)=∑?g(i,j),對所有i,j求和(這里i<j);
針對圖1,其目標(biāo)F(End)=0,其初始F(Begin)=12(f(1)=1 f(2)=9 f(3)=3 f(4)=4 f(5)=8 f(6)=2 f(7)=7 f(8)=5),其奇偶性相同,故有解。利用F函數(shù)可以解決所有n為奇數(shù)的情況。比如n=3,因?yàn)橐苿涌崭裰挥?種方式:在同行中移動不改變F值,在不同行中移動F值+2,-2或不變,故初始和末態(tài)的狀態(tài)不會發(fā)生改變。
問題隱含的人工智能原理
在數(shù)學(xué)上,我們雖然完美解決了問題是否存在解決方案的問題,但是實(shí)際上,我們需要實(shí)現(xiàn)這個(gè)方案的具體內(nèi)容,即在存在解的情況下,如何移動最少的步數(shù)使其達(dá)到目標(biāo)狀態(tài)。人工智能的啟發(fā)式搜索算法在這里派上了用場。所謂的啟發(fā)式搜索就是對于許多應(yīng)用過程,可以找到領(lǐng)域特有的知識來指導(dǎo)搜索過程,以提高工作效率,而這些知識稱為啟發(fā)式知識。我們先給出狀態(tài)空間搜索的概念,狀態(tài)空間搜索,就是將問題求解過程表現(xiàn)為從初始狀態(tài)到目標(biāo)狀態(tài)尋找這個(gè)路徑的過程,就是在解一個(gè)問題時(shí),找到一條解題的過程可以從求解的開始到問題的結(jié)果。由于求解問題的過程中分枝有很多,主要是求解過程中求解條件的不確定性,不完備性造成的,使得求解的路徑很多這就構(gòu)成了一個(gè)圖,我們說這個(gè)圖就是狀態(tài)空間。問題的求解實(shí)際上就是在這個(gè)圖中找到一條路徑可以從開始到結(jié)果。這個(gè)尋找的過程就是狀態(tài)空間搜索。常用的狀態(tài)空間搜索有深度優(yōu)先和廣度優(yōu)先。廣度優(yōu)先是從初始狀態(tài)一層一層向下找,直到找到目標(biāo)為止。深度優(yōu)先是按照一定的順序前查找完一個(gè)分支,再查找另一個(gè)分支,以至找到目標(biāo)為止。這兩種算法在數(shù)據(jù)結(jié)構(gòu)書中都有描述,可以參看這些書得到更詳細(xì)的解釋。前面說的廣度和深度優(yōu)先搜索有一個(gè)很大的缺陷就是他們都是在一個(gè)給定的狀態(tài)空間中窮舉。這在狀態(tài)空間不大的情況下是很合適的算法,可是當(dāng)狀態(tài)空間十分大,且不預(yù)測的情況下就不可取了。他的效率實(shí)在太低,甚至不可完成。在這里就要用到啟發(fā)式搜索了。啟發(fā)式搜索就是在狀態(tài)空間中的搜索對每一個(gè)搜索的位置進(jìn)行評估,得到最好的位置,再從這個(gè)位置進(jìn)行搜索直到目標(biāo)。這樣可以省略大量無畏的搜索路徑,提到了效率。在啟發(fā)式搜索中,對位置的估價(jià)是十分重要的。采用了不同的估價(jià)可以有不同的效果。我們先看看估價(jià)是如何表示的。啟發(fā)中的估價(jià)是用估價(jià)函數(shù)表示的,如:f(n) = g(n) + h(n),其中f(n)是節(jié)點(diǎn)n的估價(jià)函數(shù),g(n)實(shí)在狀態(tài)空間中從初始節(jié)點(diǎn)到n節(jié)點(diǎn)的實(shí)際代價(jià),h(n)是從n到目標(biāo)節(jié)點(diǎn)最佳路徑的估計(jì)代價(jià)。
對于這個(gè)九宮格游戲,我們采用如下的評價(jià)函數(shù),f(n) = d(n) + h(n),其中d(n)為當(dāng)前狀態(tài)從初始狀態(tài)開始移動的步數(shù),h(n)計(jì)算當(dāng)前狀態(tài)與目標(biāo)狀態(tài)相比錯位的個(gè)數(shù)。搜索過程總是往f(n)最小的分枝方向進(jìn)行,以便快速達(dá)到最終狀態(tài)。
總結(jié)
以上是生活随笔為你收集整理的拼图游戏及其相关算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在SQL Server2005中使用 .
- 下一篇: SegmentFault Hackath