八數碼問題的A 演算法求解

2021-09-22 20:04:24 字數 1631 閱讀 5015

a*演算法是啟發式搜素演算法中較為出名和高效的演算法之一,其關鍵是對於啟發式函式的實際,啟發式函式h(x)需要盡可能的接近實際的h(x)∗h(x)∗。下面是人工智慧八數碼問題使用a*演算法求解的原始碼放在部落格上記錄一下。程式使用放錯位置的棋子的個數作為啟發式函式。

#include #include #include using namespace std;

class picture

picture()

hvalue = 0;

**alue = 0;

fvalue = 0;

setarray();

}picture(const picture &sourse)

for (int i = 0; i < rowsize; ++i)

for (int j = 0; j < columnsize; ++j)

}~picture()

bool operator==(const picture &source) const

return true;

}void setarray() }}

}/* * 設定啟發式函式的值 */

void sethvalue(const picture &endpicture)

hvalue = result;

}void updatefvalue()

void set**alue(int value)

int **getpicturepoint() const

int getfvalue() const

int get**alue() const

int getzerorow() const

int getzerocolumn() const

void showpicture() const

cout << picturearray[i][columnsize - 1] << endl;

}coutvoid deleteelement(vector&thevector, const picture *element)

}}struct cmp

};bool astart(picture *&beginpicture, picture *&endpicture) ,,,

};while (!openqueue.empty())

closetable.push_back(bestpicture);

openqueue.pop();

deleteelement(opentable, bestpicture);

//向上下左右四個方向進行拓展  for (int i = 0; i < 4; ++i)

}flag = invector(closetable, *successor);

if (flag >= 0)

} else }}

}return false;

}int picture::rowsize = 0;

int picture::columnsize = 0;

void showresult(const picture *endpicture)

}int main() else

}

A 演算法 解經典八數碼問題

題目連線 問題引入 在進行bfs搜尋的過程中,只能說明起始狀態距離該狀態的代價最小,但是在未來的搜尋中,該狀態到目標狀態的可能會花費更高的代價,導致最優解的搜尋量增大。為了提高搜尋效率,可以讓那些代價大的方案盡可能的在後面進行搜尋,此時就需要引入a 演算法。做法 設計乙個估值函式f state 估值...

八數碼問題

八數碼問題 一.八數碼問題 八數碼問題也稱為九宮問題。在3 3的棋盤,擺有八個棋子,每個棋子上標有1至8的某一數字,不同棋子上標的數字不相同。棋盤上還有乙個空格,與空格相鄰的棋子可以移到空格中。要求解決的問題是 給出乙個初始狀態和乙個目標狀態,找出一種從初始轉變成目標狀態的移動棋子步數最少的移動步驟...

八數碼問題

2 6 4 1 3 7 0 5 8 8 1 5 7 3 6 4 0 2 樣例輸出 還有就是重判的問題,如何重判呢?第一種方法 把排列變成整數,然後只開乙個一維陣列,也就是說設計一套排列的編碼和解碼函式,把0 8的全排列和0 362879的整數意義一一對應起來。時間效率高,但編碼解碼法適用範圍並不大,...