模拟退火算法及其代码

2023-10-29

模拟退火算法作为较为简单的智能算法,具有极大的参考意义。

以求解较为简单的y=(x-1)^2的最小值为例(智能算法是数值型解法,虽然我们预先知道其精确值为x=1,y=0)

clear
clc
tic
%y=x^2+1-2*x;%求-10到10的最小值
e=0.1^30;L=200000;at=0.99999;T=1;
%一般来说循环次数越多越精确。循环次数与e,L,at都有关系。有时候e很大(下降更慢),解却更粗糙,那是因为接近L值了,L的次数限制了它,提高L往往就可以
%得到更精确地结果了。
%退火过程
dmin=20;%设置初值,即y的最小值
for k=1:L
%产生新解
c=-10+rand()*20;
df=c^2+1-2*c-dmin
if df<0
    xbest=c;
    dmin=c^2+1-2*c;
elseif exp(-df/T)>rand(1)
    xbest=c;
    dmin=c^2+1-2*c;
    dd(k)=dmin;
end
T=T*at;
if T<e
break;
end
end
xbest
dmin
plot(dd)
toc

后面附录上,经典的TSP模型的代码(参考别人的)

clc,clear
load sj.txt %加载敌方 100 个目标的数据,数据按照表格中的位置保存在纯文本文件 sj.txt 中
x=sj(:,1:2:8);x=x(:);
y=sj(:,2:2:8);y=y(:);
sj=[x y];
d1=[70,40];%我方基地位置
sj=[d1;sj;d1];%首尾为基地位置,构成102行,实现闭环
sj=sj*pi/180;
%距离矩阵 d
d=zeros(102);
for i=1:101
for j=i+1:102
temp=cos(sj(i,1)-sj(j,1))*cos(sj(i,2))*cos(sj(j,2))+sin(sj(i,2))*sin(sj(j,2));
d(i,j)=6370*acos(temp);
end
end
d=d+d';
S0=[];Sum=inf;
rand('state',sum(clock));
for j=1:1000
S=[1 1+randperm(100),102];
temp=0;
for i=1:101
temp=temp+d(S(i),S(i+1));
end
if temp<Sum
S0=S;Sum=temp;
end
end
e=0.1^3000;L=20000;at=0.999;T=1;
%退火过程
for k=1:L
%产生新解
c=2+floor(100*rand(1,2));
c=sort(c);
c1=c(1);c2=c(2);
%计算代价函数值
df=d(S0(c1-1),S0(c2))+d(S0(c1),S0(c2+1))-d(S0(c1-1),S0(c1))-d(S0(c2),S0(c2+1));
%接受准则
if df<0
S0=[S0(1:c1-1),S0(c2:-1:c1),S0(c2+1:102)];
Sum=Sum+df;
elseif exp(-df/T)>rand(1)
S0=[S0(1:c1-1),S0(c2:-1:c1),S0(c2+1:102)];
Sum=Sum+df;
end
T=T*at;
if T<e
break;
end
end
% 输出巡航路径及路径长度
S0,Sum
for i=1:102
xx(i)=sj((S0(i)),1)*180/pi;
yy(i)=sj((S0(i)),2)*180/pi;
end
plot(xx,yy,'-o')
hold on
x=70,y=40;
plot(x,y,'r*')
53.7121 15.3046  51.1758 0.0322  46.3253 28.2753  30.3313 6.9348
56.5432 21.4188  10.8198 16.2529  22.7891 23.1045  10.1584 12.4819
20.1050 15.4562  1.9451 0.2057  26.4951 22.1221  31.4847 8.9640
26.2418 18.1760  44.0356 13.5401  28.9836 25.9879  38.4722 20.1731
28.2694 29.0011  32.1910 5.8699  36.4863 29.7284  0.9718 28.1477
8.9586 24.6635  16.5618 23.6143  10.5597 15.1178  50.2111 10.2944
8.1519 9.5325  22.1075 18.5569  0.1215 18.8726  48.2077 16.8889
31.9499 17.6309  0.7732 0.4656  47.4134 23.7783  41.8671 3.5667
43.5474 3.9061  53.3524 26.7256  30.8165 13.4595  27.7133 5.0706
23.9222 7.6306  51.9612 22.8511  12.7938 15.7307  4.9568 8.3669
21.5051 24.0909  15.2548 27.2111  6.2070 5.1442  49.2430 16.7044
17.1168 20.0354  34.1688 22.7571  9.4402 3.9200  11.5812 14.5677
52.1181 0.4088  9.5559 11.4219  24.4509 6.5634  26.7213 28.5667
37.5848 16.8474  35.6619 9.9333  24.4654 3.1644  0.7775 6.9576
14.4703 13.6368  19.8660 15.1224  3.1616 4.2428  18.5245 14.3598
58.6849 27.1485  39.5168 16.9371  56.5089 13.7090  52.5211 15.7957
38.4300 8.4648  51.8181 23.0159  8.9983 23.6440  50.1156 23.7816
13.7909 1.9510  34.0574 23.3960  23.0624 8.4319  19.9857 5.7902
40.8801 14.2978  58.8289 14.5229  18.6635 6.7436  52.8423 27.2880
39.9494 29.5114  47.5099 24.0664  10.1121 27.2662  28.7812 27.6659
8.0831 27.6705  9.1556 14.1304  53.7989 0.2199  33.6490 0.3980
1.3496 16.8359  49.9816 6.0828  19.3635 17.6622  36.9545 23.0265
15.7320 19.5697  11.5118 17.3884  44.0398 16.2635  39.7139 28.4203
6.9909 23.1804  38.3392 19.9950  24.6543 19.6057  36.9980 24.3992
4.1591 3.1853  40.1400 20.3030  23.9876 9.4030  41.1084 27.714	

