模拟退火算法应用——求解二元函数的最小值(极小值)

仅作自己学习使用


一、问题

在这里插入图片描述

二、代码

clear
clcT1 = cputime;
xmax = 5;
xmin = -5;
ymax = 5;
ymin = -5;
L = 20;     % 马尔科夫链长度
dt = 0.998; % 降温系数
S = 0.02;   % 步长因子
T = 200;    % 初始温度
TZ = 1e-8;  % 容差
Tmin = 0.01;% 最低温度
P = 0;      % Metropolis接受准则中接受的点的个数
PreX = rand*(xmax - xmin) + xmin;   % (设置初始x的位置)上一个搜索的x值
PreY = rand*(ymax - ymin) + ymin;   % (设置初始y的位置)上一个搜索的y值
PreBestX = PreX;    % 上一个最优秀的x值
PreBestY = PreY;    % 上一个最优秀的y值
PreX = rand*(xmax - xmin) + xmin;   % 上一个搜索的x值
PreY = rand*(ymax - ymin) + ymin;   % 上一个搜索的y值
BestX = PreX;       % 最优秀的X值
BestY = PreY;       % 最优秀的y值
trace = [];         % 用于记录历代最优解的函数值
deta = abs(eval(BestX,BestY) - eval(PreBestX,PreBestY));    % 上一次最小值和这次最小值的差的绝对值
while (deta>TZ) && (T>0.01)% 在当前温度下迭代L次数for i = 1: L% 在当前点附件随机的选取下一点P = 0;while P==0NextX = PreX + S*(rand*(xmax-xmin) + xmin);NextY = PreY + S*(rand*(ymax-ymin) + ymin);if (NextX >= xmin && NextX <= xmax && NextY >= ymin && NextY <= ymax)P = 1;endend% 判断选取的这个(x,y)对应的函数值是否比上一个选出来的最优值更优秀if(eval(NextX,NextY)<eval(BestX,BestY))% 保留上一个最优解PreBestX = BestX;PreBestY = BestY;% 更新最优解BestX = NextX;BestY = NextY;end% Metropolis接受准测 接受过程if(eval(NextX,NextY) < eval(PreX,PreY))% 当前解更优秀,接受新解PreX = NextX;PreY = NextY;P = P +1;else% 当前解更差,概率接受更差的解P1 = exp((eval(PreX,PreY)-eval(NextX,NextY))/T); % 接受的概率if P1 > randPreX = NextX;PreY = NextY;P = P + 1;endendtrace = [trace eval(BestX,BestY)];enddeta = abs(eval(BestX,BestY) - eval(PreBestX,PreBestY));% 本次退火过程结束,温度下降T = T * dt;
end
T2 = cputime;
timeConsume = T2 - T1;
%% 绘图适配值最优化曲线
figure(1)
disp("最小值点在:")
BestX
BestY
disp("最小值为:")
eval(BestX,BestY)
plot(trace,LineWidth=1,Color=[0.68 0.52 0.96])
xlabel("迭代次数")
ylabel("目标函数值")
title("适配值最优化曲线","时间消耗:" + timeConsume )
%% 做出函数图像
figure(2)
x = -5:0.01:5;
y = -5:0.01:5;
N = length(x);
for i = 1 : Nfor j = 1 : Nz(i,j) = 5*cos(x(i)*y(j)) + x(i)*y(j) + y(j)^3;end
end
colormap('jet')
mesh(x,y,z)
grid on
xlabel('x')
ylabel('y')
zlabel('f(x,y)')
hold on 
plot3(BestX,BestY,eval(BestX,BestY),'r*')
text(BestX,BestY,eval(BestX,BestY), '最小值点', 'FontSize', 15, 'HorizontalAlignment', 'left');%% 评估函数(目标函数)
function result = eval(x,y)result = 5 * cos(x*y) + x*y + y^3;
end

三、效果

3.1 适配值最优化曲线

适配值最优化曲线

3.2 多次求解结果在函数图像中的表现

在这里插入图片描述
图中五角星就是求解出来的极值点,发现仍然会有部分会落在局部极值点的情况,陷入了局部最优。

四、问题

       跑过的朋友可以发现,如果按照上述代码,画出来的极值点应该是这样的:
在这里插入图片描述
那么我做了什么调整呢:我把绘图点的x,y坐标交换了一下:

