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