sj.txt文件如上

模拟退火算法的性能评价:

   一般认为,下降温度足够慢,可以找到全局最优解,但是寻找时间延长。所以,在时间有限情况下,全局最优的性能评价,SA算法不占优势,但是由于其编程较为简单,具有模块化特征。

将其模板化如下:

伪代码:

产生数值   %可以用蒙特卡洛或者爬山算法产生较好初值,不过随意选取也行
e=0.1^3000;L=20000;at=0.999;T=1;
%设置温度阈值e,低于这个温度就停止循环,即停止降温;L是循环次数阈值,就算温度没有降到
%温度阈值,但是仍然会停止;at是降温速率,一般取0.999,认为越接近于1越好,但是速率慢,T是初始温度
%退火过程
for k=1:L   %开始循环
%产生新解
c=2+floor(100*rand(1,2));
c=sort(c);
c1=c(1);c2=c(2);
%计算代价函数值
df=d(S0(c1-1),S0(c2))+d(S0(c1),S0(c2+1))-d(S0(c1-1),S0(c1))-d(S0(c2),S0(c2+1));
%接受准则
if df<0
   S0=[S0(1:c1-1),S0(c2:-1:c1),S0(c2+1:102)];  %这里是求最小值,所以df<0,接受新解
Sum=Sum+df;
elseif exp(-df/T)>rand(1)
   S0=[S0(1:c1-1),S0(c2:-1:c1),S0(c2+1:102)];  
%%尽管df<0,也以较小概率接受新解,这是比爬山算法优越的地方,同时得注意T值在不断变小,这正是模拟退火的精髓,如果T固定为20000不变,则很难找到较好的解,或者说收敛很慢
Sum=Sum+df;

end
T=T*at;
if T<e
break;
end
end   %这是模板化的,降温过程与退出机制

% 输出巡航路径及路径长度
S0,Sum

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

