matlab练习程序(模拟退火SA)

2023-11-03

模拟退火首先从某个初始候选解开始,当温度大于0时执行循环。

在循环中,通过随机扰动产生一个新的解,然后求得新解和原解之间的能量差,如果差小于0,则采用新解作为当前解。

如果差大于0,则采用一个当前温度与能量差成比例的概率来选择是否接受新解。温度越低,接受的概率越小,差值越大,同样接受概率越小。

是否接受的概率用此公式计算:p=exp(-ΔE/T)。这里ΔE为新解与原解的差,T为当前的温度。

由于温度随迭代次数逐渐降低,因此获得一个较差的解的概率较小。

典型的模拟退火算法还使用了蒙特卡洛循环,在温度降低之前,通过多次迭代来找到当前温度下比较好的解。

这里使用模拟退火解旅行商问题,因为这个问题本身是一个NP难问题,所以也就求不到最优解,不过应该可以求得一个比较好的解,然后再手工优化。

具体到程序中,这里的随机扰动就是随机置换两个城市的位置,能量就是旅行商路线的总长度。

算法结果如下:

初始旅行商路线:

最终求得的旅行商路线:

每次迭代求得的旅行距离:

matlab代码如下:

main.m

clear all;close all;clc

n=20;                   %城市个数
temperature=100*n;      %初始温度
iter=100;               %内部蒙特卡洛循环迭代次数

%随机初始化城市坐标
city=struct([]);
for i=1:n
    city(i).x=floor(1+100*rand()); 
    city(i).y=floor(1+100*rand());
end

l=1;                            %统计迭代次数
len(l)=computer_tour(city,n);   %每次迭代后的路线长度  
netplot(city,n);                %初始旅行路线

while temperature>0.001     %停止迭代温度
    
    for i=1:iter     %多次迭代扰动,一种蒙特卡洛方法,温度降低之前多次实验
        len1=computer_tour(city,n);         %计算原路线总距离
        tmp_city=perturb_tour(city,n);      %产生随机扰动
        len2=computer_tour(tmp_city,n);     %计算新路线总距离
        
        delta_e=len2-len1;  %新老距离的差值,相当于能量
        if delta_e<0        %新路线好于旧路线,用新路线代替旧路线
            city=tmp_city;
        else                        %温度越低,越不太可能接受新解;新老距离差值越大,越不太可能接受新解
            if exp(-delta_e/temperature)>rand() %以概率选择是否接受新解
                city=tmp_city;      %可能得到较差的解
            end
        end        
    end
    l=l+1;
    len(l)=computer_tour(city,n);   %计算新路线距离
    temperature=temperature*0.99;   %温度不断下降
  
end  
figure;
netplot(city,n);    %最终旅行路线

figure;
plot(len)  

computer_tour.m

function len=computer_tour(city,n)   %计算路线总长度,每个城市只计算和下家城市之间的距离。
    len=0;
    for i=1:n-1
        len=len+sqrt((city(i).x-city(i+1).x)^2+(city(i).y-city(i+1).y)^2);        
    end
    len=len+sqrt((city(n).x-city(1).x)^2+(city(n).y-city(1).y)^2);
end

perturb_tour.m

function city=perturb_tour(city,n)  
    
    %随机置换两个不同的城市的坐标
    %产生随机扰动
    p1=floor(1+n*rand());
    p2=floor(1+n*rand());

    while p1==p2
        p1=floor(1+n*rand());
        p2=floor(1+n*rand());    
    end
    
    tmp=city(p1);
    city(p1)=city(p2);
    city(p2)=tmp;

end

netplot.m

function netplot(city,n)        %连线各城市,将路线画出来
    hold on;
    for i=1:n-1
        plot(city(i).x,city(i).y,'r*');  
        line([city(i).x city(i+1).x],[city(i).y city(i+1).y]);  %只连线当前城市和下家城市     
    end

    plot(city(n).x,city(n).y,'r*');  
    line([city(n).x city(1).x],[city(n).y city(1).y]);     %最后一家城市连线第一家城市
    hold off;
end

 

转载于:https://www.cnblogs.com/tiandsp/p/3167785.html

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

