模拟退火算法应用——求解一元函数的最小值

news2024/11/18 16:25:19

仅作自己学习使用


一、问题

需求: 计算函数

在这里插入图片描述
的极小值,其中个体x的维数n=10,即x=(x1,x2,…,x10),其中每一个分量xi均需在[-20,20]内。因此可以知道,这个函数只有一个极小值点x = (0,0,…,0),且其极小值是0,那么我们用模拟退火来实现一下:

二、matlab代码实现

clear
clc

T1 = cputime;

D = 10;     % 变量维数
Xs = 20;    % 上限
Xx = -20;   % 下限
L = 20;     % 马尔可夫链长度
K = 0.98;   % 降温系数
S = 0.01;   % 步长因子
T = 100;    % 初始温度
YZ = 1e-8;  % 容差
P = 0;      % MetroPolis过程中总接受点(MetroPolis是接受准则,小于接受,大于是概率接受)
PreX = rand(D,1)*(Xs-Xx) + Xx;     % 设置初值位置(这个随机数可以产生一个-20到20的随机数)
PreBestX = PreX;    % 上一个最优解
PreX = rand(D,1)*(Xs-Xx) + Xx;     % 虽然代码相同,但是因为随机数种子,产生的值会不同 
BestX = PreX;       % 最优解
trace = eval(BestX); % 记录初始值
deta = abs(eval(BestX) - eval(PreBestX));

while (deta>YZ) && (T>0.0001)
    %% 在当前温度T下的迭代次数为L
    for i = 1 : L
        % 在此点附近随机选择下一个点
        NextX = PreX + S*(rand(D,1)*(Xs-Xx) + Xx);
        % 如果这个点其中有个分量超出了定义域,则重新分配一个值
        for j = 1:D
            if(NextX(j) > Xs || NextX(j)<Xx)
                NextX(j) = PreX(j) + S*(rand*(Xs-Xx) + Xx);
                j = j-1; % 因为重新分配的值任然可能超出边界,所以退回到当前的那个j,再次检查是否超出边界
            end   
        end
        %% 判断是否是全局最优解
        if( eval(NextX) < eval(BestX) )
            PreBestX = BestX;   % 保留上一个最优解
            BestX = NextX;      % 更新上一个最优解
        end
        %% MetroPolis接受准则
        if( eval(NextX) < eval(PreX) )
            % 当前解更优秀,接受新解
            PreX = NextX;
            P = P + 1;
        else
            % 当前解更差,概率接受
            P1 = exp((eval(PreX)-eval(NextX))/T); % 注意指数部分是个复数,所以要自己调整减的顺序
            if (P1 > rand)
                PreX = NextX;
                P = P + 1;
            end 
        end
        trace = [trace eval(BestX)];
    end
    deta = abs(eval(BestX)-eval(PreBestX));
    %% 本次退火结束,降温
    T = K * T;
end

T2 = cputime;
% 运行代码所需要的CPU时间
timeConsume = T2 - T1;

disp('最小值点在:');
BestX
disp('最小值为');
eval(BestX)
figure(color=[1 1 1])
plot(trace(2:end),Color=[0.502, 0.000, 0.502],LineWidth=2);
xlabel("迭代次数")
ylabel("目标函数值")
title("适应度曲线","CPU时间消耗: "+timeConsume + 's');


function result = eval(x)
    %% 评估函数
    result = sum(x.^2);
end

三、效果图

在这里插入图片描述
可以看到,最后是达到0.0269403,还不是真正意义上的极小值,因为模拟退火算法是模拟固体退火的原理,其结果的好坏与退温系数非常相关,温度下降得越慢,结果越精确。但是代码中有一个问题,也就是NextX = PreX + S*(rand(D,1)*(Xs-Xx) + Xx);这行代码,非常清楚的看到这下一个X的跳动范围是与温度无关的,但是根据物理退火的过程,温度越高,分子越活跃,对应退火模型中的x应该跳动范围更大,所以这行代码应该是值得改进的,比如改成:NextX = PreX + T*(rand(D,1)*(Xs-Xx) + Xx);但是这样又会极大的增加搜索时间。
        如果有朋友有其他的方案,欢迎大家在评论区留言。

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

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

相关文章

信息检索指标直接优化的通用近似框架

1、直接优化信息检索指标的背景 1.1、存在问题 直接优化信息检索的指标是信息检索的一大方向。主要包含两类方法&#xff0c;一类是将IR指标作为上界进行优化&#xff1b;另一类是使用平滑函数近似表示IR指标进行优化。 直接优化IR指标方式很自然&#xff0c;但没有提供理论…

【ArcGIS Pro微课1000例】0037:ArcGIS Pro中模型构建器的使用---以shp批量转kml/kmz为例

文章目录 一、ArcGIS Pro模型构建器介绍二、shp批量转kml/kmz1. 打开模型构建器2. 添加工作空间4. 添加【创建要素图层】工具5. 添加【图层转kml】工具6. 输出文件命名7. 运行模型一、ArcGIS Pro模型构建器介绍 模型构建器是一种可视化编程语言,用于构建地理处理工作流。 地理…

Inport 模块

文章目录 Interpolate datainport 模块存在于模型最顶层Port Dimension 和 Variable-size signal Interpolate data Interpolate data&#xff1a;当将 Workspace 的数据导人模型时, 对没有对应数据点的采样时刻进行线性插值的开关选项。 inport 模块存在于模型最顶层 inpo…

区块链技术将如何影响未来的数字营销?

