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

仅作自己学习使用


一、问题

在这里插入图片描述

二、代码

clear
clc

T1 = 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==0
            NextX = PreX + S*(rand*(xmax-xmin) + xmin);
            NextY = PreY + S*(rand*(ymax-ymin) + ymin);
            if (NextX >= xmin && NextX <= xmax && NextY >= ymin && NextY <= ymax)
                P = 1;
            end
        end

        % 判断选取的这个(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 > rand
                PreX = NextX;
                PreY = NextY;
                P = P + 1;
            end
        end
        trace = [trace eval(BestX,BestY)];
    end
    deta = 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 : N
    for j = 1 : N
        z(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.mfbz.cn/a/187827.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

持续集成交付CICD:GitLabCI 通过trigger触发流水线

目录 一、理论 1.GitLabCI 二、实验 1.搭建共享库项目 2.GitLabCI 通过trigger触发流水线 三、问题 1.项目app02未触发项目app01 2.GitLab 报502网关错误 一、理论 1.GitLabCI (1) 概念 GitLab CI&#xff08;Continuous Integration&#xff09;是一种持续集成工具…

为什么要隐藏id地址?使用IP代理技术可以实现吗?

随着网络技术的不断发展&#xff0c;越来越多的人开始意识到保护个人隐私的重要性。其中&#xff0c;隐藏自己的IP地址已经成为了一种常见的保护措施。那么&#xff0c;为什么要隐藏IP地址&#xff1f;使用IP代理技术可以实现吗&#xff1f;下面就一起来探讨这些问题。 首先&am…

蓝桥杯每日一题2023.11.24

题目描述 #include <stdio.h> #define N 100int connected(int* m, int p, int q) {return m[p]m[q]? 1 : 0; }void link(int* m, int p, int q) {int i;if(connected(m,p,q)) return;int pID m[p];int qID m[q];for(i0; i<N; i) ________________________________…

没搞懂二维差分是什么怎么办???

摸鱼的时候画的&#xff0c;根据公式反推 一维差分倒是懂了 a[10]{1,2,6,9,11,12,17,21,32,67}; c[10]{1,1,4,3,2,1,5,4,11,35}; 现要把[3,7]的值都增加3 c[10]{1,1,7,3,2,1,5,1,11,35}; 要查询的时候再用for循环相加 结论&#xff1a;成立且适用于多次修改 不知道为什么这个…

跨域攻击分析和防御(上)

点击星标&#xff0c;即时接收最新推文 跨域攻击 在大型公司或大型跨国企业中都拥有自己的内网&#xff0c;跨国公司都有各个子公司一般以建立域林进行共享资源。根据不同职能区分的部门&#xff0c;从逻辑上以主域和子域进行划分以方便统一管理。在物理层使用防火墙将各个子公…

『亚马逊云科技产品测评』活动征文|EC2 实例安装 docker 与配套软件部署前后端分离的医疗管理后台系统

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 目录 一、AWS 产品类别选择 &#xff08;1&#xff09;应用服务器选择…

浅谈现代化城市建设中智慧消防的研究与应用

安科瑞 华楠 【摘要】随着城市现代化发展&#xff0c;城市居住密度愈来愈大&#xff0c;城市建筑结构复杂多样化&#xff0c;高层建筑火灾发生率在不断地升高。对现代化城市面临的消防问题展开讨论&#xff0c;针对智慧消防在现代化城市建设中的现状进行了分析&#xff0c;并提…

探索 Vue 中的 bus.$emit:实现组件通信的强大工具

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

快手AI布局:从直播电商到大模型,如何打造智能生态?

快手科技在2023年第三季度业绩中&#xff0c;首次披露了关于AI业务的一些重要信息&#xff0c;显示出其对AI的重视和投入。快手AI的核心业务和竞争优势是什么&#xff1f;AI的发展&#xff0c;对快手业绩带来了哪些方面的提振&#xff1f; 快手AI业务板块&#xff1a;直播电商…

华为云人工智能入门级开发者认证学习笔记

人工智能入门级开发者认证 人工智能定义 定义 人工智能 (Artificial Intelligence) 是研究、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 强人工智能 vs 弱人工智能 强人工智能&#xff1a;强人工智能观点认为有可能制造出真正能推理&#xff08…

【React】打包体积分析 source-map-explorer

通过分析打包体积&#xff0c;才能知道项目中的哪部分内容体积过大&#xff0c;方便知道哪些包需要进一步优化。 使用步骤 安装分析打包体积的包&#xff1a;npm i source-map-explorer在 package.json 中的 scripts 标签中&#xff0c;添加分析打包体积的命令对项目打包&…

【Java并发】聊聊创建线程池的几种方式以及实际生产如何应用

上一篇文章&#xff0c;主要讲述了如果通过线程池进行执行任务&#xff0c;以及相关的核心流程&#xff0c;线程执行框架本身提供了一系列的类&#xff0c;封装了线程创建、关闭、执行、管理等跟业务逻辑无关的代码逻辑&#xff0c;一方面将业务和非业务逻辑进行解耦合&#xf…

Docker简介与安装

Docker简介 1.什么是docker docker是解决了运行环境和配置问题的软件容器。是一种方便做持续集成并有助于整体发布的容器虚拟化技术。docker官网&#xff1a;http://www.docker.com 2.与传统虚拟技术的区别 传统虚拟机技术是虚拟出一套硬件后&#xff0c;在其上运行一个完整…

关于pytorch以及相关包的安装教程

一.查看自己电脑的配置 首先查看自己电脑的cuda的版本&#xff0c;WinR,敲入cmd打开终端 输入nvidia-smi&#xff0c;查看自己电脑的显卡等配置 这里要说明一下关于这个CUDA,它具有向后兼容性&#xff0c;这意味着支持较低版本的 CUDA 的应用程序通常也可以在较高版本的 CUD…

简单介绍一下js中的构造函数、原型对象prototype、对象原型__proto__、原型链

构造函数 function Star (uname, age){this.uname unamethis.age agethis.sing function(){ log(唱歌~) }}let xzq new Star(薛之谦, 30)let ldh new Star(刘德华, 20)log(ldh) // { uname: 刘德华, age: 20, sing: f }ldh.sing() // 唱歌~log(ldh.sing xzq.sing) // fal…

2023年c语言程序设计大赛

7-1 这是一道送分题 为了让更多的同学参与程序设计中来&#xff0c;这里给同学们一个送分题&#xff0c;让各位感受一下程序设计的魅力&#xff0c;并祝贺各位同学在本次比赛中取得好成绩。 注&#xff1a;各位同学只需将输入样例里的代码复制到右侧编译器&#xff0c;然后直…

【2023传智杯】第六届传智杯程序设计挑战赛AB组-ABC题解题分析详解【JavaPythonC++解题笔记】

本文仅为第六届传智杯程序设计挑战赛-题目解题分析详解的解题个人笔记,个人解题分析记录。 本文包含:第六届传智杯程序设计挑战赛题目、解题思路分析、解题代码、解题代码详解 文章目录 一.前言二.比赛题目(AB俩组)A题题目B题题目C题题目三.解题代码A题解题思路解题代码【J…

Qt 串口编程-从入门到实战

1. Qt 串口通信流程解析 1.1 串行通信和并行通信对比 并行通信适合距离较短的通信&#xff0c;且信号容易受干扰&#xff0c;成本高串口通讯-设备&#xff08;蓝牙&#xff0c; wifi&#xff0c; gprs&#xff0c; gps&#xff09; 1.2 Qt 串口通信具体流程 1. 创建 QSerial…

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

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

从程序员到解决方案工程师:一次跨界的职场冒险

在科技行业里&#xff0c;程序员和解决方案工程师是两个非常常见的职业。虽然这两个职业都需要一定的行业理解和问题解决能力&#xff0c;但它们的工作内容和职责却有很大的不同。 那么&#xff0c;如果一名程序员决定转行做一名解决方案工程师&#xff0c;他会经历怎样的体验…