優化方法 隨機數播種(求函式最大2d)

2021-10-14 07:09:09 字數 3281 閱讀 6841

問題:

求解函式y=xsin(10πx)+2的[-1,2]之間的最大值

解法:還是隨機播種的優化方法,判定終止是最大y和次大y對應的x之差小於0.0001

import math

import matplotlib.pylab as plt

import random_list

import find_max_min2

import time

defslovey

(x):

y = x * math.sin(math.pi *

10* x)+2

# xy函式

return y # 返回y值

deffunction

(start, end)

: lst_x =

lst_y =

if start > end:

start, end = end, start

if start == end:

return

print

('wrong'

) x = start

while x < end:

y = slovey(x)

x +=

0.001

return

[lst_x, lst_y]

# 返回函式散點值用於畫圖

defgene_x

(value)

: start = value - radius

end = value + radius

if start <=-1

: start =

1if end >=2:

end =

2return start, end # 避免生成的隨機數超出範圍,返回隨機數範圍

time1 = time.time(

)x, y = function(-1

,2)[

0], function(-1

,2)[

1]plt.figure(1)

plt.plot(x, y)

# 畫出函式影象

random_lst_x = random_list.random_list(-1

,2,20

)# 第一次播種,10個

random_lst_y =

for i in random_lst_x:

)max2_x =

[random_lst_x[find_max_min2.findmax2(random_lst_y)[0

]], random_lst_x[find_max_min2.findmax2(random_lst_y)[1

]]]# 得到y值最大次大對應的x值

radius =3*

0.66

# 播種半徑

plt.plot(max2_x[0]

, slovey(max2_x[0]

),'ro'

)plt.annotate(1,

(max2_x[0]

, slovey(max2_x[0]

)), xycoords=

'data'

, xytext=

(max2_x[0]

+0.001

, slovey(max2_x[0]

)+0.001))

print

(max2_x[0]

, max2_x[1]

, max2_x[1]

- max2_x[0]

)n =

0m =

1while

abs(max2_x[1]

- max2_x[0]

)>

0.0001

: random_lst_x.clear(

) random_lst_y.clear(

) x1 = max2_x[0]

start1, end1 = gene_x(x1)

x2 = max2_x[1]

start2, end2 = gene_x(x2)

lst_x1 = random_list.random_list(start1, end1,10)

lst_x2 = random_list.random_list(start2, end2,10)

random_lst_x = lst_x1 + lst_x2 +

[x1]

for i in random_lst_x:

) max2_x =

[random_lst_x[find_max_min2.findmax2(random_lst_y)[0

]], random_lst_x[find_max_min2.findmax2(random_lst_y)[1

]]] radius *=

0.9# 搜尋半徑變化

n +=

1print

(max2_x[0]

, max2_x[1]

, max2_x[1]

- max2_x[0]

) yy = slovey(max2_x[0]

)if n <

100:

plt.plot(max2_x[0]

, yy,

'bo'

)# 圖中顯示最高點變化

if x1 != max2_x[0]

: m +=

1 plt.annotate(m,

(max2_x[0]

, yy)

, xycoords=

'data'

, xytext=

(max2_x[0]

+0.001

, yy +

0.001))

plt.plot(max2_x[0]

, slovey(max2_x[0]

),'ro'

)time2 = time.time(

)timez = time2 - time1

print

('用時'

+str

(round

(timez,5)

)+'s')

plt.show(

)

結果如圖:

優化方法 隨機數播種(求函式最大3d)

問題 求解函式z x2 y2的 10,10 之間的最大值 解法 還是隨機播種的優化方法,判定終止是迴圈50次 import math import matplotlib.pylab as plt import random list import find max min2 import time ...

db2 隨機數函式 sql中的隨機函式怎麼用

oracle dbms random.value函式 1.產生乙個介於0和1之間 不包含0和1 的38位精度的隨機數 sql select dbms random.value from dual value 881021859 2.產生乙個介於指定範圍之內的38位精度的隨機數 sql select ...

Math的常用方法獲取隨機數 最大小值 捨入方法

m,n math.floor math.random n m 1 m 1.math.random 獲取0到1之間的隨機數 0,1 2.獲取 0,n 之間的隨機整數 math.floor math.random n 1 console.log math.floor math.random 6 1 3....