爬山演算法是用來解決乙個不規律函式的最值問題的乙個演算法,其基本演算法是每一次向周圍走一步,並比對一下是否更優,如果更優的話就更改目前的位置,如果不是的話就不進行更改。
但是爬山演算法的劣勢也是比較顯然的,由於達到區域性最優解之後就很難跳出這個區間最低點,所以很容易陷入區域性最優解,盜一張圖:
那麼爬山演算法就一點用也沒有嗎,不是的,我們為了提高正確性,我們可以隨機的取幾個點,分別進行該操作,最後取乙個最好的結果,那麼在很大概率下他是正確的,所以爬山演算法的引數選擇性是很重要的,而且一般只能解決函式分布比較均勻的題目。
例題:
題目大意:
給定乙個n邊形所有頂點座標x,y,求其費馬點到所有頂點距離和
費馬點是指到多邊形所有頂點距離和最小的點
這道題我們可以用爬山演算法解決,考慮到正確率,我們可以隨機選擇多個點進行測試,我選擇了五個,然後對於他們進行比較,取最優的乙個。
對於每乙個點,我們設定乙個初始步數step,一般開的最好大一點,然後我們每一次向上下左右走這個步數,如果遇到更優的點就替換,沒有就繼續執行原來的點,並且步數要不斷減小,當步數小於一定值的時候就停止操作。
儘管我們會陷入區域性最優解,但是我們用多個點比對,還是很有可能找到最優解的。
最後,附上本題**:
1 #include2 #include3 #include4 #include5 #include6using
namespace
std;78
struct
node
9 a[110
];12
intn,t;
13const
int dtx[4]=,dty[4]=;
14double
ans;
1516 inline double pow2(double
x)17
20 inline double
getdis(node u)
2126
double
solve()
2745
if(next.dnext;
46 step*=0.5;47
}48return
u.d;49}
50int
main()
5163
return0;
64 }
爬山搜尋演算法
1.爬山法 hill climbing 爬山法是向值增加的方向持續移動到簡單迴圈過程,演算法在到達乙個 峰頂 時終止,此時相鄰狀態中沒有比該 峰頂 更高的值。爬山法不維護搜尋樹,當前節點只需要記錄當前狀態及其目標函式值 爬山法不會前瞻與當前狀態不直接相鄰的狀態的值 就像健忘的人在大霧中試圖登頂珠峰一...
爬山演算法與模擬退火演算法
模擬退火演算法 爬山演算法是一種基於貪心的搜尋方法,其原理是每次前往最佳的相鄰狀態。由於一般的搜尋問題無法看作結點數有限的圖,因此這裡的相鄰其實不是圖的那種相鄰。以搜尋二維平面上的乙個點為例。設 f x y f x,y f x,y 表示座標為 x,y x,y x,y 的點的權值,現在要找到乙個 x,...
建模方法(六) 爬山演算法
爬山演算法顧名思義就是不斷需找自變數使得當前的函式值小於新的自變數對應的函式值。他和模擬退火演算法很像,可以說模擬退火演算法也是爬山演算法的一類。爬山演算法,是一種區域性貪心的最優演算法.該演算法的主要思想是 每次拿相鄰點對應函式值與當前點對應函式值進行比對,取兩者中較優者,作為爬坡的下一步。爬山演...