【智能优化算法】7.1

在这里插入图片描述

Ⅰ.原理

  • 讨论这个问题需要理解一下物理原型是怎么样的,也就是原来是怎么“退火“的:
  • 模拟退火算法的思想借鉴于固体的退火原理,当固体的温度很高的时候,内能比较大,固体的内部粒子处于快速无序运动,当温度慢慢降低的过程中,固体的内能减小,粒子的慢慢趣于有序,最终,当固体处于常温时,内能达到最小,此时,粒子最为稳定。

注意:

  1. 温度高->运动速度快(温度低->运动速度慢)
  2. 温度是缓慢(想象成特别慢的那种)降低的
  3. 温度基本不再变化后,趋于有序(最后内能达到最小,也就是接近最优)
    我们通过模拟这个操作,使得我们需要的答案“趋于有序”,也就是最靠近需要的值(最值)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

参考文章
参考视频

Ⅱ.冷却表参数

L = 200;                        %马可夫链长度
K = 0.998;                      %衰减参数
S = 0.01;                       %步长因子
T=100;                          %初始温度
YZ = 1e-8;                      %容差
P = 0;                          %Metropolis过程中总接受点

(1).马尔科夫链

在这里插入图片描述
在这里插入图片描述
参考视频

L = 200;

  • 含义:这行代码定义了模拟退火算法里的马可夫链长度。在模拟退火算法的每次温度状态下,会进行 L 次迭代尝试寻找更优解。马可夫链长度决定了在每个温度下进行状态转移的次数。
  • 作用:较大的 L 能让算法在当前温度下更充分地探索邻域,从而增加找到更优解的可能性,但会增加计算时间;较小的 L 会使算法在每个温度下探索不够充分,可能错过更好的解。

(3). 衰减参数K = 0.998;

  • 含义:此代码定义了温度的衰减参数。在模拟退火算法中,温度会随着迭代次数不断降低,而 K 用于控制温度下降的速度。
  • 作用:温度下降公式通常为 T = K * TT 为当前温度)。K 越接近 1,温度下降越慢,算法会有更多时间在局部区域精细搜索,更可能找到全局最优解,但收敛速度慢;K 越小,温度下降越快,算法收敛速度快,但可能过早陷入局部最优解。

(4). 步长因子S = 0.01;

  • 含义:这行代码定义了步长因子。在模拟退火算法生成新解时,会在当前解的基础上进行一定扰动,S 用于控制扰动的幅度。
  • 作用:新解的生成一般是 NextX = PreX + S * (rand(1, D) * 2 - 1) * TPreX 是当前解,NextX 是新解,D 是变量维数)。较大的 S 会使新解在搜索空间中跳跃幅度大,有助于全局搜索,但可能跳过最优解;较小的 S 会使新解在当前解附近小范围变动,利于局部搜索。

(5).初试温度 T = 100;

  • 含义:这行代码设定了模拟退火算法的初始温度。初始温度是算法开始时的温度值,影响着算法的搜索范围和接受较差解的概率。
  • 作用:初始温度较高时,算法接受较差解的概率大,能在搜索空间中广泛探索,利于全局搜索;初始温度较低时,算法接受较差解的概率小,更倾向于在局部区域搜索。

(6).容差 YZ = 1e-8;

  • 含义:这行代码定义了容差。容差用于判断算法是否满足终止条件。当目标函数值的变化小于容差时,可认为算法已经收敛到一个较优解,从而终止迭代。
  • 作用:合理设置容差能避免算法进行不必要的迭代,提高计算效率。如果容差设置过大,算法可能提前终止,错过更优解;容差设置过小,算法可能会进行过多迭代,浪费计算资源。

(7). P = 0;

  • 含义:这行代码将 P 初始化为 0,P 用于记录 Metropolis 过程中总接受点的数量。在模拟退火算法的 Metropolis 准则中,新解可能会被接受或拒绝,P 统计接受新解的次数。
  • 作用:通过统计接受点的数量,可以了解算法在迭代过程中的接受情况,辅助分析算法的收敛性和搜索效率。