你是否听腻了区块链和数字营销等流行语&#xff0c;却不明白它们对未来意味着什么&#xff1f;那么&#xff0c;准备好系好安全带吧&#xff0c;因为区块链技术将彻底改变我们对数字营销的看法。从建立消费者信任到提高透明度和效率&#xff0c;其可能性是无限的。 让我们来探…

3.10-容器的操作

这一节讲解一下对于container我们可以进行哪些操作&#xff1f; 可以使用以下命令来停止正在运行的Docker容器&#xff1a; docker container stop <CONTAINER ID> 关于运行中的容器&#xff0c;我们可以进行的操作&#xff1a; 第一个是docker exec命令&#xff0c;这个…

软件开发中的抓大放小vs极致细节思维

最近在开发过程中&#xff0c;遇到了好多次 “这个需求点这次要不要做&#xff1f;” 的问题&#xff0c; 主要有两方阵营&#xff0c;比如以研发主导的 “这次先不做、等必要的时候再做” &#xff0c;另外一方是以PM主导的 “这个不做需求不完整&#xff0c;可能影响用户体验…

单片机AT89C51直流电机控制电路PWM设计

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;直流电机 获取论文报告源码源程序原理图 此文将介绍一种直流电机&#xff0c;详细阐述了用单片机输出口所给占空比的不同实现电机的调速的设计方法&#xff1b;着重讨论L298用于电机驱动时特有的优势。直流电机调速具有…

影刀RPA_boss直聘翻页(避坑)

boss直聘翻页这里有个坑 问题&#xff1a; 无限循环中&#xff0c;点击下一页按钮&#xff0c;直到不可点击为止。 发现&#xff0c;在点到第5页的时候&#xff0c;再次点击下一页&#xff0c;直接就点击了页码10&#xff0c;导致流程直接就结束了。 在第5页进行校验&#xff0…

基于51单片机的百叶窗控制系统设计

**单片机设计介绍&#xff0c; 基于51单片机的百叶窗控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于51单片机的百叶窗控制系统设计可以分为硬件设计和软件设计两个方面。下面是一个简要的设计介绍&#xff1a; …

阿里云服务器安装mysql数据库之后无法远程连接

目录 一、mysql安装完成后直接远程远程连接阿里云服务器上的MySQL会报下述错误&#xff1a; 1、修改root用户的host 为% 登录MySQL 后 执行 2、修改完成后执行 3、退出mysql 重启mysql服务 exit; 4、修改完成后需要设置阿里云的安全规则。 二、dbaver测试链…

C语言每日一题(37)两数相加

力扣网 2 两数相加 题目描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&a…

【Spring篇】Spring注解式开发

本文根据哔哩哔哩课程内容结合自己自学所得&#xff0c;用于自己复习&#xff0c;如有错误欢迎指正&#xff1b; 我在想用一句话激励我自己努力学习&#xff0c;却想不出来什么惊为天人、精妙绝伦的句子&#xff0c;脑子里全是上课老师想说却没想起的四个字 “ 唯手熟尔 ”&am…

python pip安装第三方包时报错 error: Microsoft Visual C++ 14.0 or greater is required.

文章目录 1.问题2.原因3.解决办法 1.问题 pip install 的时候报错一大堆&#xff0c;其中有这么一段话 &#x1f447; error: Microsoft Visual C 14.0 or greater is required. Get it with "Microsoft C Build Tools": https://visualstudio.microsoft.com/visua…

java基于springboot公益帮学网站 新闻发布系统的设计与实现vue

以Java为开发平台&#xff0c;综合利用Java Web开发技术、数据库技术等&#xff0c;开发出公益帮学网站。用户使用版块&#xff1a;可以选择注册并登录&#xff0c;可以浏览信息、可以网上互动、发布文章、内容推荐等。后台管理员管理版块&#xff1a;以管理员身份登录网站后台…

Proteus仿真--用DS1302与12864LCD设计的可调式中文电子日历

本文主要介绍用DS1302和12864 LCD的可调式中文电子日历&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 其中12864LCD上面显示中文年月日信息时间信息&#xff0c;按键K1-K4&#xff0c;K1用于年月日时分选择&#xff0c;K2用于加功能&#xff0c;K3用于…

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…

Docker的学习笔记

1.1 docker的介绍 1.2 docker的一次安装 //如果是root用户&#xff0c;不加sudo也行curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian/gpg | sudo apt-key add -echo deb https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian/ buster stable…

路由VRRP与BFD联动例子

拓朴如下&#xff1a; 主要配置如下&#xff1a; [S1] vlan batch 10 20 # interface GigabitEthernet0/0/1port link-type accessport default vlan 10 # interface GigabitEthernet0/0/2port link-type accessport default vlan 20 # interface GigabitEthernet0/0/3port li…

[计算机网络]运输层概述

虽然我自己也不知道写在前面和前言有什么区别..... 这个系列其实是针对<深入浅出计算机网络>的简单总结,加入了一点个人的理解和浅薄见识,如果您有一些更好的意见和见解,欢迎随时协助我改正,感激不尽啦. 最近心态平和了不少, 和过去也完全做了个割舍吧,既然痛苦和压力的…

未来已来,Web前端测试这么做更高效!

一. 前端测试是什么&#xff1f; 前端测试也是一种自动化测试技术&#xff0c;其测试的主要对象就是 Web 应用的图形用户界面&#xff08;GUI&#xff09;、功能和可用性&#xff0c;以确保 Web 应用的 GUI 层在连续的更新迭代中没有 Bug。 例如&#xff0c;可以检查输入字段…