模拟退火算法MATLAB实现

介绍

 算法试图随着控制参数T的降低,使目标函 数值f(内能E)也逐渐降低,直至趋于全局最 小值(退火中低温时的最低能量状态),算法 工作过程就像固体退火过程一样。

Metropolis准则——–以概率接受新状态

若在温度T,当前状态i (解1)→ 新状态 j(解2)

若E_j(目标函数f_2)<E_i(f_1),则接受 j 为当前状态;

若E_j>E_i ,概率P=e^−E_j−E_i/KT大于[0,1)区间的 随机数,则仍接受状态 j 为当前状态; 若不成立,则保留状态 I 为当前状态。

算法其他参数的说明

退火过程由一组初始参数,即冷却进度表控制,它的核心是尽量使系统达到准平衡,以使算法在有限的时间内逼近最优解。冷却进度表包括:

1.控制参数的初值T_0:冷却开始的温度;
2.控制参数T的衰减函数:要将连续的降温过程,离散成降温过程中的一系列温度点,衰减函数即计算这一系列温度的表达式;
3. 控制参数T的终值T_f(停止准则);
4. Markov链的长度L_k:任意温度T的迭代次数。

算法基本步骤

1、令T=T_0,随机生成一个初始解x_0,并计算相应的
      目标函数值E(x_0);
2、令T等于冷却进度表中的下一个值T_i ;
3、根据当前解x_i进行扰动,产生一个新解x_j ,计相应
      的目标函数值E(x_j) ,得到 ∆e= E(x_j)−E(x_i);
4、 ∆e<0,则新解x_j被接受,作为新的当前解;
       ∆e>0,则新解x_j按概率P接受;
5、在温度T_i下,重复L_k次的扰动和接受过程,即执行
      步骤(3)、(4);
6、判断T是否已达到T_f,是,则终止算法;否则转到
   (2)继续执行 

几点说明 

1、新解的产生    

  要求尽可能地遍及解空间的各个区域,这样,在某一 恒定温度下,不断产生新解时,就可能跳出局部最优解。

2、收敛的一般条件:

  • 初始温度足够高;
  • 热平衡时间足够长;
  • 终止温度足够低;
  • 降温过程足够缓慢;  

 举例

算法的MATLAB实现旅行商问题

模型:一名商人要到n 个不同的城市去推销商品,每2 个城市I 和j 之间的距离为d,如何选择一条路径使得商人每个城市走一遍后回到起点所走的路径最短。

例:有52座城市,已知每座城市的坐标,求每 个城市走一遍后回到起点,所走的路径最短。

 一、算法设计步骤

2.新解的产生(扰动)

(1)二变换法:任选序号u,v (设u<v<n),交换u,v之间 的访问顺序。

(2)三变换法:任选序号u,v,w (设u≤v<w), 将u,v之间 的路径插到w之后访问 

while t>=tf
 for r=1:Markov_length  
        if (rand < 0.5) 
     %随机产生0~1的数,若小于0.5,则二变换
            ind1 = 0; ind2 = 0;
            while (ind1 == ind2)
                ind1 = ceil(rand.*amount);
                ind2 = ceil(rand.*amount);
            end
            tmp1 = sol_new(ind1);
            sol_new(ind1) = sol_new(ind2);
            sol_new(ind2) = tmp1;
else    
          %否则,三变换
            ind1 = 0; ind2 = 0; ind3 = 0;
            while (ind1 == ind2) || (ind1 == ind3) ...
                 || (ind2 == ind3) || (abs(ind1-ind2) == 1)
                ind1 = ceil(rand.*amount);
                ind2 = ceil(rand.*amount);
                ind3 = ceil(rand.*amount);
            end
            tmp1 = ind1;tmp2 = ind2;tmp3 = ind3;
            
 if (ind1 < ind2) && (ind2 < ind3)
            elseif (ind1 < ind3) && (ind3 < ind2)
                ind2 = tmp3;ind3 = tmp2;
            elseif (ind2 < ind1) && (ind1 < ind3)
                ind1 = tmp2;ind2 = tmp1;
            elseif (ind2 < ind3) && (ind3 < ind1)
                ind1 = tmp2;ind2 = tmp3; ind3 = tmp1;
            elseif (ind3 < ind1) && (ind1 < ind2)
                ind1 = tmp3;ind2 = tmp1; ind3 = tmp2;
            elseif (ind3 < ind2) && (ind2 < ind1)
                ind1 = tmp3;ind2 = tmp2; ind3 = tmp1;
            end      % ind1 < ind2 < ind3

            tmplist1 = sol_new((ind1+1):(ind2-1));  %u、v之间的城市
            sol_new((ind1+1):(ind1+ind3-ind2+1)) = ...
                sol_new((ind2):(ind3));   %将v到w的城市移到u后面
            sol_new((ind1+ind3-ind2+2):ind3) = ...
                tmplist1;     %u、v之间的城市移到w后面
        end

