模拟退火算法

先随机产生初始点,并获得函数值。接着循环随机产生定义域内的数,比较与现在所处的点的函数值大小,(以求最大值为例)若大于现在所处的点,那么就接受这个点。若小于这个点的值,不一定拒绝,是以一定概率接收的。具体的概率与现在所处点以及随机产生的点的距离以及温度有关,下面代码的初始温度是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 x1
    elif x10.0001:
        visual(x)
        for i in range(500):
            x1=new(x)
            if f(x1)>=f(x):
                x=x1
            else:
                if random.random()<=p(x,x1):
                    x=x1
                else:
                    continue
        T=T*alf
    print('最大值为:{}'.format(f(x)))

main()

你可能感兴趣的:(模拟退火算法,算法,机器学习)