matlab练习程序(模拟退火SA) 的相关文章

  • 如何使用 MATLAB 的“等值面”函数创建三角球体

    如何创建一个三角球体 其中每个三角形的面面积相同 我想要这样的东西 http imageshack us a img198 5041 71183923 png http imageshack us a img198 5041 7118392
  • 在每次迭代中使用 for 循环的索引命名图像

    我正在使用 MATLAB 进行图像处理项目 我使用 for 循环在每次循环迭代时生成某种图像数据 图像大小不同 我的问题是如何阻止它在下一次迭代中覆盖图像 Img i j data 理想情况下我希望它有 Img 1 data for 1st
  • Matlab 中是否有相当于 R 的 dput() 的函数?

    Matlab 中是否有相当于 R 的 dput 的函数 dput 将 R 对象的 ASCII 文本表示形式写入文件或连接 UPDATE 1 添加了递归和对单元格的支持 UPDATE 2 添加了对结构的支持 UPDATE 3 增加了对逻辑 整
  • 有没有办法在 MATLAB 中查看 pcode 文件 (.p) 的源代码?

    有没有办法在 MATLAB 中打开 pcode 文件 p 如果 开放 是指edit 那么当然不是 pcode 中的 p 代表 受保护 其主要设计目标是在保护其源代码的同时部署功能组件 如果 开放 是指run 那么当然是的 引用手册 http
  • 图像堆栈的最大强度投影

    我正在尝试重新创建该功能 max array 3 来自 MatLab 它可以获取 N 个图像的 300x300px 图像堆栈 我在这里说 图像 因为我正在处理图像 实际上这只是一个大的双数组 300x300xN 并创建一个 300x300
  • 如何在Matlab中自定义轮廓线?

    我正在准备一个等高线图 我应该在其中突出显示特定级别的等高线 例如 我的轮廓线值位于 1 和 1 之间 我想突出显示与值 0 相对应的线 我尝试使用以下过程来执行此操作 M c contourf longitude latitude del
  • Matlab:掩码/创建一个知道其原点且具有一定半径的圆形 roi

    只是一个简单的问题 我有一张图像 并且提取了某个点 特征 我知道每个帧中该点的坐标 说 x1 和 y1 我需要一个圆形 ROI 形式 该点在图像上具有我选择的半径 我尝试了 impoly 和 roipoly 当我知道图像中的要点时 不知道如
  • 如何让MCR启动时间快

    我将 matlab 程序转换为 net 程序集 即 dll 文件 我制作了一个控制台 C 应用程序 添加了 dll 文件并从 php 调用它 每次调用 exe 时都会调用 MCR 如何使 MCR 在服务器启动时初始化 并且即使在一段时间后调
  • Matlab PARFOR 循环可以通过编程方式打开/关闭吗?

    有一个关于 MATLAB 中 parfor 的简单问题 我想在程序中设置一个标志 以便在 parfor 和常规 for 循环之间进行更改 基本上 我需要此功能 以便我的代码的某些部分可以在 调试 模式下更新图形 然后当关闭该标志时 使用 p
  • 按元素出现的频率对数组元素进行排序

    是否可以在 matlab octave 中使用sort函数根据元素的相对频率对数组进行排序 例如数组 m 4 4 4 10 10 10 4 4 5 应该产生这个数组 5 10 10 10 4 4 4 4 4 5是出现频率较低的元素 位于顶部
  • 扩展 MATLAB 函数名称的最大长度

    我编写了一个 MATLAB 程序 可以动态创建自定义 MATLAB 函数 并使用以下命令在其他 MATLAB 实例中启动它们unix命令 我使用这个程序来自动化 fMRI 神经影像分析 使用 SPM8 for MATLAB 一切正常 但是
  • MATLAB 滚动图

    我有一个脑电图数据库 我想绘制它 数据库是一个19 1000 134的矩阵 其中 19 是通道数 在第一种方法中 我只使用一个渠道 1000 个样本大小 采样率为 500 Hz 时为 1000 个点 即 2 秒数据 134 epochs的数
  • 在 matlab 中求 3d 峰的体积

    现在我有一个带有峰值的 3D 散点图 我需要找到其体积 我的数据来自图像 因此 x 和 y 值表示 xy 平面上的像素位置 z 值是每个像素的像素值 这是我的散点图 scatter3 x y z 20 z filled 我试图找到数据峰值的
  • 如何将二进制值列表转换为int32类型?

    我在 MATLAB 工作区中有一个小端格式的二进制数列表 我想将它们转换为 int32 a是由 0 和 1 组成的双向量 如下所示 a 0 0 0 1 1 0 0 1 1 1 1 0 1 0 1 0 0 0 0 1 1 0 0 0 1 1
  • 在 Matlab 中高效获取像素坐标

    我想在 Matlab 中创建一个函数 给定一个图像 该函数将允许人们通过单击图像中的像素来选择该像素并返回该像素的坐标 理想情况下 人们能够连续单击图像中的多个像素 并且该函数会将所有相应的坐标存储在一个矩阵中 有没有办法在Matlab中做
  • 理解高斯混合模型的概念

    我试图通过阅读在线资源来理解 GMM 我已经使用 K 均值实现了聚类 并且正在了解 GMM 与 K 均值的比较 以下是我的理解 如有错误请指出 GMM 类似于 KNN 在这两种情况下都实现了聚类 但在 GMM 中 每个簇都有自己独立的均值和
  • MATLAB - 冲浪图数据结构

    我用两种不同的方法进行了计算 对于这些计算 我改变了 2 个参数 x 和 y 最后 我计算了每种变体的两种方法之间的 误差 现在我想根据结果创建 3D 曲面图 x gt on x axis y gt on y axis Error gt o
  • 访问图像的 Windows“标签”元数据字段

    我正在尝试进行一些图像处理 所以现在我正在尝试读取图像 exif 数据 有 2 个内置函数可用于读取图像的 exif 数据 问题是我想读取图像标签 exifread and imfinfo这两个函数都不显示图像标签 Is there any
  • 如何在文本集中创建所有字符组合?

    例如 我有这样的文本集 第 1 栏 a b 第 2 栏 l m n 第 3 栏 v w x y 我想将它们组合起来以获得如下输出 alv alw alx aly amv amw amx amy 这将输出 24 种文本组合 如果我只使用前两列
  • glpk.LPX 向后兼容性?

    较新版本的glpk没有LPXapi 旧包需要它 我如何使用旧包 例如COBRA http opencobra sourceforge net openCOBRA Welcome html 与较新版本的glpk 注意COBRA适用于 MATL

