import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
theta=[10,10,10,10,10,10,10,10,10,10]
a=0.1
c=0.01
A=20
Alpha=0.602
garma=0.101
p=len(theta)
Fval=[]
n=300
theta_=[]
Нормализованный
def normalization(data): _range = np.max(data) - np.min(data) return (data - np.min(data)) / _range def loss(x): N=len(x) fval=0.0 for i in range(0,int(np.floor(N/2))): fval=fval+56np.power(np.power(x[2i],2)-x[2i+1],2)+np.power(x[2я]-57,2) вернуть fval для k в диапазоне (0, n): #Сгенерировать последовательность ak, размер шага итерации ak=a/np.power(k+1+A,Альфа)
Сгенерировать последовательность ck, изменить размер шага
ck=c/np.power((k+1),garma)
Одновременная генерация вектора возмущения, p-мерный случайный вектор возмущения △
delta=2*np.round(np.random.normal(0,1,p))-1
Создайте функцию потери с двумя измерениями стратегии возмущений
thetaplus=theta+ck*delta
thetaminus=theta-ck*delta
yplus=loss(thetaplus)
yminus=loss(thetaminus)
ghat=(yplus-yminus)/(2*ck*delta)
ghat=normalization(ghat)
Скорость сходимости слишком медленная, добавьте коэффициент, он уместный, слишком большой легко пересечь минимальное значение
theta=theta-14*ak*ghat
theta_.append(theta)
Вы можете добавить суждение здесь или нет, вам нужно настроить размер шага итерации
Fval.append(loss(theta))
print('y min=',np.min(Fval)) print('Когда y наименьшее, значение x=',theta) plt.figure(figsize=(15,5)) plt.subplot(1,2,1) plt.title('Правило изменения значения Y',fontproperties='SimHei',fontsize=20) plt.ylabel('y изменить', fontproperties='SimHei', размер шрифта=18) plt.xlabel('Шаги поиска',fontproperties='SimHei',fontsize=18) plt.plot(Fval,label='y') plt.subplot(1,2,2) plt.title('правило изменения значения x',fontproperties='SimHei',fontsize=20) plt.ylabel('x change', fontproperties='SimHei', размер шрифта=18) plt.xlabel('Шаги поиска',fontproperties='SimHei',fontsize=18) для i в диапазоне (0, len (theta_ [0])): х=[] для j в диапазоне (0, len (theta_)): x.append(theta_[j][i]) plt.plot(x)