群智能算法-模拟退火

news2024/11/24 20:54:03

一.基本理念

模拟退火算法(Simulated Annealing,简称SA) 的思想最早是由Metropolis等提出的.其出发点就是基于物理中固体物质的退火过程与一般的组合优化问题之间的相似性。模拟退火法是一种通用的优化算法,其物理退火过程由以下三部分组成。

加温过程:我们这一步是为了将粒子变为活性粒子,在一开始温度最大的时候,恰恰是其活性最大的时候,其遍历的地方也就越多,这样便于我们将局部最优解的情况给剔除。

等温过程:对于每一个粒子我们都会向一个自由能变小的方向运行。

冷却过程:当自由能极小的时候我们就相对于说,就是求局部最优解。

加温过程对算法设定初温,等温过程对应算法的Metropolis抽样过程,冷却过程对应控制参数的下降。这里能量的变化

就是目标函数,我们要得到的最优解就是能量最低态。其中Metropolis准则是SA算法收敛于全局最优解的关键所在,

Metropolis准则以一定的概率接受恶化解,这样就使算法跳离局部最优的陷阱。

 

二.算法流程

 

1. 初始化:取初始温度T0足够大,令T = T0,任取初始解S1。

2. 对当前温度T,重复第(3)~(6)步。

3. 对当前解S1随机扰动产生一个新解S2。

4. 计算S2的增量df = f(S2) - f(S1),其中f(S1)为S1的代价函数。

5. 若df < 0,则接受S2作为新的当前解,即S1 = S2;否则计算S2的接受概率exp(-df/T), 即随机产生(0,1)区间上均

匀分布的随机数rand,若exp(-df/T) > rand,也接受S2作为新的当前解S1 = S2,否则保留当前解S1。

6. 如果满足终止条件Stop,则输出当前解S1为最优解,结束程序,终止条件Stop通常取为在连续若干个Metropolis

链中新解S2都没有被接受时终止算法或者是设定结束温度;否则按衰减函数衰减T后返回第(2)步。

三.实战(由于此算法相对于其他的算法的操作每那么多较简单直接实战) 

x = -3:0.1:3;
y = 11*sin(x) + 7*cos(5*x);//这个例子是跟一个大佬学的

模拟退火算法--matlab实现简单问题_模拟退火算法matlab_面壁十年忘何图的博客-CSDN博客

我们求在-3到3这个范围中,y函数的最大值。

%% SA 模拟退火: 求解函数y = 11*sin(x) + 7*cos(5*x)在[-3,3]内的最大值(动画演示)
tic
clear; clc
 
%% 绘制函数的图形
x = -3:0.1:3;
y = 11*sin(x) + 7*cos(5*x);
figure
plot(x,y,'b-')
hold on  % 不关闭图形,继续在上面画图

然后我们初始化

%% 参数初始化
narvs = 1; % 变量个数
T0 = 100;   % 初始温度
T = T0; % 迭代中温度会发生改变,第一次迭代时温度就是T0
maxgen = 200;  % 最大迭代次数
Lk = 100;  % 每个温度下的迭代次数
alfa = 0.95;  % 温度衰减系数
x_lb = -3; % x的下界
x_ub = 3; % x的上界
 
%%  随机生成一个初始解
x0 = zeros(1,narvs);
for i = 1: narvs
    x0(i) = x_lb(i) + (x_ub(i)-x_lb(i))*rand(1);    
end
y0 = 11*sin(x0) + 7*cos(5*x0); % 计算当前解的函数值
h = scatter(x0,y0,'*r');  % scatter是绘制二维散点图的函数(这里返回h是为了得到图形的句柄,未来我们对其位置进行更新)
 
%% 定义一些保存中间过程的量,方便输出结果和画图
max_y = y0;     % 初始化找到的最佳的解对应的函数值为y0
MAXY = zeros(maxgen,1); % 记录每一次外层循环结束后找到的max_y (方便画图)

之后就是我们的退火过程了

