啟發式演算法 模擬退火演算法

2021-10-07 12:28:08 字數 3344 閱讀 8449

執行環境:windows10,python3.7

1.問題模型:

y =(

x−7)

∗(x+

2)∗(

x−6)

∗(x+

9)∗s

in(x

)∗si

n(0.5∗x)

y=(x-7)*(x+2)*(x-6)*(x+9)*sin(x)*sin(0.5*x)

y=(x−7

)∗(x

+2)∗

(x−6

)∗(x

+9)∗

sin(

x)∗s

in(0

.5∗x),x

∈[−10

,10], x \in [-10,10]

,x∈[−1

0,10

]函式影象如圖

求解最小解,及其值?

2.模擬退火演算法是用於解決最優化問題的一種啟發式搜尋(ea)演算法。

init_temperature = 1000 #初始溫度

min_temperature= 1 #溫度下限

cycle_iterator = 1000 #每個t值的迭代次數

decay_factor = 0.95 #溫度衰減係數

3.求解效果

python**片【anneal上的子函式排列順序與annea的**中函式呼叫順序一致】.

import random

import math

import matplotlib.pyplot as plt

import numpy as np

###########全域性引數##################

init_temperature =

1000

#起始溫度

min_temperature=

1#溫度底線

cycle_iterator =

1000

#每個t值的迭代次數

decay_factor =

0.95

#溫度衰減係數

####################################

########被求解函式影象

defissue()

: x=np.linspace(-10

,10,10000

) y=

(x-7)*

(x+2)*

(x-6)*

(x+9

)*np.sin(x)

*np.sin(

0.5*x)

plt.plot(x, y,

'r')

plt.show(

)########進行擾動

defdisturbance

(x1)

: x2=x1+(2

*random.random()-

1)#隨機產生[-1,1]之間的擾動

return x2

########判斷是否接受x2

defaccept_x2

(x1,x2,differ_e,now__temperature)

: x=x1

if differ_e<0:

x = x2

else

:a p = np.exp(

-(differ_e)/(

1*now__temperature)

)if random.random(

)x = x2

return x

########函式

deffunction

(x):

y=(x-7)*

(x+2)*

(x-6)*

(x+9

)*np.sin(x)

*np.sin(

0.5*x)

return y

########退火過程

defannealing

(init_x,init_temperature)

: x1=init_x

now__temperature=init_temperature

iterator_counter=

0#迭代計數器-計數總共迭代次數

results=

#計算結果

while now__temperature>min_temperature:

for i in

range(0

,cycle_iterator)

: x2 = disturbance(x1)

if x2>=-10

and x2<=10:

#函式區間

function_value1 = function(x1)

function_value2 = function(x2)

differ_e= function_value2 -function_value1#能差

x1=accept_x2(x1,x2,differ_e,now__temperature)

now__temperature = now__temperature*decay_factor

iterator_counter+=

1#不斷新增新行

return iterator_counter,results

########畫圖

defdraw_plot

(iterator_counter,results)

: x_axis =

y_axis =

for i in

range

(iterator_counter):)

plt.plot(x_axis, y_axis)

#x為被迭代到第幾次,y為被迭代到該次的優解

plt.show(

)########'main__':

init_x =10*

(2*random.random()-

1)#產生初始解

iterator_counter,results=annealing(init_x,init_temperature)

issue(

) draw_plot(iterator_counter,results)

啟發式演算法 模擬退火演算法

爬山演算法 是一種簡單的貪心搜尋演算法,該演算法每次從當前解的臨近空間中選擇乙個最優解作為當前解,直到達到乙個區域性最優解。該演算法實現簡單,其主要缺點是會陷入區域性最優解。如,按箭頭的方向搜尋,當達到a點時,無論朝哪個方向小幅度移動都不能得到更優的解。模擬退火演算法 模擬退火演算法 於固體退火原理...

現代啟發式演算法(二) 模擬退火演算法

繼續我們在遺傳演算法求解tsp問題中所說的,遺傳演算法具有很強的全域性搜尋能力,但由於 早熟 問題使得區域性搜尋能力不足,模擬退火演算法雖然全域性搜尋能力不強,但具有很強的區域性搜尋能力,混合使用遺傳演算法和模擬退火演算法可以解決很多np hard問題,即由遺傳演算法提供問題的較優解,然後由模擬退火...

啟發式演算法之蟻群演算法 模擬退火演算法

啟發式演算法 heuristic algorithm 是相對於最優化演算法提出的。乙個問題的最優演算法求得該問題每個例項的最優解。啟發式演算法可以這樣定義 乙個基於直觀或經驗構造的演算法,在可接受的花費 指計算時間和空間 下給出待解決組合優化問題每乙個例項的乙個可行解,該可行解與最優解的偏離程度一般...