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

仅作自己学习使用


一、问题

在这里插入图片描述

二、代码

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.hqwc.cn/news/218157.html

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

相关文章

MATLAB 之 M 文件和程序控制结构(顺序、选择、循环)

文章目录 一、M 文件1. M 文件的建立与打开1.1 建立新的 M 文件1.2 打开已有的 M 文件 2. M 文件的分类 二、 程序控制之顺序结构1. 数据的输入2. 数据的输出3. 程序的暂停 三、程序控制之选择结构1. if 语句2. switch 语句3. try 语句 四、程序控制之循环结构1. for 语句2. wh…

LeetCode78.子集

这道题如果用暴力法几乎是不可能解出来的&#xff0c;因为情况太复杂了&#xff0c;但是一旦用上递归回溯就会轻松很多&#xff0c;先上代码&#xff1a; class Solution {List<List<Integer>> result new ArrayList<List<Integer>>();List<Integ…

mysql多表重复数据只保留一行的思路

一、问题描述 假设有3个表&#xff0c;test_a&#xff0c;test_b&#xff0c;test_c&#xff1b; test_a和test_b中有些重复数据&#xff1b; 现在要把这2个表的数据同步到表c&#xff0c;但是重复数据只保留1行。 样例如下&#xff1a; 具体要求如下&#xff1a; 1.tes…

人工智能|机器学习——循环神经网络的简洁实现

循环神经网络的简洁实现 如何使用深度学习框架的高级API提供的函数更有效地实现相同的语言模型。 我们仍然从读取时光机器数据集开始。 import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2lbatch_size, num_steps 32, 35 t…

2023年最新IntelliJ IDEA下载安装以及Java环境搭建教程(含Java入门教程)

文章目录 写在前面Java简介IntelliJ IDEA简介IntelliJ IDEA下载安装JDK简介JDK下载教程 Java入门IntelliJ IDEA使用教程 写在后面 写在前面 2023年最新IntelliJ IDEA下载安装教程&#xff0c;内含JAVA环境搭建教程&#xff0c;一起来看看吧&#xff01; Java简介 Java是一门…

福州大学《嵌入式系统综合设计》实验七:图像灰度直方图

一、实验目的 直方图是一种统计特征&#xff0c;在图像中广为使用&#xff0c;因为具有计算简便、不受平移、旋转的影响&#xff0c;因此可以作为图像的一种有效的局部/全局特征来表示图像&#xff0c;是图像的重要特征之一。直方图在SIFT算法、HOG算法、直方图均衡等图像特征…

2023大模型安全解决方案白皮书

今天分享的是大模型系列深度研究报告&#xff1a;《2023大模型安全解决方案白皮书》。 &#xff08;报告出品方&#xff1a;百度安全&#xff09; 报告共计&#xff1a;60页 前言 在当今迅速发展的数字化时代&#xff0c;人工智能技术正引领着科技创新的浪潮而其中的大模型…

一种太阳能风能市电互补路灯方案介绍

太阳能市电互补路灯是一种环保、节能的照明设施&#xff0c;它利用太阳能进行发电并实现照明。这种路灯在白天吸收阳光并将其转化为电能&#xff0c;到了晚上则利用储存的电能为LED灯提供电力&#xff0c;实现照明功能。下面叁仟智慧将详细介绍太阳能市电互补路灯灯的工作原理和…

深信服实验学习笔记——nmap常用命令

文章目录 1. 主机存活探测2. 常见端口扫描、服务版本探测、服务器版本识别3. 全端口&#xff08;TCP/UDP&#xff09;扫描4. 最详细的端口扫描5. 三种TCP扫描方式 1. 主机存活探测 nmap -sP <靶机IP>-sP代表 2. 常见端口扫描、服务版本探测、服务器版本识别 推荐加上-v参…

基于springboot实现高校食堂移动预约点餐系统【项目源码】计算机毕业设计

基于springboot实现高校食堂移动预约点餐系统演示 Java语言简介 Java是由SUN公司推出&#xff0c;该公司于2010年被oracle公司收购。Java本是印度尼西亚的一个叫做爪洼岛的英文名称&#xff0c;也因此得来java是一杯正冒着热气咖啡的标识。Java语言在移动互联网的大背景下具备…

isis基础大全学习案例

R1配置&#xff1a; isis 1 is-level level-2 //本区域只启用level-2级别 cost-style wide //默认为narrow窄度量&#xff0c;开销只能最大63&#xff0c;并且不能打tag&#xff0c;wide宽度量的tlv和narrow不匹配&#xff0c;不能相互计算路由&#xff0c;两边都要改。 netwo…

Go语言的学习笔记2——Go语言源文件的结构布局

用一个只有main函数的go文件来简单说一下Go语言的源文件结构布局&#xff0c;主要分为包名、引入的包和具体函数。下边是main.go示例代码&#xff1a; package mainimport "fmt"func main() { fmt.Println("hello, world") }package main就是表明这个文件…