3.目标函数

访问所有城市的路径总长度:

模拟退火算法求出目标函数的最小值 

 % 计算目标函数即内能
        E_new = 0;
        for i = 1 : (amount-1)
            E_new = E_new + ...
                dist_matrix(sol_new(i),sol_new(i+1));
        end
        %从第一个城市到最后一个城市的距离
        E_new = E_new + ...
            dist_matrix(sol_new(amount),sol_new(1));

 

if E_new < E_current
            E_current = E_new;
            sol_current = sol_new;
            if E_new < E_best
                % 冷却过程中最好的解保存下来´
                E_best = E_new;
                sol_best = sol_new;
            end
        else
            % 若新解的目标函数大于当前解的,
               % 则以一定的概率接受新解
            if rand < exp(-(E_new-E_current)./t)
                E_current = E_new;
                sol_current = sol_new;
            else
                sol_new = sol_current;
            end
        end

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

有什么价格实惠的猫罐头?2023良心性价比的猫罐头推荐!

选购猫罐头至关重要&#xff0c;好的猫罐头不仅营养丰富&#xff0c;水分充足&#xff0c;适口性佳&#xff0c;还能易于消化吸收。然而&#xff0c;若选择不当&#xff0c;可能不仅无法达到预期效果&#xff0c;甚至可能产生负面影响。 作为一个从事宠物行业7年的宠物店店长&…

upload-labs关卡4(黑名单点空格绕过或htaccess绕过)通关思路

文章目录 前言一、回顾上一关知识点二、靶场第四关方法一通关思路1.看源码2、点空格绕过 三、靶场第四关方法二通关思路1、htaccess文件是什么2、通过上传htaccess文件进行绕过1、使用前提2、上传htaccess文件&#xff0c;然后再上传phpinfo的jpg文件 总结 前言 此文章只用于学…

阶段七-Day04-Spring03

一、Sping声明式事务 1. 编程式事务介绍 整个事务控制的代码都需要程序员自己编写。包含&#xff1a;开启事务&#xff08;openSession()&#xff0c;创建SqlSession时MyBatis底层自动创建Transaction对象&#xff09;、提交事务(session.commit())、回滚事务(session.rollba…

Shotcut for Mac/Win:免费的开源视频编辑软件

Shotcut 是一款免费的开源视频编辑软件&#xff0c;允许用户为各种目的编辑和创建视频。它适用于 Windows、Mac 和 Linux 操作系统。Shotcut 具有用户友好的界面&#xff0c;并提供一系列功能&#xff0c;例如支持多种视频格式、音频过滤器和视频效果。 Shotcut的一些主要功能…

C++拷贝构造函数和运算符重载

目录 一&#xff0c;拷贝构造函数 二&#xff0c;运算符重载 一&#xff0c;拷贝构造函数 概念&#xff1a;在类的定义中&#xff0c;构造函数只是单纯将内置类型进行初始化&#xff0c;而拷贝构造函数是将整个类进行拷贝到另一个类中进行初始化。在定义拷贝构造函数时&…

bclinux aarch64 ceph 14.2.10 文件存储 Ceph File System, 需要部署mds: ceph-deploy mds

创建池 [rootceph-0 ~]# ceph osd pool create cephfs_data 64 pool cephfs_data created [rootceph-0 ~]# ceph osd pool create cephfs_metadata 32 pool cephfs_metadata created cephfs_metadata 64 报错 官方说明&#xff1a; 元数据池通常最多可容纳几 GB 的数据。为…

Web后端开发_01

Web后端开发 请求响应 SpringBoot提供了一个非常核心的Servlet 》DispatcherServlet&#xff0c;DispatcherServlet实现了servlet中规范的接口 请求响应&#xff1a; 请求&#xff08;HttpServletRequest&#xff09;&#xff1a;获取请求数据响应&#xff08;HttpServletRe…

正点原子嵌入式linux驱动开发——Linux DAC驱动

上一篇笔记中学习了ADC驱动&#xff0c;STM32MP157 也有DAC外设&#xff0c;DAC也使用的IIO驱动框架。本章就来学习一下如下在Linux下使用STM32MP157上的DAC。 DAC简介 ADC是模数转换器&#xff0c;负责将外界的模拟信号转换为数字信号。DAC刚好相反&#xff0c;是数模转换器…

