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

news2024/9/23 11:21:03

仅作自己学习使用


一、问题

需求: 计算函数

在这里插入图片描述
的极小值,其中个体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 = K * T;
    %% 在当前温度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));

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,还不是真正意义上的极小值,但是模拟退火算法也算是一个比较有效的全局搜索算法了。

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

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

相关文章

智能对话手机版系统源码:附带完整的搭建教程

移动设备的普及和移动互联网的发展&#xff0c;手机已经成为人们日常生活中最常用的通信工具。因此&#xff0c;针对手机平台开发智能对话系统具有非常重要的意义。首先&#xff0c;手机用户可以更加方便地进行语音对话和信息交互&#xff0c;提高沟通效率。其次&#xff0c;手…

ctfshow sql

180 过滤%23 %23被过滤&#xff0c;没办法注释了&#xff0c;还可以用’1’1来闭合后边。 或者使用--%0c-- 1%0corder%0cby%0c3--%0c--1%0cunion%0cselect%0c1,2,database()--%0c--1%0cunion%0cselect%0c1,2,table_name%0cfrom%0cinformation_schema.tables%0cwhere%0ctable_…

Redis常用操作及应用(一)

一、五种数据结构 二、String结构 1、字符串常用操作 SET key value //存入字符串键值对 MSET key value [key value ...] //批量存储字符串键值对 SETNX key value //存入一个不存在的字符串键值对 GET key //获取一个字符串键值 MGET key [ke…

超好用的制作照片书神器,强到没朋友

在这个快节奏的时代&#xff0c;我们常常忙于工作和生活&#xff0c;而忽略了那些珍贵的回忆。现在&#xff0c;有了超好用的制作照片书神器&#xff0c;你可以轻松地将这些回忆化为实实在在的书册&#xff0c;随时翻阅&#xff0c;感受那份温暖和感动。 接下来给大家推荐一款神…

开源还是闭源(=°Д°=)!!趋势表明,开源技术在诸多领域中日益受到重视

开源和闭源&#xff0c;两种截然不同的开发模式&#xff0c;对于大模型的发展有着重要影响。开源让技术共享&#xff0c;吸引了众多人才加入&#xff0c;推动了大模的创新。而闭源则保护了商业利益和技术优势&#xff0c;为大模型的商业应用提供了更好的保障。 一、开源和闭源的…

长征故事vr互动教育体验系统让师生感同身受

红色文化是贯穿于新民主主义革命、社会主义建设的各个时期&#xff0c;具有深厚的历史价值和文化内涵的先进文化&#xff0c;是高效、优质的教育资源。思政课vr红色数字展馆充分开发和大力弘扬红色文化资源&#xff0c;发挥其独特资源优势和教育功能&#xff0c;应用到教学中&a…

【学习草稿】pid控制基础实现--往水桶注水

pid 1&#xff09;非常通俗易懂的PID控制&#xff08;1&#xff09;https://zhuanlan.zhihu.com/p/37515841 球场上运动至指定地点&#xff08;比例控制&#xff09;&#xff1a;有图【很直观的帮助理解】&有文字分析 2&#xff09;初识PID-搞懂PID概念 https://zhuanlan.…

leetcode刷题日志-11盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。 思路…

LeetCode.88合并两个有序数组

LeetCode.88合并两个有序数组 1.问题描述2.解题思路3.代码 1.问题描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同…

完美解决:Nginx访问PHP出现File not found.

目录 解决方法一&#xff1a; 解决方法二&#xff1a; 遇到 File not found. 出现的问题解决&#xff1a; 解决方法一&#xff1a; 修改nginx的主配置文件。 vi /etc/nginx/nginx.conf location ~ \.php$ { root html; fastcgi_pass …

人工智能-注意力机制之注意力提示

注意力提示 自经济学研究稀缺资源分配以来&#xff0c;人们正处在“注意力经济”时代&#xff0c; 即人类的注意力被视为可以交换的、有限的、有价值的且稀缺的商品。 许多商业模式也被开发出来去利用这一点&#xff1a; 在音乐或视频流媒体服务上&#xff0c;人们要么消耗注意…

读懂毛京波的营销,也就读懂了路特斯的提速转变

“尽管我们交付还不到一年时间&#xff0c;但是今天Emeya一发布&#xff0c;我们的三车主又诞生了&#xff0c;他有Emira、Eletre&#xff0c;马上又定了Emeya&#xff0c;说明他对路特斯还是非常认可的&#xff0c;”路特斯集团CEO冯擎峰欣喜地说道&#xff0c;一个产品能不能…

《C++PrimePlus》第8章 函数探幽

8.1 内联函数 使用内联函数 #include <iostream> using namespace std;inline double square(double x) { return x * x; }int main(){double a;a square(5.0);cout << "a " << a << endl;return 0; } 8.2 引用变量 将引用用作函数参数&…

在JVM中 判定哪些对象是垃圾?

目录 垃圾的条件 1、引用计数法 2、可达性分析 3、强引用 4、软引用 5、弱引用 6、虚引用 判断垃圾的条件 在Java虚拟机&#xff08;JVM&#xff09;中&#xff0c;垃圾收集器负责管理内存&#xff0c;其中的垃圾收集算法用于确定哪些对象是垃圾&#xff0c;可以被回收…

0002Java程序设计-springboot在线考试系统小程序

文章目录 **摘 要****目录**系统实现开发环境 编程技术交流、源码分享、模板分享、网课分享 企鹅&#x1f427;裙&#xff1a;776871563 摘 要 本毕业设计的内容是设计并且实现一个基于springboot的在线考试系统小程序。它是在Windows下&#xff0c;以MYSQL为数据库开发平台&…

记一次linux操作系统实验

前言 最近完成了一个需要修改和编译linux内核源码的操作系统实验&#xff0c;个人感觉这个实验还是比较有意思的。这次实验总共耗时4天&#xff0c;从对linux实现零基础&#xff0c;通过查阅资料和不断尝试&#xff0c;直到完成实验目标&#xff0c;在这过程中确实也收获颇丰&…

井盖位移监测系统怎么监测井盖位移

党的二十大报告提出&#xff0c;坚持人民城市人民建、人民城市为人民&#xff0c;提高城市规划、建设、治理水平。秉持依法治理、创新引领的理念&#xff0c;市政府应该坚定推进窨井盖安全管理工作&#xff0c;不断加大排查整治力度&#xff0c;弥补设施安全管理短板&#xff0…

每日一练:“打家劫舍“(House Robber)问题 II

有想要了解打家劫舍初级问题的&#xff0c;可以点击下面链接查看&#xff01; 每日一练&#xff1a;“打家劫舍“&#xff08;House Robber&#xff09;问题 I 1. 问题 假设有房屋形成一个环形&#xff0c;即第一个房屋和最后一个房屋也相邻&#xff0c;每个房屋里都存放着一定…

Java数组的复制、截取(内含例题:力扣-189.轮转数组)

目录 数组的复制、截取&#xff1a; 1、使用Arrays中的copyOf方法完成数组的拷贝 2、使用Arrays中的copyofRange方法完成数组的拷贝 题目链接&#xff1a; 数组的复制、截取&#xff1a; 1、使用Arrays中的copyOf方法完成数组的拷贝 public class Csdn {public static vo…

【Git】一文教你学会 submodule 的增、查、改、删

添加子模块 $ git submodule add <url> <path>url 为想要添加的子模块路径path 为子模块存放的本地路径 示例&#xff0c;添加 r-tinymaix 为子模块到主仓库 ./sdk/packages/online-packages/r-tinymaix 路径下&#xff0c;命令如下所示&#xff1a; $ git subm…