模拟退火算法及其代码

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 中时间戳过滤器的优化 - 处理非常大的数据集

    我正在 MATLAB 中编写一个程序 必须使用 MATLAB 并且不能真正使用 MEX 来过滤大量数据 我需要实现的过滤器之一要求我将时间戳向量与其他时间戳不会出现的已知 不良 时间列表进行比较 一个典型的时间戳向量有大约 2 000 00
  • 将自动生成的 Matlab 文档导出为 html

    我想为我开发的 Matlab 工具箱生成完整的帮助 我已经看到如何显示自定义文档 http www mathworks fr fr help matlab matlab prog display custom documentation h
  • 两个 y 轴与相同的 x 轴[重复]

    这个问题在这里已经有答案了 可能的重复 在单个图中绘制 4 条曲线 具有 3 个 y 轴 https stackoverflow com questions 1719048 plotting 4 curves in a single plo
  • Matlab中转换数据类型的有效方法(double vs. im2double)

    我想将真彩色图像转换为双精度 据我所知有两种方法可以做到这一点 double rgb img im2double rgb img 哪一种效率更高 谢谢 他们都是不同的 im2double将图像的范围转换为0 1如果数据类型是uint8 or
  • 如何使用matlab生成不同频率的正弦波?

    对于我的项目 我需要使用 matlab 生成一个正弦波 它有 100 000 个样本 并且频率在每 10 000 个样本后随机变化 采样率和频率可以根据方便而定 matlab中有没有函数可以生成这个 好的另一个例子 生成 5 个随机频率 r
  • 如何在 Matlab 中使用谷歌翻译?

    我正在编写一个程序 使用 Matlab 列出电影字幕文件中的所有唯一单词 现在我有一个独特的单词列表 我想将其翻译成我的语言并在观看电影之前了解其含义 有谁知道如何在 Matlab 中使用 Google Translate 以便完成我的脚本
  • 如何在 Matlab 中对数组应用低通或高通滤波器?

    有没有一种简单的方法可以将低通或高通滤波器应用于 MATLAB 中的数组 我对 MATLAB 的强大功能 或数学的复杂性 有点不知所措 需要一个简单的函数或一些指导 因为我无法从文档或网络搜索中找到答案 看着那 这filter http w
  • 两个向量之间的欧氏距离(单行矩阵)

    我有两个向量 单行矩阵 假设我们已经知道长度len A x1 x2 x3 x4 x5 B y1 y2 y3 y4 y5 计算它们之间的欧几里德距离最快的方法是什么 我的第一次尝试是 diff A B sum 0 for column 1 l
  • Matlab 和 Python 中的优化算法(dog-leg trust-region)

    我正在尝试使用 Matlab 和 Python 中的狗腿信赖域算法求解一组非线性方程 在Matlab中有fsolve https www mathworks com help optim ug fsolve html其中此算法是默认算法 而
  • 如何在放置颜色条后保持子图大小不变

    假设我们有一个 1 2 子图 我们在其中绘制了一些图形 如下所示 subplot 1 2 1 surf peaks 20 subplot 1 2 2 surf peaks 20 然后我们要添加一个颜色条 colorbar 我不希望结果中的正
  • 了解 fminunc 参数和匿名函数、函数处理程序

    请多多包涵 问题在最后 我试图找出 fminunc 调用方式的差异 这个问题源于 Andrew Ng 在他的 Coursera 机器学习课程中的第 3 周材料 我正在回答这个问题 Matlab Andrew Ng 机器学习课程中 t cos
  • 在matlab中绘制给定区域内(两个圆之间)的向量场

    我想在 Matlab 中绘制下面的向量场 u cos x x 0 y y 0 v sin x x 0 y y 0 我可以在网格中轻松完成 例如 x 和 y 方向从 2 到 2 x 0 2 y 0 1 x y meshgrid 2 0 2 2
  • 图像处理 - 使用 opencv 进行服装分割

    我正在使用 opencv 进行服装特征识别 第一步 我需要通过从图像中移除脸部和手来分割 T 恤 任何建议表示赞赏 我建议采用以下方法 Use 阿德里安 罗斯布鲁克的用于检测皮肤的皮肤检测算法 谢谢罗莎 格隆奇以获得他的评论 在方差图上使用
  • ROC曲线和libsvm

    给定一条 ROC 曲线plotroc m see here http www csie ntu edu tw cjlin libsvmtools roc curve for binary svm 理论问题 如何选择要使用的最佳阈值 编程问题
  • @(t)在Matlab中是什么意思? [复制]

    这个问题在这里已经有答案了 正如标题所示 考虑到下面的上下文 t 在 Matlab 中到底意味着什么 computeNumericalGradient 是一个函数 cofiCostFunc 也是一个接受一堆参数的函数 问题是 t 对 cof
  • 对数据进行分布拟合 - MATLAB

    我正在尝试对从显微镜图像中收集的一些数据进行分布 我们知道 152 左右的峰值是由于泊松过程造成的 我想将分布拟合到图像中心的大密度 同时忽略高强度数据 我知道如何将正态分布拟合到数据 红色曲线 但它不能很好地捕获右侧的重尾 尽管泊松分布应
  • 如何在 MATLAB 中绘制纹理映射三角形?

    我有一个三角形 u v 图像中的坐标 我想在 3D 坐标处绘制这个三角形 X Y Z 与图像中的三角形进行纹理映射 Here u v X Y Z都是具有三个元素的向量 代表三角形的三个角 我有一个非常丑陋 缓慢且令人不满意的解决方案 其中我
  • 矩形函数的数值傅里叶变换

    本文的目的是通过一个众所周知的分析傅里叶变换示例来正确理解 Python 或 Matlab 上的数值傅里叶变换 为此 我选择矩形函数 这里报告了它的解析表达式及其傅立叶变换https en wikipedia org wiki Rectan
  • 将 Matlab 的 datenum 格式转换为 Python

    我刚刚开始从 Matlab 迁移到 Python 2 7 在读取 mat 文件时遇到一些问题 时间信息以 Matlab 的日期数字格式存储 对于那些不熟悉它的人 日期序列号将日历日期表示为自固定基准日期以来已经过去的天数 在 MATLAB
  • 如何使用SIFT算法计算两幅图像的相似度?

    我已经用过SIFT http en wikipedia org wiki Scale invariant feature transform实施安德里亚 维达尔迪 http www vlfeat org overview sift html

随机推荐

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

    注 本文原型为作者的好友们 全文不完全代表作者本人的意图 本系列前两章 失业的程序员 一 二 一 这段时间我去参加了一个管理培训班 说实话去之前真的很痛苦 我一向认为那些都是骗人的玩意儿 在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的最小值