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的整數意義一一對應起來。時間效率高,但編碼解碼法適用範圍並不大,...