%% 模拟退火过程
for iter = 1 : maxgen  % 外循环, 我这里采用的是指定最大迭代次数
    for i = 1 : Lk  % 内循环,在每个温度下开始迭代
        y = randn(1,narvs);  % 生成1行narvs列的N(0,1)随机数
        z = y / sqrt(sum(y.^2)); % 根据新解的产生规则计算z
        x_new = x0 + z*T; % 根据新解的产生规则计算x_new的值
        % 如果这个新解的位置超出了定义域,就对其进行调整
        for j = 1: narvs
            if x_new(j) < x_lb(j)
                r = rand(1);
                x_new(j) = r*x_lb(j)+(1-r)*x0(j);
            elseif x_new(j) > x_ub(j)
                r = rand(1);
                x_new(j) = r*x_ub(j)+(1-r)*x0(j);
            end
        end
        x1 = x_new;    % 将调整后的x_new赋值给新解x1
        y1 = Obj_fun1(x1);  % 计算新解的函数值
        if y1 > y0    % 如果新解函数值大于当前解的函数值
            x0 = x1; % 更新当前解为新解
            y0 = y1;
        else
            p = exp(-(y0 - y1)/T); % 根据Metropolis准则计算一个概率
            if rand(1) < p   % 生成一个随机数和这个概率比较,如果该随机数小于这个概率
                x0 = x1; % 更新当前解为新解
                y0 = y1;
            end
        end
        % 判断是否要更新找到的最佳的解
        if y0 > max_y  % 如果当前解更好,则对其进行更新
            max_y = y0;  % 更新最大的y
            best_x = x0;  % 更新找到的最好的x
        end
    end
    MAXY(iter) = max_y; % 保存本轮外循环结束后找到的最大的y
    T = alfa*T;   % 温度下降
    pause(0.01)  % 暂停一段时间(单位:秒)后再接着画图
    h.XData = x0;  % 更新散点图句柄的x轴的数据(此时解的位置在图上发生了变化)
    h.YData = Obj_fun1(x0); % 更新散点图句柄的y轴的数据(此时解的位置在图上发生了变化)
end

然后就是我们要绘图了

 

disp('最佳的位置是:'); disp(best_x)
disp('此时最优值是:'); disp(max_y)
 
pause(0.5)
h.XData = [];  h.YData = [];  % 将原来的散点删除
scatter(best_x,max_y,'*r');  % 在最大值处重新标上散点
title(['模拟退火找到的最大值为', num2str(max_y)])  % 加上图的标题
 
%% 画出每次迭代后找到的最大y的图形
figure
plot(1:maxgen,MAXY,'b-');
xlabel('迭代次数');
ylabel('y的值');
toc

寻找过程

810c7d461d604ec993d6215993df8801.png

 寻找结果

1e4720c6cd1e4b6db588e0ab938750d8.png

迭代代数 

6fa58722600043ecacc2b32ef991ef98.png

 折线图

5e22f475b593420b8a1bbe4248f9d58d.png

 

 实战(2)我们依照这个方法我们不妨得一个三维山峦的最大值

初始化

clear gca
%%x=10;
% y=5;
% z=funs(x,y);
[x1,x2]=meshgrid(-5:0.1:5,-5:0.1:5);
y=x1 + x2 - 10*cos(pi*x1) - 10*sin(pi*x2);
%%y=(x1-5).^2+(x2-5).^2;
figure
mesh(x1,x2,y);
hold on
%%初始化参数
xs=zeros(100,2);
ys=zeros(100,1);
num=2;%%变量个数为2;
T0=100;%%初始温度
T=T0;%%每次迭代温度
maxgen=100;%%链长度
Lnum=100;%%每个温度状态下的链长度
alfa=0.998;%%温度衰减
x_lb=-5;
x_ub=5;
s=100;
x0=zeros(1,num);
for i=1:num
    x0(i)=x_lb+10*rand(1);
end
y0=funs(x0(1),x0(2));
h=scatter3(x0(1),x0(2),y0,s,"*r");
disp(h);
%%过程量的定义
max_y=y0;%%最优y值
MAXY=zeros(maxgen,1);%%每一代的

退火过程

%%退火过程
for iter=1:maxgen
    for i=1:Lnum
        y=randn(1,num);%%移动%%温度最大移动的位置范围就越大
        z=y/sqrt(sum(y.^2));%%移动
        x_new=x0+z*T;
        for j=1:num%%约束
            if x_new(j)<x_lb
            r=rand(1);
            x_new(j)=r*x_lb+(1-r)*x0(j);
            elseif x_new(j)>x_ub
                r=rand(1);
                x_new(j)=r*x_ub+(1-r)*x0(j);
            end
        end
        x1=x_new;
    y1=funs(x1(1),x1(2));
    if y1>y0%%退火法则
        x0=x1;
        y0=y1;
    else 
        p=exp(-(y0-y1)/T);
        if rand(1)<p
            x0=x1;
            y0=y1;
        end
    end
    if y0>max_y%%保留最大值
        max_y=y0;
        best_x=x0;
    end
    end
   xs(iter,:)=x0;
   ys(iter)=y0;
   MAXY(iter)=max_y;
   T=alfa*T;
