爬山算法簡(jiǎn)介和Python實(shí)現(xiàn)實(shí)例
一、爬山法簡(jiǎn)介
爬山法(climbing method)是一種優(yōu)化算法,其一般從一個(gè)隨機(jī)的解開(kāi)始,然后逐步找到一個(gè)最優(yōu)解(局部最優(yōu))。 假定所求問(wèn)題有多個(gè)參數(shù),我們?cè)谕ㄟ^(guò)爬山法逐步獲得最優(yōu)解的過(guò)程中可以依次分別將某個(gè)參數(shù)的值增加或者減少一個(gè)單位。例如某個(gè)問(wèn)題的解需要使用3個(gè)整數(shù)類型的參數(shù)x1、x2、x3,開(kāi)始時(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),如果要獲得更好的解,多次使用爬山算法(需要從不同的初始解開(kāi)始爬山),從多個(gè)局部最優(yōu)解中找出最優(yōu)解,而這個(gè)最優(yōu)解也有可能是全局最優(yōu)解。
另外,模擬退火算法也是一個(gè)試圖找到全局最優(yōu)解的算法。
相關(guān)文章
pycharm軟件實(shí)現(xiàn)設(shè)置自動(dòng)保存操作
這篇文章主要介紹了pycharm軟件實(shí)現(xiàn)設(shè)置自動(dòng)保存操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06
Python緩存利器之cachetools庫(kù)使用詳解
cachetools庫(kù)為Python提供了強(qiáng)大而靈活的緩存解決方案,通過(guò)使用不同類型的緩存和緩存裝飾器,我們可以輕松地在程序中實(shí)現(xiàn)高效的緩存機(jī)制,從而提升程序性能,本文將詳細(xì)介紹cachetools庫(kù)的基本概念和使用方法,感興趣的朋友跟隨小編一起看看吧2024-07-07
Python使用pptx實(shí)現(xiàn)復(fù)制頁(yè)面到其他PPT中
這篇文章主要為大家詳細(xì)介紹了python如何使用pptx庫(kù)實(shí)現(xiàn)從一個(gè)ppt復(fù)制頁(yè)面到另一個(gè)ppt里面,文中的示例代碼講解詳細(xì),感興趣的可以嘗試一下2023-02-02
Python爬蟲(chóng)入門案例之爬取二手房源數(shù)據(jù)
讀萬(wàn)卷書(shū)不如行萬(wàn)里路,學(xué)的扎不扎實(shí)要通過(guò)實(shí)戰(zhàn)才能看出來(lái),今天小編給大家?guī)?lái)一份python爬取二手房源信息的案例,可以用來(lái)直觀的了解房?jī)r(jià)行情,大家可以在過(guò)程中查缺補(bǔ)漏,看看自己掌握程度怎么樣2021-10-10
pytorch使用voc分割數(shù)據(jù)集訓(xùn)練FCN流程講解
這篇文章主要介紹了pytorch使用voc分割數(shù)據(jù)集訓(xùn)練FCN流程,圖像分割發(fā)展過(guò)程也經(jīng)歷了傳統(tǒng)算法到深度學(xué)習(xí)算法的轉(zhuǎn)變,傳統(tǒng)的分割算法包括閾值分割、分水嶺、邊緣檢測(cè)等等2022-12-12
python調(diào)用API實(shí)現(xiàn)智能回復(fù)機(jī)器人
這篇文章主要為大家詳細(xì)介紹了python調(diào)用API實(shí)現(xiàn)智能回復(fù)機(jī)器人,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04
Python替換Excel表格中的空值或指定值的實(shí)現(xiàn)
本文介紹了使用Python的pandas庫(kù)結(jié)合openpyxl來(lái)批量替換Excel表格中的空值或指定值,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-12-12
Python實(shí)現(xiàn)操縱控制windows注冊(cè)表的方法分析
這篇文章主要介紹了Python實(shí)現(xiàn)操縱控制windows注冊(cè)表的方法,結(jié)合實(shí)例形式分析了Python使用_winreg模塊以及win32api模塊針對(duì)Windows注冊(cè)表操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-05-05

