群智能算法之模拟退火算法

1.模拟退火算法简介:

2.模拟退火算法的关键点:

(1)随机的更新可行解x,判断可行解x对应的函数值和原来函数值之间的大小:如果优于原来的函数值,则让新的可行解x为问题的解;否则以一定的概率(大于某个随机的概率值时)去接受此可行解。

(2)温度T在不断的下降,对应的概率也在不断的变化。T较大时,对应的概率值也大,表明,接受差解的概率大,有利于跳出局部最优解;T较小时,对应的概率也小,表明,接受差解的概率小,此时,迭代进入后期,靠近最优解,有利于保存最优解。

3.代码:

'''
1.本文的算法是模拟退火算法
2.模拟退火算法的核心在于,对问题的差解以一定的概率去接受,此过程有利于跳出局部最优解
3.f=x*0.2*np.sin(x**2)
'''

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import math

def f(x):   #求目标函数的最小值
    # return (x**2-5*x)*np.sin(x**2)
    # return x*0.002
    return 10 * math.sin(5 * x) + 7 * math.cos(4 * x)
    # return x*math.sin(x)*math.cos(2*x)-2*x*math.sin(3*x)+3*x*math.sin(4*x)

T=100 #初始温度
T_end=0.01   #终止温度
coldrate=0.9  #温度下降速率

x=np.random.uniform(0,5)    #为x随机赋一个初值

best=[] #记录问题每一次迭代时问题的最优解
history=[]  #记录x的取值

# history.append(x)

while T > T_end :
    y=f(x)
    x_new=x+np.random.uniform(-1,1) #随机的更新x的取值
    # print(x)
    y_new=f(x_new)  #计算新解对应的函数值
    # history.append(x_new)   #记录x的取值
    # best.append(y_new)  #记录函数值

    if y_new < y:
        x=x_new #更新问题的解为新的取值
        # best.append(y_new)
        history.append(x_new)  # 记录x的取值
        best.append(y_new)  # 记录函数值

    else:
        p=np.exp(-(y_new-y)/T)
        r=np.random.uniform(0,1)    #随机生成比较的概率值
        if p > r:
            x=x_new #以一定的概率接受差解
            history.append(x_new)  # 记录x的取值
            best.append(y_new)  # 记录函数值
        # best.append(y_new)
        # else:   #拒绝差解:
            # best.append(y)
    T=T*coldrate    #温度下降,模拟退火
# x1=[i for i in np.linspace(0,5)]
# y1=map(f,x1)
plt.plot(history,best)
plt.plot(x,f(x),'om')
plt.show()
print('最优解和函数最小值分别为:',x,f(x))




4.运行结果:

5.模拟退火算法总结:

模拟退火算法是在可行解x小于最优解的情况时,以一定的概率T接受当前的可行解x,并继续运行。概率T在多态的变化,T较大时,对应的概率值也大,表明,接受差解的概率大,有利于跳出局部最优解;T较小时,对应的概率也小,表明,接受差解的概率小,此时,迭代进入后期,靠近最优解,有利于保存最优解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值