%        h.XData=x0(1);
%     h.YData=x0(2);
%     h.ZData=funs(x0(1),x0(2));
   pause(0.1);
   %%disp(x0);
   %%disp(y0);
     h.XData=x0(1);%%换着输出值
    h.YData=x0(2);
     h.ZData=funs(x0(1),x0(2));
   %%scatter3(x0(1),x0(2),y0,s,"*r")

end

绘图

figure%%绘制其的折线图
plot3(xs(:,1),xs(:,2),ys);
h.XData=best_x(1);
    h.YData=best_x(2);
     h.ZData=max_y;

figure 
title("归");
plot(1:maxgen,MAXY);

寻找过程

aa3dc6a6cd79490999b63c62efdee4b0.png

 寻找结果

ecc84ae7100447e3ae3c29b354500258.png

 迭代代数

c0a010733a404f34b612fe4ddc0a952c.png

 变化折线706471d8b66b4ccabbe9070a5549f634.png

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/613477.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AutoHand插件使用指南

一、设置 1.软件包设置 Auto Hand 包括四个内置的输入选项。AutoHand不直接管理输入,而是包含各种脚本,充当所选输入系统和Auto Hand之间的桥梁。 这里只介绍OpenXR(Action Based),首先作如下设置: 我这里用的是HTC Vive Pro: 找到并导入AutoHand插件中的OpenXR这个包:…

java错题记录(一)

一、观察下类代码&#xff0c;输出正确的是 String s1 "coder"; String s2 "coder"; String s3 "coder" s2; String s4 "coder" "coder"; String s5 s1 s2; System.out.println(s…

SELD2022:(一)数据集收集与组织详解

前言&#xff1a;声音事件检测与定位&#xff08;SELD&#xff09;作为DCASE挑战赛的子任务&#xff0c;从2019年开始已经举办了好几届。该子任务的目标也从2022年开始由原来的在仿真数据集上设计更优声学模型&#xff0c;过渡到了在真实数据集上进行模型优化。相对而言&#x…

Omnipeek 分析wifi包简单介绍

通常打开一个.pkt文件&#xff0c;我们先看到的是如下内容。 这个场景下的数据基本是不能分析的。。 因为抓空口包1分20秒基本有10w包了&#xff0c;所以通常会对所抓的空口包进行过滤然后分析。 写个例子&#xff1a; 我本次抓包的目的是看路由器mesh的wps 组网过程&#xf…

海睿思分享 | 低代码开发直面行业变革:革新,创新?

软件体系结构从单体集群服务时期&#xff0c;历经领域驱动设计、微服务架构等阶段&#xff0c;软件产品的开发过程的变革正在潜移默化地进行。 在软件逻辑架构设计、物理架构设计、构建与部署这一系列化的过程中&#xff0c;存在可缩减的设计与开发成本&#xff0c;曾经看似不可…

力扣高频SQL50题(基础版)——第六天

力扣高频SQL50题(基础版)——第六天 1 平均售价 1.1 题目内容 1.1.1 基本题目信息1 1.1.2 基本题目信息2 1.1.3 示例输入输出 1.2 示例sql语句 SELECT u.product_id,ROUND(SUM(p.price*u.units)/SUM(u.units),2) average_price FROM UnitsSold u INNER JOIN Prices p ON u.…

Linux :: 文件内容操作【6】:文件中指定中间部分(第多少行 到 第多少行)行内容输出 及 初步认识管道

前言&#xff1a;本篇是 Linux 基本操作篇章的内容&#xff01; 笔者使用的环境是基于腾讯云服务器&#xff1a;CentOS 7.6 64bit。 学习集&#xff1a; C 入门到入土&#xff01;&#xff01;&#xff01;学习合集Linux 从命令到网络再到内核&#xff01;学习合集 注&#xff…

OpenAI的人工智能语音识别模型Whisper详解及使用

1 whisper介绍 拥有ChatGPT语言模型的OpenAI公司&#xff0c;开源了 Whisper 自动语音识别系统&#xff0c;OpenAI 强调 Whisper 的语音识别能力已达到人类水准。 Whisper是一个通用的语音识别模型&#xff0c;它使用了大量的多语言和多任务的监督数据来训练&#xff0c;能够在…

Linux中使用ls命令按大小对所有文件进行排序