plot3(BestX,BestY,eval(BestX,BestY),'rp',MarkerSize=10,LineWidth=2)

为什么会交换呢?因为我发现x,y的值求反了,BestX里边存的是Y的坐标,BestY里边存放的是X坐标;

还有一个问题是,关于x,y的随机跳动:

NextX = PreX + S*(rand*(xmax-xmin) + xmin);
NextY = PreY + S*(rand*(ymax-ymin) + ymin);

它是与温度无关的,在我求解一维函数的极值问题中我也提到了。

请知道bug的朋友在评论区留言,我将及时改正!

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

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

相关文章

接收网络包的过程——从硬件网卡解析到IP层

当一些网络包到来触发了中断&#xff0c;内核处理完这些网络包之后&#xff0c;我们可以先进入主动轮询 poll 网卡的方式&#xff0c;主动去接收到来的网络包。如果一直有&#xff0c;就一直处理&#xff0c;等处理告一段落&#xff0c;就返回干其他的事情。当再有下一批网络包…

基于51单片机的交通信号灯系统【程序+proteus仿真+参考论文+AD原理图等16个文件夹资料】

一、项目功能简介 整个设计系统由STC89C52单片机数码管显示模块LED指向灯模块三线八线译码器模块按键模块组成。 具体功能&#xff1a; 1、东西向、南北向依次进行周期通行&#xff0c;默认设置为&#xff1a;东西向直行&#xff08;绿灯&#xff09;时间30秒&#xff0c;左转…

Mindomo Desktop for Mac免费思维导图软件,助您高效整理思维

思维导图是一种强大的工具&#xff0c;可以帮助我们整理思维、提高记忆力、激发创造力。而Mindomo Desktop for Mac作为一款免费的思维导图软件&#xff0c;能够帮助我们更高效地进行思维整理和项目管理。在本文中&#xff0c;我们将介绍Mindomo Desktop for Mac的功能和优势&a…

曲线拟合:走进数据建模中的艺术与科学

在现代科学和工程领域&#xff0c;曲线拟合是一项重要的数据分析技术&#xff0c;它可以通过数学模型来近似描述实际数据中的复杂关系。本文将详细介绍曲线拟合的基本概念、方法和应用领域&#xff0c;并探究其在数据建模中的艺术与科学。 第一节&#xff1a;曲线拟合的基本概…

LabVIEW当鼠标悬停在图形曲线上时显示坐标

LabVIEW当鼠标悬停在图形曲线上时显示坐标 在波形图上显示波形数据后&#xff0c;当鼠标放在波形图的曲线上时&#xff0c;如何自动显示对应点的坐标&#xff1f; 1. 创建事件结构&#xff0c;选择“波形图”作为“事件源”&#xff0c;选择“鼠标移动”作为“事件”&a…

【Vue】vue指令

目录 V-html v-show和v-if v-show 显示 隐藏 v-if 显示 隐藏 总结 显示隐藏的应用场景 未登录的情况 登录的情况 v- else 和 v-else-if v-if 和v-else v-if 和 v-else-if 总结&#xff1a; v-on 语法一&#xff1a; 语法二&#xff1a; 调用传参 v-bind…

3D建模对制造企业的价值

除非你在过去几年一直躲在岩石下,否则你可能听说过“3D 建模”和“3D 渲染”这些术语。 但为什么这项技术如此重要,尤其是对于产品制造公司而言? 简而言之,它减少了项目时间和成本。 这为制造商提供了更多的设计试验空间。 未能利用 3D 建模技术的公司很快就会落后于竞争对…

12 月 3 日北京,工业互联网数据管理的前沿技术+行业应用洞察尽在于此!

下一个周末&#xff0c;12 月 3 日&#xff0c;2023 IoTDB 用户大会将在北京丽都皇冠假日酒店举办&#xff01; 为让大家收获专业、多样的行业前瞻&#xff0c;我们邀请到了超 20 位产、学、用、研大咖嘉宾&#xff0c;将从技术与应用两个方向&#xff0c;带来你最想了解的工业…

论文阅读_生成式Agent

英文名称: Generative Agents: Interactive Simulacra of Human Behavior 中文名称: 生成代理&#xff1a;**人类行为的交互式模拟** 文章: http://arxiv.org/abs/2304.03442 代码: https://github.com/joonspk-research/generative_agents 作者: Joon Sung Park 机构: 斯坦福大…

