爬山算法簡(jiǎn)介和Python實(shí)現(xiàn)實(shí)例
一、爬山法簡(jiǎn)介
爬山法(climbing method)是一種優(yōu)化算法,其一般從一個(gè)隨機(jī)的解開始,然后逐步找到一個(gè)最優(yōu)解(局部最優(yōu))。 假定所求問題有多個(gè)參數(shù),我們?cè)谕ㄟ^爬山法逐步獲得最優(yōu)解的過程中可以依次分別將某個(gè)參數(shù)的值增加或者減少一個(gè)單位。例如某個(gè)問題的解需要使用3個(gè)整數(shù)類型的參數(shù)x1、x2、x3,開始時(shí)將這三個(gè)參數(shù)設(shè)值為(2,2,-2),將x1增加/減少1,得到兩個(gè)解(1,2,-2), (3, 2,-2);將x2增加/減少1,得到兩個(gè)解(2,3, -2),(2,1, -2);將x3增加/減少1,得到兩個(gè)解(2,2,-1),(2,2,-3),這樣就得到了一個(gè)解集:
(2,2,-2), (1, 2,-2), (3, 2,-2), (2,3,-2), (2,1,-2), (2,2,-1), (2,2,-3)
從上面的解集中找到最優(yōu)解,然后將這個(gè)最優(yōu)解依據(jù)上面的方法再構(gòu)造一個(gè)解集,再求最優(yōu)解,就這樣,直到前一次的最優(yōu)解和后一次的最優(yōu)解相同才結(jié)束“爬山”。
二、Python實(shí)例
設(shè)方程 y = x1+x2-x3,x1是區(qū)間[-2, 5]中的整數(shù),x2是區(qū)間[2, 6]中的整數(shù),x3是區(qū)間[-5, 2]中的整數(shù)。使用爬山法,找到使得y取值最小的解。
代碼如下:
import random
def evaluate(x1, x2, x3):
return x1+x2-x3
if __name__ == '__main__':
x_range = [ [-2, 5], [2, 6], [-5, 2] ]
best_sol = [random.randint(x_range[0][0], x_range[0][1]),
random.randint(x_range[1][0], x_range[1][1]),
random.randint(x_range[2][0], x_range[2][1])]
while True:
best_evaluate = evaluate(best_sol[0], best_sol[1], best_sol[2])
current_best_value = best_evaluate
sols = [best_sol]
for i in xrange(len(best_sol)):
if best_sol[i] > x_range[i][0]:
sols.append(best_sol[0:i] + [best_sol[i]-1] + best_sol[i+1:])
if best_sol[i] < x_range[i][1]:
sols.append(best_sol[0:i] + [best_sol[i]+1] + best_sol[i+1:])
print sols
for s in sols:
el = evaluate(s[0], s[1], s[2])
if el < best_evaluate:
best_sol = s
best_evaluate = el
if best_evaluate == current_best_value:
break
print 'best sol:', current_best_value, best_sol
某次運(yùn)行結(jié)果如下:
[[0, 5, 1], [-1, 5, 1], [1, 5, 1], [0, 4, 1], [0, 6, 1], [0, 5, 0], [0, 5, 2]]
[[-1, 5, 1], [-2, 5, 1], [0, 5, 1], [-1, 4, 1], [-1, 6, 1], [-1, 5, 0], [-1, 5, 2]]
[[-2, 5, 1], [-1, 5, 1], [-2, 4, 1], [-2, 6, 1], [-2, 5, 0], [-2, 5, 2]]
[[-2, 4, 1], [-1, 4, 1], [-2, 3, 1], [-2, 5, 1], [-2, 4, 0], [-2, 4, 2]]
[[-2, 3, 1], [-1, 3, 1], [-2, 2, 1], [-2, 4, 1], [-2, 3, 0], [-2, 3, 2]]
[[-2, 2, 1], [-1, 2, 1], [-2, 3, 1], [-2, 2, 0], [-2, 2, 2]]
[[-2, 2, 2], [-1, 2, 2], [-2, 3, 2], [-2, 2, 1]]
best sol: -2 [-2, 2, 2]
可以看到,最優(yōu)解是-2,對(duì)應(yīng)的x1、x2、x3分別取值-2、2、2。
三、如何找到全局最優(yōu)
爬山法獲取的最優(yōu)解的可能是局部最優(yōu),如果要獲得更好的解,多次使用爬山算法(需要從不同的初始解開始爬山),從多個(gè)局部最優(yōu)解中找出最優(yōu)解,而這個(gè)最優(yōu)解也有可能是全局最優(yōu)解。
另外,模擬退火算法也是一個(gè)試圖找到全局最優(yōu)解的算法。
相關(guān)文章
Python 手動(dòng)導(dǎo)包的實(shí)現(xiàn)
本文主要介紹了Python 手動(dòng)導(dǎo)包的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03解決Mac下首次安裝pycharm無project interpreter的問題
今天小編就為大家分享一篇解決Mac下首次安裝pycharm無project interpreter的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-10-10python自定義時(shí)鐘類、定時(shí)任務(wù)類
這篇文章主要為大家詳細(xì)介紹了Python自定義時(shí)鐘類、定時(shí)任務(wù)類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07python 實(shí)現(xiàn)圖片上傳接口開發(fā) 并生成可以訪問的圖片url
今天小編就為大家分享一篇python 實(shí)現(xiàn)圖片上傳接口開發(fā) 并生成可以訪問的圖片url,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12