数学建模--模拟退火算法

模拟退火算法

定义

模拟退火算法(Simulated Annealing,SA)是一种模拟物理退火过程而设计的优化算法。

什么用

求解TSP问题(旅行商问题)、求最值、全局优化、生产调度、控制工程、机器学习、信号处理等问题。

大规模的,复杂的组合优化问题,而整数0-1规划用小规模,整数的

算法讲解

也是贪心算法,但是在其过程中引入了随机因素,以一定的概率接受一个比当前解要差的解。

模拟退火算法在某一初温下,伴随温数的不断下降,结合概率突跳特性在解空间中随机寻找目标函数的全局最优解。即在局部最优解的空间内能概率性地跳出并最终趋于全局最优。不再局限于局部最优

步骤

image-20231206203954379

image-20231206204042219

image-20231206204028204

image-20231206204054320

image-20231206204143075

参数
  1. 控制温度参数的初值T_0
  2. 控制温度T的衰减函数(温度的更新)
  3. 马尔科夫链的的长度 (迭代次数)
  4. 控制参数T的终值(停止准则)

例题

TSP问题例题一:一位旅行者从一出发点出发,要求经过31个城市(目标点的坐标已给出),并且每个点只能经过一次,最终经过所有点后回到起点。 要求:为旅行者制定一条最短路径。

tic;  %时间
%清理工作
clear;
close;
clc;
C=[1304 2312;         % 城市坐标 最后要画图的,必须保留
    3639 1315;
    4177 2244;
    3712 1399;
    3488 1535;
    3326 1556;
    3238 1229;
    4196 1044;
    4312 790;
    4386 570;
    3007 1970;
    2562 1756;
    2788 1491;
    2381 1676;
    1332 695;
    3715 1678;
    3918 2179;
    4061 2370;
    3780 2212;
    3676 2578;
    4029 2838;
    4263 2931;
    3429 1980;
    3507 2376;
    3394 2643;
    3439 3201;
    2935 3240;
    3140 3550;
    2545 2357;
    2778 2826;
    2370 2975];

n=size(C,1);%求问题规模 城市数量
T=1000; %初始温度
L=100;  %马尔科夫链长度
K=0.99; %迭代衰减参数

city=struct([]);  %矩阵型数据不支持点索引,不能直接引用,借助结构体数据来使用,类似字典
for i=1:n
    city(i).x=C(i,1);
    city(i).y=C(i,2);
end


l=1;    %第一次迭代
len(l)=func_1(city,n);    %每次迭代路线长度
while T>0.01   %结束时温度
    for i=1:L
        len1=func_1(city,n);
        p1=floor(1+n*rand());
        p2=floor(1+n*rand());
        while p1==p2
            p1=floor(1+n*rand());
            p2=floor(1+n*rand());
        end
        tmp_c=city;
        tmp=tmp_c(p1);
        tmp_c(p1)=tmp_c(p2);
        tmp_c(p2)=tmp;
        len2=func_1(tmp_c,n);
        delta= len2-len1;
        if  delta<0
            city=tmp_c;
        else
            if exp(-delta/T)>rand()
                city=tmp_c;
            end
        end
    end
    l=l+1;
    len(l)=func(city,n);
    T=T*K;
end

figure(1);
for i=1:n-1
    plot([city(i).x,city(i+1).x],[city(i).y,city(i+1).y],'bo-');
    hold on;
end
plot([city(n).x,city(1).x],[city(n).y,city(1).y],'ro-');
title(['优化最短距离:',num2str(len(l))]);
hold off;   %画下一张图
figure(2);
plot(len);
xlabel('迭代次数');
ylabel('目标函数值');
title('路径长变化曲线');

toc;
    

规划路线

image-20231209154126926

路径长变化曲线

image-20231209154152961

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值