先随机产生初始点,并获得函数值。接着循环随机产生定义域内的数,比较与现在所处的点的函数值大小,(以求最大值为例)若大于现在所处的点,那么就接受这个点。若小于这个点的值,不一定拒绝,是以一定概率接收的。具体的概率与现在所处点以及随机产生的点的距离以及温度有关,下面代码的初始温度是100°,然后每次下降0.05。
下面代码是模拟算法求函数最大值的过程。
#本功能实现最小值的求解#from matplotlib import pyplot as plt
import numpy as np
import random
import math
plt.ion()#这里需要把matplotlib改为交互状态#初始值设定
hi=3
lo=-3
alf=0.95
T=100#目标函数
def f(x):return 11*np.sin(x)+7*np.cos(5*x)##注意这里要是np.sin#可视化函数(开始清楚一次然后重复的画)
def visual(x):plt.cla()plt.axis([lo-1,hi+1,-20,20])m=np.arange(lo,hi,0.0001)plt.plot(m,f(m))plt.plot(x,f(x),marker='o',color='black',markersize='4')plt.title('temperature={}'.format(T))plt.pause(0.1)#如果不停啥都看不见#随机产生初始值
def init():return random.uniform(lo,hi)#新解的随机产生
def new(x):x1=x+T*random.uniform(-1,1)if (x1<=hi)&(x1>=lo):return x1elif x1<lo:rand=random.uniform(-1,1)return rand*lo+(1-rand)*xelse:rand=random.uniform(-1,1)return rand*hi+(1-rand)*x#p函数
def p(x,x1):return math.exp(-abs(f(x)-f(x1))/T)def main():global xglobal Tx=init()while T>0.0001:visual(x)for i in range(500):x1=new(x)if f(x1)>=f(x):x=x1else:if random.random()<=p(x,x1):x=x1else:continueT=T*alfprint('最大值为:{}'.format(f(x)))main()