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

2021-10-14 07:15:23 字數 3630 閱讀 9400

問題:

求解函式z=-x2-y2的[-10,10]之間的最大值

解法:還是隨機播種的優化方法,判定終止是迴圈50次

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 # 避免生成的隨機數超出範圍,返回隨機數範圍

import matplotlib.pylab as plt

from mpl_toolkits.mplot3d import axes3d

import numpy as np

import random_list

import find_max_min2

defslovez

(x, y)

:# 三維函式

z =- x**

2- y**

2return z

defgene_xy

(value)

:# 避免隨機布種超出範圍

start = value - radius

end = value + radius

if start <=-10

: start =-10

if end >=10:

end =

10return start, end

fig = plt.figure(

)ax = axes3d(fig)

x = np.arange(-10

,10,0.5

)y = np.arange(-10

,10,0.5

)x, y = np.meshgrid(x, y)

z = slovez(x, y)

ax.plot_su***ce(x, y, z, rstride=

1, cstride=

1, cmap=

'rainbow'

)# 畫三維圖

# ax.contourf(x, y, z, zdir='z', offset=-2, cmap='rainbow')

# ax.set_zlim(-2, 2)

list_x = random_list.random_list(-10

,10,10

)# 第一次布種

list_y = random_list.random_list(-10

,10,10

)list_xy =

answer_z =

for i, ii in

enumerate

(list_x)

:[list_x[i]

, list_y[i]])

for i in list_xy:0]

, i[1]

))max2_z =

[find_max_min2.findmax2(answer_z)[0

], find_max_min2.findmax2(answer_z)[1

]]# ax.scatter(list_x[max2_z[0]], list_y[max2_z[0]], answer_z[max2_z[0]], c='r')

radius =20*

0.66

# 初始搜尋半徑

n =0

while n <50:

# 搜尋50次

n +=

1 x1, y1 = list_x[max2_z[0]

], list_y[max2_z[0]

] x2, y2 = list_x[max2_z[1]

], list_y[max2_z[1]

] startx1, endx1 = gene_xy(x1)

starty1, endy1 = gene_xy(y1)

startx2, endx2 = gene_xy(x2)

starty2, endy2 = gene_xy(y2)

list_x = random_list.random_list(startx1, endx1,10)

+ random_list.random_list(startx2, endx2,10)

+[x1]

list_y = random_list.random_list(starty1, endy1,10)

+ random_list.random_list(starty2, endy2,10)

+[y1]

list_xy.clear(

) answer_z.clear(

)for i, ii in

enumerate

(list_x)

:[list_x[i]

, list_y[i]])

for i in list_xy:0]

, i[1]

))max2_z =

[find_max_min2.findmax2(answer_z)[0

], find_max_min2.findmax2(answer_z)[1

]]# ax.scatter(list_x[max2_z[0]], list_y[max2_z[0]], answer_z[max2_z[0]], c='b')

radius = radius *

0.55

# 搜尋半徑變化

xx = list_x[max2_z[0]

]yy = list_y[max2_z[0]

]zz = slovez(xx, yy)

ax.scatter(xx, yy, zz, c=

'r')

print

(xx, yy, zz)

plt.show(

)

結果如圖:

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

問題 求解函式y xsin 10 x 2的 1,2 之間的最大值 解法 還是隨機播種的優化方法,判定終止是最大y和次大y對應的x之差小於0.0001 import math import matplotlib.pylab as plt import random list import find m...

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....

C 產生隨機數,並用冒泡對其排序求最大值

寫這個程式的主要原因是,課程作業需要用labview寫類似的乙個功能,我就試著用c 寫一下試試,其實原理很簡單,就是用rand 函式產生隨機數存入到陣列當中去,然後對陣列中的 數用冒泡演算法進行排序就可以了。先介紹一下rand 這個函式的用法,這個函式可以用來產生隨機數,但不是真正意義上的隨機數,它...