MS512非接触式读卡器 IC

MS512 是一款应用于 13.56MHz 非接触式通信中的高集 成度读写卡芯片。它利用了先进的调制和解调技术&#xff0c;完全集 成了在 13.56MHz 下的各种非接触式通信方式和协议。 主要特点  高度集成的解调和解码模拟电路  采用少量外部器件&#xff0c;即可将输出驱动级接…

# Spring事务与分布式事务

一、事务的具体定义 事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元&#xff0c;组成事务的所有操作只有在所有操作均能正常执行的情况下方能提交&#xff0c;只要其中任一操作执行失败&#xff08;出现异常&#xff09;&#xff0c;都将导致整个事务…

联想笔记本Fn + A可以全选,Ctrl失效

问题&#xff1a;联想笔记本Fn A可以全选&#xff0c;ctrl失效。 原因&#xff1a;BIOS启用了Fn键和Ctrl键互换。 解决操作&#xff1a; 1.开机时一直按F2&#xff0c;进入BIOS 2.点击More Settings > 2.选取Configuration 3.将Fool Proof Fn Ctrl 设定变更为Disabled 4.按…

【Linux】进程概念IV 进程地址空间

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法…感兴趣就关注我吧&#xff01;你定不会失望。 本篇导航 0. 数据在内存中的分布1. 虚拟地址与真实物理地址2. 进程地址空间2.1 进程地址空间概念2.2 进程->页表->内存 0. 数据在内…

MASK、MPSK、MFSK信号的调制与解调+星座图

MASK、MPSK、MFSK信号的调制与解调星座图 本文主要涉及多进制幅度键控&#xff08;MASK&#xff09;、多进制相移键控&#xff08;MPSK&#xff09;、多进频移键控&#xff08;MFSK&#xff09;的调制与解调&#xff0c;同时涉及到星座图的分析。 关于通信原理还有其他文章可参…

【SpringBoot整合JSP】

【源码】SpringBoot整合JSP 一、前言二、创建web项目,webapp 【创建视图层】&#xff08;一&#xff09;在 main 目录下相关目录1. 点击 “FIle”-> “Project Structure”&#xff0c;选择 “Model”-> “Web”&#xff0c;将“Web Resource Directory”的路径修改为 刚…

JOSEF约瑟 反时限过流继电器JGL-115板前接线5A速断保护

系列型号 JGL-111反时限过流继电器&#xff1b;JGL-112反时限过流继电器&#xff1b; JGL-113反时限过流继电器&#xff1b;JGL-114反时限过流继电器&#xff1b; JGL-115反时限过流继电器&#xff1b;JGL-116反时限过流继电器&#xff1b; JGL-117反时限过流继电器&#xff1b…

Python数据大杀器:掌握collections与heapq,编写更高效的算法与数据处理

前言 在计算机科学的世界中&#xff0c;数据结构是构建强大和高效算法的基石。Python作为一门广泛应用的编程语言&#xff0c;以其丰富的数据结构模块为程序员提供了强大的工具。本文旨在深入研究Python的collections和heapq模块&#xff0c;通过更丰富的示例和详细的解释&…

竞赛 题目:基于FP-Growth的新闻挖掘算法系统的设计与实现

文章目录 0 前言1 项目背景2 算法架构3 FP-Growth算法原理3.1 FP树3.2 算法过程3.3 算法实现3.3.1 构建FP树 3.4 从FP树中挖掘频繁项集 4 系统设计展示5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于FP-Growth的新闻挖掘算法系统的设计与实现…

JavaScript 基本数据类型

字符串 在JS中&#xff0c;数据类型有&#xff1a;字符串、数字、布尔、数组、对象、Null、Undefined 用到最多的还是字符串和数组的转换。 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>首页</title><style&g…

Rust语言做数据抓取代码示例

这个任务需要使用到Rust语言和网络爬虫相关的库&#xff0c;以下是一个简单的示例代码。请注意&#xff0c;由于涉及到的具体问题和数据的复杂性&#xff0c;这个示例可能并不能直接满足你的需求&#xff0c;需要根据你的具体情况进行修改和扩展。 use reqwest; use serde::{De…

Splashtop 如何维护 GDPR 合规性

2018年&#xff0c;欧盟颁布了一项新法律&#xff0c;以保护欧洲公民的个人数据免遭任何收集数据的人不当处理。这可能意味着企业和组织&#xff0c;包括面对面和虚拟形式。这项开创性的法律为其他立法铺平了道路&#xff0c;例如加利福尼亚州的《加州消费者隐私法》&#xff0…