模拟退火算法及其代码 的相关文章

  • Matlab Solve():未给出所有解决方案

    我试图找到两条曲线的交点 syms x y g x 20 exp x 30 3 5 1 sol x sol y solve x 22 3097 2 y 16 2497 2 25 y g x x y Real true 它只提供一种解决方案
  • 如何加载具有可变文件名的 .mat 文件?

    select all mat files oar dir oar mat n oar name loop through files for l 1 length oar load pat oar l lt this is the mat
  • 从 Java 运行 MATLAB 函数

    我在 MATLAB 中有一个 m 文件 我想从 Java 调用该文件 并以字符串或 Java 中的任何形式获取解决方案 这听起来很简单 但由于某种原因我无法让它发挥作用 我试过这个 matlab nosplash wait nodeskto
  • 使用 R2010b 中的符号工具箱来求解和/或 linsolve

    我前几天问了一个问题here https stackoverflow com questions 20317038 matlab linear congruence solver that supports a non prime modu
  • 如何获取MATLAB句柄对象的ID?

    当我尝试使用时出现问题MATLAB 句柄对象 http www mathworks com help techdoc ref handle html作为关键值MATLAB 容器 Map http www mathworks com help
  • 如何为已编译的 MATLAB 创建安装程序并要求用户接受我们的许可条款?

    我正在 MATLAB 中编写程序分发给 Windows 用户 我使用 MATLAB 编译器和 MATLAB r2014a 版本来创建程序 我可以使用 MATLAB 应用程序编译器创建 Windows 安装程序 并且它的工作效果可以接受 但是
  • 如何在向量中的所有点之间绘制线?

    我有一个包含二维空间中一些点的向量 我希望 MATLAB 用从每个点到每个其他点绘制的线来绘制这些点 基本上 我想要一个所有顶点都连接的图 你能用情节来做到这一点吗 如果可以 怎么做 一种解决方案是使用该函数为每个点组合创建一组索引MESH
  • 如何正确从表中删除 NaN 值

    在 Matlab 中阅读 Excel 电子表格后 不幸的是 我的结果表中包含了 NaN 例如这个 Excel 表格 将产生此表 其中出现额外的 NaN 列 我尝试使用以下代码片段删除 NaN measurementCells readtab
  • MATLAB 编译器与 MATLAB 编码器

    两者有什么区别 据我了解 MATLAB Compiler将MATLAB代码包装成 exe文件 这样就可以在不安装MATLAB的情况下使用它 并且只需要MCR 除此之外 MATLAB Builder NE 还可以用于生成与 Net 框架一起使
  • 在matlab中不使用for循环检查数组中的成员资格

    我想简化这段代码 使其无需 for 循环即可工作 for i 1 N for j 1 N if ismember j A PID i i TFP i j PID i i end end end 其中A是一个包含一些标签的矩阵 我之前存储的T
  • Ilnumerics Ilpanel 在 winform 中编译成 dll 并加载到 matlab 时不激活

    我想将 Visual studio 2012 中用 C 编写的 winform 编译为 dll 然后将其加载到 matlab 2013a 中 然后 我想使用 matlab net 接口与 winform 进行交互 侦听其事件并通过一组预定义
  • FMINCON 的替代方案

    除了 fmincon 之外还有其他更快 更高效的求解器吗 我正在使用 fmincon 来解决特定问题 但对于中等大小的向量变量来说 我的内存不足 我也没有任何超级计算机或云计算选项可供使用 我知道任何替代解决方案仍然会耗尽内存 但我只是想看
  • 如何在 MATLAB 编译的应用程序中运行外部 .m 代码? [复制]

    这个问题在这里已经有答案了 我有一个 MATLAB 项目 我使用 MCC 对其进行编译以获得单个可执行文件 然后我想知道外部程序员是否可以在 exe 中执行他的一些 m 文件 而无需重新编译整个项目 重点是提供一个应用程序 其他开发人员可以
  • 通过 cuFFT 进行逆 FFT 缩放

    每当我使用 cuFFT 绘制程序获得的值并将结果与 Matlab 的结果进行比较时 我都会得到相同形状的图形 并且最大值和最小值位于相同的点 然而 cuFFT 得到的值比 Matlab 得到的值大得多 Matlab代码是 fs 1000 s
  • 使用简单矩阵乘法时出错

    我在一次简单的乘法运算中偶然发现了一个错误 这让我感到非常惊讶 我一直以为这里发生了什么 只为矩阵乘法 http www mathworks nl help matlab matlab prog operators html x 2 y z
  • Deploytool for MATLAB R2013b 不起作用,发生了什么变化?

    多年来我一直在使用集成deploytool为我的同事创建易于分发的 exe 文件 我几天前安装了R2013b 但无法使用deploytool不再了 尝试打包时的日志文件给出了以下内容 ant
  • 保存符号方程以供以后使用?

    From here http www mathworks com help releases R2011a toolbox symbolic brvfu8o 1 html brvfxem 1 我正在尝试求解这样的符号方程组 syms x y
  • 优先连接,Matlab 中的复杂网络

    大家好 我现在正在 MATLAB 中研究优先附件模型 在理解以下内容时遇到一些困难 假设我一开始有 4 个节点 连接如下 time 0 1 lt gt 2 3 lt gt 4 在下一个时间步骤中 我添加一个节点和 4 个连接 然后添加另一个
  • 2D 网格的纹理贴图

    我有一组点 x y meshgrid 1 N 1 M 在常规二维上定义 N x M网格 我还有另一组要点 u v 这是原始网格的一些变形 即 u v f x y 但是我没有实际的f导致变形 如何将纹理映射到由定义的 变形 网格u v 即 给
  • 拟合具有扭曲时基的正弦波

    我想知道在 Matlab 中拟合具有扭曲时基的正弦波的最佳方法 时间失真由 n 阶多项式 n 10 给出 其形式为t distort P t 例如 考虑失真t distort 8 12t 6t 2 t 3 这只是幂级数展开 t 2 3 这将

