日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

搜索 —— 启发式搜索 —— 爬山法

發布時間:2025/3/17 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 搜索 —— 启发式搜索 —— 爬山法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【概述】

爬山法(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;} }

?

總結

以上是生活随笔為你收集整理的搜索 —— 启发式搜索 —— 爬山法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。