随机推荐

  • 【笔记】不一样的 双11 技术,阿里巴巴经济体云原生实践(下)

    CSE Serverless 在阿里巴巴 双11 场景的落地 云计算时代 Serverless 作为云原生重要技术组成部分 一开始便承载了太多的使命 承诺了云计算时代最典型并极具挑战的多维度服务指标 无服务运维 极速弹性伸缩 按量付费等 这
  • 关系数据库的特点

    关系数据库的特点 数据库管理系统将具有一定结构的数据组成一个集合 它主要具有以下几个特点 1 数据的结构化 数据库中的数据并不是杂乱无章 毫不相干的 它们具有一定的组织结构 属于同一集合的数据具有相似的特征 2 数据的共享性 在一个单位的各
  • .NET Core使用EF Core框架

    文章目录 概述 安装EF Core 使用EF Core增删改查 单表查询 插入数据 修改数据 删除数据 概述 Entity Framework EF Core 是轻量化 可扩展 开源和跨平台版的常用 Entity Framework 数据访
  • linux的用户和组

    linux是一个多用户 多任务的分时操作系统 windows是一个单用户操作系统 linux系统中的用户类型 1 root 超级管理员 uid 用户ID 0 权限大于Windows中的Administrator 2 系统用户 伪用户 uid
  • panda 修改行名字 报错 Index does not support mutable operations

    在进行panda数据操作 扩充时出现两个tricks 使用data pd append 进行行扩充数据时 行名需要相同 才能实现自动扩充 使用data pd columns 修改行名时 不允许切片操作 只能按照原数据长建立一个列表赋值修改
  • Python从txt文件中逐行读取数据

    非常的简单 提供三种方法 方法一 f open foo txt 返回一个文件对象 line f readline 调用文件的 readline 方法 while line print line 后面跟 将忽略换行符 print line e
  • 如何做好一份前端工程师的简历?

    一 你是前端工程师 虽然简历都会有一些常规信息 但职业决定了这份简历核心内容和求职成败 所以 这份简历应该尽可能体现你自己是一个合格的前端工程师 专业的前端工程师是什么可以看看去年Nate Koechley的演讲 Professional
  • 二叉树相关算法

    二叉树类算法 一 二叉树的路径和 二叉树的每个节点为0 9的一个数字 根到叶子的一条路径拼成一个数 求所有路径形成的数字和 struct TreeNode TreeNode left TreeNode right int value int
  • Ab3d.DXEngine 6.0 Crack 2023

    Ab3d DXEngine 不是另一个游戏引擎 如Unity 它强迫您使用其游戏编辑器 其架构 并且需要许多技巧和窍门才能在标准 Net 应用程序中使用 Ab3d DXEngine 是一个新的渲染引擎 它是从头开始构建的 旨在用于标准桌面
  • 基于yolov5的NEU-NET产品缺陷目标检测

    一 yolov5的使用 1 1 1 YOLOv5的介绍与特点 1 1 2 YOLOv5的基本使用 1 1 3目录结构树 2 二 数据预处理与模型训练 4 2 1 NET NET数据集 4 三 模型评价与分析 8 第一次写 没啥经验 内容的话
  • Spring 自学笔记

    Spring 自学笔记终 前言 Spring全家桶 spring springmvc spring boot spring cloud spring 出现时间2002年左右 解决企业开发难度 作用 减轻对项目模块之间的管理 类和类之间的管理
  • 华为od机考试题-字符串单词首字母转换大小写

    while 1 try nums input split dp f w 0 upper w 1 for w in nums print join dp except Exception as e break
  • 常见哈希算法总结

    目录 哈希算法概述 常见的哈希算法 MD5算法 SHA 1算法 哈希算法的用途 校验下载文件 存储用户密码 Hmac MD5算法 哈希算法概述 哈希算法又称摘要算法 它的作用是 对任意一组输入数据进行计算 得到一个固定长度的输出摘要 哈希算
  • Python编写微信打飞机小游戏(七)

    如果觉得这篇文章对您有所启发 欢迎关注我的公众号 我会尽可能积极和大家交流 谢谢 Python编写微信打飞机小游戏 一 Python编写微信打飞机小游戏 二 Python编写微信打飞机小游戏 三 Python编写微信打飞机小游戏 四 Pyt
  • webpack

    一 是什么 loader 用于对模块的 源代码 进行转换 在 import 或 加载 模块时预处理文件 webpack做的事情 仅仅是分析出各种模块的依赖关系 然后形成资源列表 最终打包生成到指定的文件中 如下图所示 在webpack内部中
  • 保证业务高效运营 专有云虚拟网络是关键

    随着越来越多的企业用户上云 且客户业务场景多种多样的情况下 云计算面临的挑战也越来越多 如企业多 IDC 异地办公区 远程运维人员接入到企业内网需要一致的体验等场景下 还要提供高可靠 安全和易维护的网络能力 我们可以通过组合百度智能云网络模
  • ue4 解决编译保存蓝图时报无法报存资源.uasset错

    当你在打开蓝图时 逻辑没有任何错误 甚至你没有做任何修改 在编译保存时报资源错误 如下图 这时候 你打开任务管理器 在后台进程 你会发现一个在跑的ue进程 结束任务后就可以继续正常的编译保存了
  • 廉价的家用工作站方案:ThinkPad 存储升级及数据迁移

    最近 给当台式服务器一样使用了两年的 ThinkPad 做了存储升级和数据迁移 对硬盘也做了额外的散热处理 本篇文章里 我们分享下相关的经验和思考 希望能够帮助到有同样诉求的你 写在前面 本文的 主角 是一台 7x24 小时使用了两年的 T
  • 【基础篇】关于专栏介绍及ESP32环境搭建(vs code)

    前言 本专栏将会从零到实战的学习ESP32开发 将会持续更新 其中大概包括基础篇 实战篇和提高篇以及一些常见的错误如何解决 一 ESP32介绍 ESP32是 Espressif 开发的一系列低成本 低功耗的片上系统 SoC 微控制器 包括
  • matlab练习程序(模拟退火SA)

    模拟退火首先从某个初始候选解开始 当温度大于0时执行循环 在循环中 通过随机扰动产生一个新的解 然后求得新解和原解之间的能量差 如果差小于0 则采用新解作为当前解 如果差大于0 则采用一个当前温度与能量差成比例的概率来选择是否接受新解 温度