综上所述,这些参数共同影响着模拟退火算法的搜索性能和收敛速度,合理设置这些参数对于算法能否找到全局最优解至关重要。

Ⅲ.马尔科夫链过程

在这里插入图片描述

代码

%%%%%%%%%%%%%%%%%%%%%%模拟退火算法解决函数极值%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all;                      %清除所有变量
close all;                      %清图
clc;                            %清屏
D=10;                           %变量维数 
Xs=20;                          %上限                                
Xx=-20;                         %下限
%%%%%%%%%%%%%%%%%%%%%%%%%%%冷却表参数%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
L = 200;                        %马可夫链长度
K = 0.998;                      %衰减参数
S = 0.01;                       %步长因子
T=100;                          %初始温度
YZ = 1e-8;                      %容差
P = 0;                          %Metropolis过程中总接受点
%%%%%%%%%%%%%%%%%%%%%%%%%%随机选点初值设定%%%%%%%%%%%%%%%%%%%%%%%%%
PreX = rand(D,1)*(Xs-Xx)+Xx;
PreBestX = PreX;                %PreBestX 表示到目前为止所找到的最优解
PreX =  rand(D,1)*(Xs-Xx)+Xx;
BestX = PreX;                   %BestX 表示全局最优解
%%%%%%%%%%%每迭代一次退火一次(降温), 直到满足迭代条件为止%%%%%%%%%%%%
deta=abs( func1( BestX)-func1(PreBestX));  %abs 函数会返回该实数的绝对值
while (deta > YZ) && (T>0.001)  %当全局最优解和当前温度下最优解的差异大于容差,并且当前温度大于 0.001 时,继续进行迭代。当这两个条件中的任何一个不满足时,循环停止,算法结束。
    T=K*T; 
    %%%%%%%%%%%%%%%%%%%%%在当前温度T下迭代次数%%%%%%%%%%%%%%%%%%%%%%
    for i=1:L  
        %%%%%%%%%%%%%%%%%在此点附近随机选下一点%%%%%%%%%%%%%%%%%%%%%
            NextX = PreX + S* (rand(D,1) *(Xs-Xx)+Xx);
            %%%%%%%%%%%%%%%%%边界条件处理%%%%%%%%%%%%%%%%%%%%%%%%%%
            for ii=1:D
                if NextX(ii)>Xs | NextX(ii)<Xx
                    NextX(ii)=PreX(ii) + S* (rand *(Xs-Xx)+Xx);
                end
            end            
        %%%%%%%%%%%%%%%%%%%%%%%是否全局最优解%%%%%%%%%%%%%%%%%%%%%%
        if (func1(BestX) > func1(NextX))
            %%%%%%%%%%%%%%%%%%保留上一个最优解%%%%%%%%%%%%%%%%%%%%%
            PreBestX = BestX;
            %%%%%%%%%%%%%%%%%%%此为新的最优解%%%%%%%%%%%%%%%%%%%%%%
            BestX=NextX;
        end
        %%%%%%%%%%%%%%%%%%%%%%%% Metropolis过程%%%%%%%%%%%%%%%%%%%
        if( func1(PreX) - func1(NextX) > 0 ) %意味着新解的目标函数值小于当前解的目标函数值,即新解更优。
            %%%%%%%%%%%%%%%%%%%%%%%接受新解%%%%%%%%%%%%%%%%%%%%%%%%
            PreX=NextX;
            P=P+1;
        else
            changer = -1*(func1(NextX)-func1(PreX))/ T ;
            p1=exp(changer);
            %%%%%%%%%%%%%%%%%%%%%%%%接受较差的解%%%%%%%%%%%%%%%%%%%%
            if p1 > rand        
                PreX=NextX;
                P=P+1;         
            end
        end
    trace(P+1)=func1( BestX);    
    end
    deta=abs( func1( BestX)-func1 (PreBestX)); 
end
disp('最小值在点:');
BestX
disp( '最小值为:');
func1(BestX)
figure
plot(trace(2:end))
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海湾的春夏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值