随机推荐

  • [正能量系列]失业的程序员(三)

    注 本文原型为作者的好友们 全文不完全代表作者本人的意图 本系列前两章 失业的程序员 一 二 一 这段时间我去参加了一个管理培训班 说实话去之前真的很痛苦 我一向认为那些都是骗人的玩意儿 在qq上找我学姐吐槽 说现在的广告真烦 搞这么多培训
  • Qt注册自定义类型

    一 自定义类型注册必要性 如果要在Qt信号槽中使用自定义类型 需要注意使用qRegisterMetaType对自定义类型进行注册 当然在不跨线程时使用自定义类型signal slot来传递 可能不会出现什么问题 一旦涉及跨线程就很容易出错
  • SPSS(基础篇09)--拆分数据文件

    拆分数据文件 文章目录 拆分数据文件 前言 1 在原始文件中拆分 1 1 拆分文件 比较组 1 2 拆分文件 按组来组织输出 1 3 其它用法 2 直接存储为多层 拆分结果单独存为文件 前言 导语 拆分文件是一种很常见的操作 比如 一个数据
  • 关于loss.backward()函数反向传播时叶子节点被释放

    之前写代码的时候遇到的一个问题 一直没有解决 后来稀里糊涂的解决了 我也不知道原因 这里贴出来 希望大家遇到这个问题的时候能有些启发 图来自网上搜索 由于问题是很久以前的了 当时没有保存截图 抱歉了 这个问题的出现其实可以将 loss ba
  • spring-aop组件详解——TargetSource目标源

    TargetSource 目标源 是被代理的target 目标对象 实例的来源 TargetSource被用于获取当前MethodInvocation 方法调用 所需要的target 目标对象 这个target通过反射的方式被调用 如 me
  • [工业互联-19]:如何在QT中增加SOEM主站

    目录 第1章 基本步骤 第2章 详细步骤 2 1 QT安装 2 2 VS安装 2 3 Win10 Debuggers 2 4 QT配置 2 5 SOEM移植 lib库生成 2 文件移植 文件整理 第1章 基本步骤 要在QT中添加SOEM主站
  • jsp 实现在线人数统计

    首先写个类 import javax servlet import javax servlet http public class SessionCounter implements HttpSessionListener private
  • Xcode7.1环境下上架iOS App到AppStore 流程 (Part 三)

    前言部分 part三 部分主要讲解 Xcode关联绑定发布证书的配置 创建App信息 使用Application Loader上传 ipa文件到AppStore 一 Xcode配置发布证书信息 1 给应用绑定App ID并添加Team账号
  • 爬取某网站的内容、得不到html页面的内容

    Python爬取 1 爬取内容 对某网站内容与热度进行爬取 分析 我们所需的数据是热搜榜的1 10 第一个数据pass divs html xpath div class wbpro side card7 div position gt 1
  • npm init @vitejs/app 初始化项目报错

    我的解决办法在红色加粗的那里 仅供参考 npm init vitejs app vitejs create app is deprecated use npm init vite instead C Users AppData Local
  • List排序 Sort的用法

    目录 1 简要说明 2 官方文件 3 举例说明 3 1 默认排序Sort 3 2Sort IComparer comparer 3 3Sort Comparison comparison 3 4Sort int index int coun
  • C++11新特性之右值引用

    目录 前文 一 什么是右值引用 二 左值引用和右值引用比较 三 右值引用的应用场景以及作用 四 右值引用左值的场景分析 五 完美转发 总结 前文 在C 98标准后 C 11标准的更新为C 注入了新活力 C 11新加了140多个新特性 我们这
  • C#反射Activator

    一 反射的定义与使用场景 反射是指程序可以访问 检测和修改它本身状态或行为的一种能力 程序集包含模块 而模块包含类型 类型包含成员 反射提供了封装程序集 模块和类型的对象 Type类型 可以使用反射动态创建类型的实例 将类型绑定到现有对象
  • 【自己创建分词器tokenizer】(2)——BPE tokenizer

    自己创建分词器 WordPiece tokenizer 自己创建分词器 BPE tokenizer 自己创建分词器 Unigram tokenizer 1 整体步骤 分词包括以下几个步骤 标准化 Normalization 对文本进行必要的
  • mysql带入参的存储过程_MySQL带参数的存储过程小例子

    http wwty iteye com blog 698239 mysql存储过程也提供了对异常处理的功能 通过定义HANDLER来完成异常声明的实现 语法如下 DECLARE handler type HANDLER FOR condit
  • ST-BlueNrg-lp蓝牙芯片OTA升级过程

    1 无线 固件升级的概念 空中下载 OTA 固件升级是一种协议 它允许低功耗蓝牙从设备通过空中接收来自低功耗蓝牙主设备的固件映像并将其写入闪存 为了将事情置于低功耗蓝牙技术的正确环境中 OTA 固件升级框架定义了一项暴露其自身特征的服务 该
  • 第十五章 单点登录——《跟我学Shiro》

    Shiro 1 2开始提供了Jasig CAS单点登录的支持 单点登录主要用于多系统集成 即在多个系统中 用户只需要到一个中央服务器登录一次即可访问这些系统中的任何一个 无须多次登录 此处我们使用Jasig CAS v4 0 0 RC3版本
  • 算法通关村-----位运算高频算法题

    1 位移的妙用 1 1 位1的个数 问题描述 编写一个函数 输入是一个无符号整数 以二进制串的形式 返回其二进制表达式中数字位数为 1 的个数 也被称为汉明重量 详见leetcode191 问题分析 可以将输入的无符号整数各个bit位依次与
  • 解决方法:AttributeError: module ‘torchtext.data‘ has no attribute ‘Field‘

    将 from torchtext data import Field 改为 from torchtext legacy data import Field 同理 对于 from torchtext data import 的其它Attrib
  • 模拟退火算法及其代码

    模拟退火算法作为较为简单的智能算法 具有极大的参考意义 以求解较为简单的y x 1 2的最小值为例 智能算法是数值型解法 虽然我们预先知道其精确值为x 1 y 0 clear clc tic y x 2 1 2 x 求 10到10的最小值