模拟退火算法详细说明

来源:固体退火。一种处理工艺:将金属缓慢加热到一定程度,保持足够的时间,然后以适宜的速度冷却。退火后的金属具有了新的属性降低硬度等。

一、爬山算法

1.爬山算法是一种局部择优的方法,是一种局部贪心的最优算法。采用启发式方法,是对深度优先搜索的一种改进,它利用反馈信息帮助生成解的决策。 

2.主要思想
(1)随机选择一个登山的起点;
(2)每次拿相邻点与当前点进行比对,取两者中较优者,作为爬坡的下一步;
(3)重复第2步,直至该点的邻近点中不再有比其大的点;选择该点作为本次爬山的顶点,即为该算法获得的最优解。

实现简单,但存在缺陷,它可以搜索到局部最优解,不一定是全局最优解,如图:

 当前解是C点,那么做一个局部搜索(寻找最大值),从G点搜索,可能会找到D点,但当我们去观看上图发现它最终寻找的点并不是全局最优解。这就是它的缺陷但是呢模拟退火就改善了这个缺陷。

二、模拟退火

模拟退火机制在一定程度上避免陷入局部最优解,与爬山算法不同那么它是如何改变的呢?在局部搜索即使找到一个比当前解较差的解,也会以一定的概率跳到这个解上。

那就是Metropolis准则,公式如下:

代表t+1时刻的内能:Et+1,(可以理解为函数值 ,在进行优化搜索的时候我们一般找最小值为标准)那么这个准则,当下一个时刻的函数值比这个时刻的小,它跳出当前值的概率为1,亮点在当下一个时候内能比此时刻大的时候它并没有立即拒绝而是以一定的概率进行选择,我们也会发现相差越多,概率越小。此外接受新解的概率还受到降温系数和初始温度T的影响。温度的作用就是来计算转移概率P的。当温度每次下降后,转移概率也发生变化,因此在所有温度下迭代L次的结果也都是不相同的。在每个温度下迭代L次来寻找当前温度下的最优解,然后降低温度继续寻找,直到到达终止温度,即转移概率P接近于0.

接受状态的三条原则:

(1)在固定温度下,接受使目标函数下降的候选解的概率要大于使目标函数上升的候选解概率;

(2)随着温度的下降,接受使目标函数上升的解的概率要逐渐减小;

(3)当温度趋于零时,只能接受目标函数下降的解。

三、模拟退火的流程 

大概的来讲分为升温过程、降温过程:内循环(分子在每个温度内达到的平衡)、外循环(温度降到最终温度)。

步骤为:

1.开始给定相对较高的初始温度T,产生初始解X0(可以采用随机产生),计算对应的目标函数值E(X0)。

2.令T=kT,其中k的范围是(0—1)的值,为温度下降系数。

3.对当前解Xt做随机扰动,在其领域内产生一个新解X(t+1),计算对应函数值,根据蒙特卡洛准则进行判断是否接受新解。

4.在温度T下,迭代L次扰动和接受过程。

5.判断是否达到终止温度。若达到,则终止,否则步骤二。如图(画的有些丑,但意思没错):

6.实例

f(x)=4*x1^2-2*x1^4+x1^6/3+x1*x2-4*x2^2+4*x2^2,|xi|<5.最优解。

 1.导包设置参数

import math
from random import random
import matplotlib.pyplot as plt

def func(x, y):                  #函数优化问题
    res= 4*x**2-2*x**4+x**6/3+x*y-4*y**2+4*y**4
    return res
T0=100#初始温度
Tf=1#终止温度
alpha=0.98#降温系数
l=100#内循环迭代次数
T=T0#当前温度
#自变量取值
x = [random() * 11 -5  for i in range(l)] #随机生成100个x的值范围[-5,5]
y = [random() * 11 -5  for i in range(l)] #随机生成100个y的值范围[-5,5],y表示x2

2.设置扰动

 def generate_new(func, x, y):   #扰动产生新解的过程
        while True:
            x_new = x + T * (random() - random())
            y_new = y + T * (random() - random())
            if (-5 <= x_new <= 5) & (-5 <= y_new <= 5):  
                break                                  #重复得到新解,直到产生的新解满足约束条件
        return x_new, y_new 

3.Metropolis准则

def Metrospolis(func, f, f_new):   #Metropolis准则
        if f_new <= f:
            return 1
        else:
            p = math.exp((f - f_new) / self.T)
            if random() < p:
                return 1
            else:
                return 0

4.外循环和内循环

 count = 0
        #外循环迭代,当前温度小于终止温度的阈值
        while T > Tf:       
            #内循环迭代100次
            for i in range(l): 
                f = func(x[i],y[i])    #f为迭代一次后的值
                x_new, y_new = generate_new(x[i],y[i]) #产生新解
                f_new = func(x_new, y_new)                        
                if Metrospolis(f, f_new):                         
                    x[i] = x_new           
                    y[i] = y_new 
#温度按照一定的比例下降(冷却)
            T = T * alpha        
            count += 1

5.结果:

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Matlab的模拟退火算法是通过使用simulannealbnd函数来实现的。该函数是Matlab全局优化工具箱中的一个函数,用于求解多维非线性约束优化问题。模拟退火算法是一种随机搜索算法,通过模拟退火的过程来逐步接受较差的解,以期望找到全局最优解。 在使用simulannealbnd函数时,你需要定义一个目标函数,即要进行优化的函数。对于一元函数 y = sin(10*pi*x) / x,在定义目标函数时,你需要将x作为输入参数,并返回计算得到的y值。 simulannealbnd函数还需要提供一个初始解向量x0,并设定搜索的范围(例如x在[1,2]之间),以及其他参数如搜索温度等。函数会根据设定的参数和目标函数进行迭代搜索,最终返回找到的最优解。 更多关于simulannealbnd函数的详细用法和参数设置,你可以参考Matlab官方文档中关于simulannealbnd函数的说明。这里提供了更多关于simulannealbnd函数的详细信息和示例代码,可以帮助你更好地理解和使用该函数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [matlab模拟退火算法(SA)详解(一)算法入门](https://blog.csdn.net/viafcccy/article/details/94881458)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [2022建模国赛代码(三天坚持不易) 包括K-meas算法、bp预测、回归预测,(python和matlab做的).zip](https://download.csdn.net/download/qq_35831906/88245767)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值