按大小列出目录中的文件(排序) ls -lSh

AI版女网红“半藏森林”上线,服务项目让人意想不到

目前首批网红明星“AI克隆人”已提前上线&#xff0c;主营业务就是打造各种名人版AI聊天机器人&#xff0c;用户付费便可与之聊天。其后台报名参加AI克隆人的网红明星“全网粉丝总数已超过5亿”。该公司这波上线的网红明星AI克隆人&#xff0c;包括此前因“疑似插足他人恋情”&…

腾讯工作3个月,做测试的一些感悟...

普通二本计算机专业毕业&#xff0c;从毕业后&#xff0c;第一份接触测试的工作是在一家通讯小公司&#xff0c;大部分接触的工作是以功能测试为主&#xff0c;一直都是几千块钱工资&#xff0c;还一度被派出差&#xff0c;以及兼职各种产品、运维、运营的活&#xff0c;感觉自…

TS学习操作

一.TypeScript环境安装与运行 1.全局安装 TypeScript &#xff1a; npm install -g typescript 2.校验 &#xff1a; tsc -v 二.如何运行 1.创建一个day01.ts文件夹 2.使用tsc ./day01.ts 将typescript代码转行成js代码 3.在html页面导入day01.js 4.创建配置文件 tsc --i…

力扣LeetCode算法题 第8题-字符串转换整数 (atoi)

以上为题目要求&#xff1a; /*** params Leetcode_test007* return Leetcode_test007* Author bigeZhong* disc**请你来实现一个myAtoi(string s)函数&#xff0c;使其能将字符串转换成一个 32 位有符号整数&#xff08;类似 C/C 中的 atoi 函数&#xff09;。** 函数myAtoi(…

java实现打包下载

背景&#xff1a;项目中下载功能单个文件正常下载多个文件或者包含文件夹打压缩包下载 上代码 controller RestController RequestMapping("/file") public class FileController {RequestMapping(value "/downloadFilePack", method RequestMethod.G…

SpringCloud 规则持久化

SpringCloud 规则持久化 文章目录 SpringCloud 规则持久化1 规则持久化2 规则持久化方案2.1 阿里云 Ahas[最方便/付费]2.2 在 Nacos Server 配置规则, 完成持久化 -官方推荐2.3 将规则持久化到本地文件, 定时同步 3 Nacos Server 配置中心-规则持久化实例 1 规则持久化 **规则…

MySQL压缩版本安装

MySQL压缩版本安装 首先分享mysql-8.0.23版本的压缩包&#xff0c;请有需要的朋友自取。 链接&#xff1a;https://pan.baidu.com/s/1h46ZCkGLbikhDOu5_0p2nw 提取码&#xff1a;wwd2 1、解压压缩包 1、将下载的压缩包放置到安装的位置后并解压&#xff0c;笔者将文件夹放到…

WPF BUG汇总:WPF Debug运行是 实时可视化树无效,无法查看代码

文章目录 往期回顾前言问题解决方案 往期回顾 WPF MaterialDesign 初学项目实战&#xff08;0&#xff09;:github 项目Demo运行 前言 最近打算去深圳工作&#xff0c;投了几个简历之后发现深圳的C#方向上&#xff0c;WPF招聘的比较多。这里介绍一下&#xff0c;工业计算机&…

ChatGLM-6B的windows本地部署使用

ChartGPT最近特别火&#xff0c;但是收费&#xff0c;而且国内访问不太方便&#xff0c;所以找了个类似的进行学习使用 ChatGLM-6B&#xff0c;开源支持中英文的对话大模型&#xff0c;基于 General Language Model (GLM) 架构&#xff0c;具有62亿参数&#xff0c;简单说非常…

SpringCloud高级应用-Gateway

Dubbo SpringCloud高级应用 1. SpringCloud技术栈1.1 SpringCloud技术栈1.2 SpringCloud经典技术介绍1.3 SpringCloud项目场景 2. SpringCloud Gateway2.1 Gateway工作原理2.2 Gateway路由2.2.1 业务说明2.2.2 基于配置路由设置2.2.3 基于代码路由配置2.2.4 Gateway-Predicate2…

数据库的增删改查(2)

1、数据库约束 关系型数据库的一个重要功能 主要作用是保证数据的完整性&#xff0c;也就是数据的正确性&#xff08;数据本身是正确的&#xff0c;关联关系也是正确的&#xff09; 人工检查数据的完整性的工作量非常的大&#xff0c;在数据表定义一些约束&#xff0c;那数据…