搜索 —— 启发式搜索 —— 爬山法
生活随笔
收集整理的這篇文章主要介紹了
搜索 —— 启发式搜索 —— 爬山法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【概述】
爬山法(Hill Climbing,HC)是一種局部擇優的貪心搜索算法,其本質上是梯度下降法。
該算法每次從當前的節點開始,與周圍的鄰接點進行比較:
- 若當前節點是最大的,那么返回當前節點,作為最大值
- 若當前節點是最小的,就用最高的鄰接點替換當前節點,從而實現向山峰的高處攀爬的目的
如此循環往復,直到達到最高點為止。
但該算法的主要問題是:局部最大,即某個節點會比周圍任何一個鄰居都高,但只是局部最優解,并非全局最優解。
如下圖,在處于當前解時,爬山法搜索到局部最優解后,就會停止搜索,因為在局部最優解這個點,無論向哪個方向小幅度的移動,都無法得到更優解
此外,其還存在以下兩種問題:
- 高地問題:搜索一旦到達高地,就無法確定搜索最佳方向,會產生隨機走動,使得搜索效率降低
- 山脊問題:搜索可能會在山脊的兩面來回震蕩,前進步伐很小
當出現以上問題后,只能隨機重啟爬山算法來解決。
【主要思路】
首先,隨機選擇一個登山的初始時間 T,這個參數是隨機選擇的
然后,只要當 T 大于一個邊界值 EPS 時,就將當前點與其鄰接點進行比較:
- 如果 res<newRes,轉移答案,并記錄新坐標點 pos
- 如果 res>newRes,不轉移
之后,根據記錄下來的新坐標點 pos,去轉移狀態,一般為:sta = sta +?(node[pos] - sta)?*?T;
最后,對 T 乘以一個小于但十分接近于 1 的數 delta,以體現時間對答案的影響。
不斷重復上述步驟,直到鄰接點中不再有比起大的點。
int getPos(double x) {//比較答案并獲取新坐標點int pos;//新坐標點double res = -INF;for (int i = 1; i <= n; i++) {double newRes = getRes(x, node[i]);//獲取新狀態答案if (newRes > res) { //比較答案res = newRes; //更新結果pos = i; //記錄新坐標點}}return pos; } void HC(double &x,double &y) {double T = 1;while (T > EPS) {int pos = getPos(x);//獲取下一狀態的坐標sta = sta + (node[pos] - x) * T;//轉移x狀態T *= 0.96;} }?
總結
以上是生活随笔為你收集整理的搜索 —— 启发式搜索 —— 爬山法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 理论基础 —— 线性表 —— 循环链表
- 下一篇: Little Elephant and