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