迷宮問題的啟發式搜尋解決方法

2021-09-02 23:43:13 字數 1877 閱讀 5746

迷宮實驗是取自心理學的乙個古典實驗。在該實驗中,把乙隻老鼠從乙個無頂大盒子的門放入,在盒子中設定了許多牆,對行進方向形成了多處阻擋。盒子僅有乙個出口,在出口處放置一塊乳酪,吸引老鼠在迷宮中尋找道路以到達出口。對同一只老鼠重複進行上述實驗,一直到老鼠從入口到出口,而不走錯一步。老鼠經過多次試驗終於得到它學習走通迷宮的路線。設計乙個電腦程式對任意設定的迷宮,求出一條從入口到出口的通路,或得出沒有通路的結論。

利用乙個二維陣列mg[x][y]表示迷宮,其中1<=x<=n,1<=y<=m。陣列元素值為1表示該位置是牆壁,不能通行;元素值為0表示該位置是通路。假定從mg[1][1]出發,出口位於mg[n][m],移動方向是( 上   下    左    右  )四個方向。用一種標誌(如數字8)在二維陣列中標出該條通路,並在螢幕上輸出二維陣列。

(1) 首先建立三個二維陣列,乙個用來盛裝當前迷宮的圖案,另外乙個用來標記這個點是否是擴充套件過,如果擴充套件過我們標記為1。

(2)建立point結構體,先x,y座標,和估價值cost,我們使用當前座標和目標座標的距離作為值,並且距離越小,優先順序越高。

(3)建立優先順序佇列,佇列最頂端是優先順序最高的節點,我們開始階段將start節點放置到佇列中,如果開始節點和終點節點一致,搜尋成功,退出

(4)將佇列中優先順序最高的節點彈出,擴充套件此節點,如果符合條件(上,下,左,右)擴充套件,然後判斷是否是最終節點,如果不是,將此節點放入到佇列中,迴圈進行,直至到最終節點。

(5)然後,我加了個記錄最優路徑的陣列,可以將每次擴充套件的節點進行記錄,最終可輸出最優路徑。

#include#include "stdafx.h"

#include#include#include#define rows 6

#define cols 6

using namespace std;

//迷宮規模的大小

int rows = 6;

int cols = 6;

int matri[rows][cols];//迷宮的規模

int mark[rows][cols];//標記已經走過的點

int mypath[rows][cols];//標記最終所走的路徑

int start_x;

int start_y;

int des_x;

int des_y;

void initmap()//初始化地圖

point(int x1, int y1,int step1)

float setcost() };

priority_queueque; //將符合條件的點放入到這個地方

bool end(point a, point b)

return 0;

}int canmove(int x)

int findpath()

if ((canmove(temp.x + 1)!=-1)&&(matri[temp.x+1][temp.y]==1)) //下移

if ((canmove(temp.y - 1)!=-1)&&(matri[temp.x][temp.y-1]==1)) //左移

if ((canmove(temp.y + 1)!=-1)&&matri[temp.x][temp.y+1]==1) //右移

這種全域性式的啟發函式方法比較類似的還有八數碼問題,有興趣可瀏覽部落格

八數碼問題的啟發式搜尋方法 A 搜尋

在3 3棋盤上,放有1到8八個數碼,有1個方格是空的,空位置用0表示,對空格依次執行左移 右移 上移和下移這四個操作,使得棋盤從初始狀態到目標狀態。本次實驗中以如下初始狀態和目標狀態為例 本次啟發式搜尋是在廣度優先遍歷的基礎上給出啟發資訊的搜尋,然後在每一層結點中利用啟發資訊找乙個最優結點,然後在這...

八數碼問題 啟發式搜尋

一 問題描述 在乙個3 3 的方棋盤上放置著 1,2,3,4,5,6,7,8 八個數碼 每個數碼佔一格 且有乙個空格。這些數碼可以在棋盤上移動,其移動規則是 與空格相鄰的數碼方格可以移入空格。現在的問題是 對於指定的初始棋局和目標棋局,給出數碼的移動序列。該問題稱八數碼難題或者重排九宮問題。原始碼 ...

八數碼問題 啟發式搜尋

我們在搜尋的時候往往會發現一些資料會導致我們的普通的深搜與廣搜都無法通過,那這個時候我們就需要讓起點與終點建立一些聯絡,今天我們講述的啟發式搜尋就是在廣度優先搜尋的基礎上加了這樣乙個優化,叫做估價函式。對於乙個狀態,在我們知道終點狀態的時候,我們可以設計乙個估價函式使我們對這個狀態距離終點的距離有個...