C A 演算法實現8數或者15數問題

2021-08-29 06:42:47 字數 2704 閱讀 8779

-、問題描述

8數或15數問題是同乙個問題,其就是乙個隨機排列的8個或15個數在乙個方正格仔中移動到達規定的乙個目標狀態。由於只有乙個空格子,故只有在空格附近的棋子可以移動。

二、演算法描述

f 演算法選擇

此問題需要對所有可能的路徑進行窮舉,但是由於隨著樹的高度的加大,其子結點的增加宿舍劇增,所以對所有的子結點進行窮舉是不大現實的。而根據當前的狀態和目標狀態進行對比可以用乙個評估函式來評估當前狀態的好壞情況。而在這裡我們選擇a*演算法來進行求解,a*演算法是一種最好優先的演算法。f'(n) = g'(n) + h'(n),f'(n)是估價函式,g'(n)是起點到終點的最短路徑值,這裡就表示樹的高度,h'(n)是n到目標的最斷路經的啟發值,其原理是把當前產生的狀態和以前所以的狀態的評估函式值進行對比,選擇其中最小的評估函式繼續進行下一步。這裡我選擇h'(n)的啟發值為每個格仔到達它的目標位置所需要經過的最少步數。

f 演算法描述

需要說明的幾點:

1. 用openarr表示初始節點列表(待擴充套件,此為乙個動態陣列)

2.closedarr儲存已經訪問過的結點

3.演算法首先需要給出初始狀態,由於隨機產生的狀態並不一定能夠走到目標狀態,因此這裡採用從標準狀態往回走產生乙個被打亂的隨機狀態,這樣可以保證有解。

演算法實現:

1. openarr放置初始結點

2. 如果openarr為空集,則退出並給出失敗訊號

3. n取為openarr的第乙個節點,並從openarr中刪除節點n

4. 如果n為目標節點,則退出並給出成功訊號

5. 否則,將產生n子節點,並對n的每個子結點n』 進行如下操作:

1)如果n』 不在openarr和closedarr表中,則把n』放入openarr表中

2)否則,如果在openarr表中,計算評估值,並且如果比表中的評估函式的值小,則更新表中的評估值為當前的值。

3)否則,如果在closedarr表中,計算評估值,並且如果比表中的評估函式的值小,則把表中的評估值更新為當前的值,並把該結點從表中刪除,並在openarr表中加入該結點。

6、把n結點加入closedarr中

7、對openarr進行排序(根據評估函式從小到大),並轉到2。

三、程式設計

演算法使用c#語言來實現的。程式主要根據上面提供的廣度優先演算法的描述來對演算法進行實現的。程式共有四個類:

stepnode類,用來描述產生的各個結點的屬性以及方法等

heuristic_15num_search類,演算法實現類

form1類,是介面設計的類。

這裡分別提供了8數和15數問題的求解。並顯示了所經歷過的各個狀態轉移

以下主要對幾個核心演算法的程式實現進行說明介紹。

//stepnode類 以下幾個方法主要是控制格仔的左右上下的移動

//0 數字上移

private void moveup(position p) }

// 0 數字下移

private void movedown(position p) }

//0 數字左移

private void moveleft(position p) }

//0 數字右移

private void moveright(position p) }

//計算節點的啟發函式的值

private void computegeuristicgeneval() }

geneval += g;

this.heuristic_gene = geneval;

} //heuristic_15num_search類

//核心演算法實現部分

//迴圈搜尋匹配

private void loopsearch(stepnode node)

else

//如果在open表中

else if(contain(openarr,i)!=-1) }

//如果在close中。

else }

} //節點加入closed表中 表示已經訪問過了。

closedarr.add(node);

//對節點進行排序

openarr.sort(new mycomparer());

} }

//理論上不可能出現這種情況

path = "not found @!";

return;

} 四、試驗結果

1)8數問題搜尋路徑如下圖

generate 是用來隨機產生乙個初始狀態(46) 表示從標準狀態見過隨機的46步後產生的乙個隨機的初始狀態。這裡46是乙個隨機數,由於該數越大離目標越遠,搜尋越複雜故將此隨機數控制在0-100之間。3表示3的方正即8數問題,4表示4的方正即表示15數問題。

2)15數問題搜尋路徑如下圖

從以上結果來看,由於使用了啟發式的搜尋過程,因此大大加快的搜尋的速度以及能盡可能經過最少的路徑最快到達目標狀態,由於8數問題比較簡單因此搜尋速度較快,而15數問題複雜度加大,當隨機產生的數接近100的時候搜尋的時間迅速變慢,故演算法還待改進,主要是因為隨著深度的加深,openarr和closearr表中的資料迅速擴大,故可以考慮把openarr表中的狀態數進行選擇性的排除一些,比如每次把openarr中表的資料經過排序後可以刪除最後的幾個最差的狀態,這樣在一定程度上提高了速度但是也減低了找到最優解的機率不過這種減低是非常小的,因為被排除的已經是最差的情況了。 

C A 演算法實現8數或者15數問題

問題描述 8數或15數問題是同乙個問題,其就是乙個隨機排列的8個或15個數在乙個方正格仔中移動到達規定的乙個目標狀態。由於只有乙個空格子,故只有在空格附近的棋子可以移動。二 演算法描述 f 演算法選擇 此問題需要對所有可能的路徑進行窮舉,但是由於隨著樹的高度的加大,其子結點的增加宿舍劇增,所以對所有...

C A 演算法實現8數或者15數問題

問題描述 8數或15數問題是同乙個問題,其就是乙個隨機排列的8個或15個數在乙個方正格仔中移動到達規定的乙個目標狀態。由於只有乙個空格子,故只有在空格附近的棋子可以移動。二 演算法描述 f 演算法選擇 此問題需要對所有可能的路徑進行窮舉,但是由於隨著樹的高度的加大,其子結點的增加宿舍劇增,所以對所有...

演算法15 數論4 自守數

如果乙個正整數的平方的末尾幾位數等於這個數本身,那麼這個數便稱為自守數。自守數有如下的一些性質 1 以自守數為後幾位的兩數相乘,結果的後幾位仍是自守數 2 n 1位的自守數出自n為的自守數。3 兩個n位子守數的和等於10的n次方加1.我們給出兩種自守數的演算法 1 2 題目 自守數 3author ...