【教学类-06-08】20231125(55格版)X-Y之间“减法-题”(以10-20之间为例)(必须X>Y,题目少)

图片展示 需求&#xff1a; 20以内减法&#xff0c;不需要再练习其中10以内部分&#xff0c;改为10-20以内的减法&#xff0c;X-Y大于10&#xff0c;小于20的所有减法题。 代码展示&#xff1a; “-”减法 X-Y 之间的所有减法-题&#xff08;如10-20之间的所有减法&#xff0…

TDA笔记:夏克林老师,南洋理工大学

TDA比传统的统计方法有优势&#xff1a;benchmark中展现了这种优势 laplacian矩阵 多种单纯复形构造方式&#xff0c;可以构造出不同表征 二部图&#xff1a;Dowker complex Tor algebra可以用到多大数据 目前较新

Python基础教程之循环结构详解,循环结构逻辑解析。

文章目录 前言一、While循环二、While…else…循环三、for循环四、for…else…循环五、循环体结束语句六、嵌套循环关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③…

NX二次开发UF_CURVE_ask_curve_turn_angle 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_curve_turn_angle Defined in: uf_curve.h int UF_CURVE_ask_curve_turn_angle(tag_t curve, double orientation [ 3 ] , double * angle ) overview 概述 Returns …

[架构之路-250]:目标系统 - 设计方法 - 软件工程 - 需求工程 - 需求开发:如何用图形表达需求,面向对象需求分析OOA与UML视图

目录 一、面向对象需求分析 1.1 面向对象的基本概念 1.2 什么是面向对象的需求分析 2.3 什么是UML图 2.4 UML视图 2.4 UML图与UML视图的关系 2.5 UML图与面向对象需求分析的关系 二、需求分析相关的UML图形与视图&#xff1a;14视图 2.1 用例模型与用例图&#xff1a;…

面试题:工作中做过 JVM 调优吗?怎么做的?

文章目录 前言cpu占用过高死锁内存泄漏上面只是其中一种处理方法 总结 前言 最近很多小伙伴跟我说&#xff0c;自己学了不少JVM的调优知识&#xff0c;但是在实际工作中却不知道何时对JVM进行调优。今天&#xff0c;我就为大家介绍几种JVM调优的场景。 在阅读本文时&#xff…

死磕Nacos系列:Nacos在我的SpringCloud项目中做了什么?

Nacos服务注册 我们一个SpringCloud项目中集成了Nacos&#xff0c;当项目启动成功后&#xff0c;就可以在Nacos管理界面上看到我们项目的注册信息&#xff0c;还可以看到项目的健康状态等等信息&#xff1a; 那Nacos是什么时候进行了哪些操作的呢&#xff1f;今天我们来一探究…

redis运维(二十一)redis 的扩展应用 lua(三)

一 redis 的扩展应用 lua redis加载lua脚本文件 ① 调试lua脚本 redis-cli 通过管道 --pipe 快速导入数据到redis中 ② 预加载方式 1、错误方式 2、正确方式 "案例讲解" ③ 一次性加载 执行命令&#xff1a; redis-cli -a 密码 --eval Lua脚本路径 key …

希尔伯特变换-matlab仿真

希尔伯特变换&#xff08;hilbert transform&#xff09;简介 在信号处理中我们常见的有傅里叶变换&#xff0c;用来分析频域信息&#xff0c;还有拉普拉斯变换和z变换&#xff0c;用于系统分析系统响应。短时傅里叶分析和小波分析用于时频分析。希尔伯特变换似乎听到的比较少…

jQuery_04 jQuery选择器应用

jQuery中的选择器 1.基本选择器 1.1 id $("#id值") id名称 1.2 class $(".class值") class名称 1.3 标签选择器 $("标签名字") 标签名称 1.4 所有选择器 $("*") 所有标签 1.5 组合选择器 …

Selenium技巧大揭秘:动态数据、分页和Cookie的获取利器

背景&#xff1a; ​ 昨天我们讲了讲关于seleium的一些基础操作&#xff0c;今天讲讲如何将seleium和爬虫结合起来&#xff0c;可以使用selenium获取网页的动态加载数据&#xff0c;可以使用selenium获得cookie&#xff0c;这两个是比较常用的。我将一一展开。 实战案例&…