模拟退火算法应用——求解TSP问题

仅作自己学习使用


一、问题

        旅行商问题(TSP) 是要求从一个城市出发,依次访问研究区所有的城市,并且只访问一次不能走回头路,最后回到起点,求一个使得总的周游路径最短的城市访问顺序。
       采用模拟退火算法求解TSP问题,很自然的想到退火的目标函数(优化函数)应该就是总的周游距离。那么在算法中如何体现呢?那就是把城市的坐标放在一个n×2的矩阵中,矩阵中存放城市的顺序就是依次周游城市的路径,所以在求解过程中会不断的产生新的更优解(周游顺序,在算法中体现就是城市坐标的存放顺序),有了这个关键的思路就很好解决了。

二、Matlab代码

clear
clc
T1 = cputime;
C = [% 各个城市坐标39.91, 116.39;   % 北京31.22, 121.48;   % 上海23.13, 113.27;   % 广州22.54, 114.06;   % 深圳30.67, 104.06;   % 成都34.27, 108.93;   % 西安31.98, 118.75;   % 南京39.92, 116.36;   % 天津28.71, 115.83;   % 南昌45.75, 126.63;   % 哈尔滨36.07, 120.38;   % 青岛38.04, 114.48;   % 石家庄29.59, 106.54;   % 重庆26.08, 119.30;   % 福州30.25, 120.16;   % 杭州28.19, 112.97;   % 长沙25.03, 102.73;   % 昆明35.68, 139.76;   % 东京37.56, 126.97;   % 首尔1.35, 103.82;    % 新加坡13.41, 103.86;   % 金边21.03, 105.85;   % 河内3.14, 101.69;    % 吉隆坡39.90, 32.85;    % 安卡拉37.97, 23.73;    % 雅典38.71, -9.14;    % 里斯本41.89, 12.50;    % 罗马52.52, 13.41;    % 柏林55.75, 37.62;    % 莫斯科48.86, 2.35;     % 巴黎
];n = length(C);  % 获取城市的个数
T = 100 * n;    % 初始温度
L = 10;         % 马尔可夫链长度
K = 0.986;      % 降温系数%%  构建城市坐标结构体
city = struct([]);
for i = 1:ncity(i).x = C(i,1);     % 经度city(i).y = C(i,2);     % 纬度
end%% 开始退火
% 统计迭代次数
count = 1;   
% 计算每次迭代后的总距离(第一次就是初始时,按照坐标的顺序计算的距离)
Dist(count) = GetDist(city,n); 
figure(1)
% 当温度无限趋于0度时停止迭代
while T > 0.01 % 每次降温 均进行多次迭代for i = 1:L% 计算原路线周游距离len1 = GetDist(city,n);% 产生随机扰动(随机交换两个城市的坐标)p1 = floor(1 + n * rand()); % rand函数产生一个0,1之间均匀分布的实数,包含0但不包含1p2 = floor(1 + n * rand()); % 因此这个表达式可以产生一个从1到n的随机数while (p1 == p2)p1 = floor(1 + n * rand()); p2 = floor(1 + n * rand());endtemp_city = city;% 交换第P1个城市和第P2个城市的坐标temp = temp_city(p1);temp_city(p1) = temp_city(p2);temp_city(p2) = temp;% 计算新路线的周游距离len2 = GetDist(temp_city,n);% 新、老路线的差值(相当于能量)delta = len2 - len1;if(delta<0)% 新路线的评估函数更小(记住,模拟退火算法相当于是一个求函数极小值的算法)city = temp_city;  % 更新原路线(变量里存放城市的顺序也就是访问城市的顺序)else% Metropolis接受准则(概率选择更差的解)if exp((len1-len2)/T) > rand()% 记住这个概率的公式,指数部分一定是要个负数,概率的值不可能超过1city = temp_city;endendend% 本次迭代结束,统计迭代次数加1count = count + 1; % 将本次迭代的最优解放在len中Dist(count) = GetDist(city,n); %% 本次退火结束,降温T = T * K;% 按照新的城市的顺序,把这些城市画出来for i = 1: n-1plot([city(i).x,city(i+1).x],[city(i).y,city(i+1).y],'bo-');hold on;endplot([city(n).x,city(1).x],[city(n).y,city(1).y],'ro-');title(['优化最短距离:', num2str(Dist(count))]);hold offpause(0.005); % 动态显示出每次的搜索结果
end
T2 = cputime;
figure(2)
plot(Dist,LineWidth=2)
xlabel("迭代次数")
ylabel("目标函数值")
title("适应度进化曲线","搜索时间:"+(T2-T1)+" s")
%% 评估函数
function result = GetDist(city,n)
% 计算总的周游路径长度(评估函数)
% city是各个城市的坐标result = 0;for i = 1:n-1result = result + sqrt((city(i).x - city(i+1).x)^2 + (city(i).y - city(i+1).y)^2);endresult = result + sqrt((city(n).x - city(1).x)^2 + (city(n).y - city(1).y)^2);
end

三、效果

周游图

适应度进化曲线

四、问题

        大家可以试一试更多的城市,当有很多城市的坐标相差不大时,在最后的搜索结果中,会出现一个非常奇怪的问题,就是在周游图中,有些城市消失了,检查存放城市的city结构体,是存放着这些坐标的,这里如果有知道的朋友还请多多批评指教,我将及时改正。

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

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

相关文章

接口测试【加密解密攻防完整版】实战教程详解

一、对称加密 对称加密算法是共享密钥加密算法&#xff0c;在加密解密过程中&#xff0c;使用的密钥只有一个。发送和接收双方事先都知道加密的密钥&#xff0c;均使用这个密钥对数据进行加密和解密。 数据加密&#xff1a;在对称加密算法中&#xff0c;数据发送方将明文 (原…

【JavaScript】3.3 JavaScript工具和库

文章目录 1. 包管理器2. 构建工具3. 测试框架4. JavaScript 库总结 在你的 JavaScript 开发之旅中&#xff0c;会遇到许多工具和库。这些工具和库可以帮助你更有效地编写和管理代码&#xff0c;提高工作效率。在本章节中&#xff0c;我们将探讨一些常见的 JavaScript 工具和库&…

linux安装minIo(亲测可用)

一、创建文件夹 进入opt文件夹 cd /opt/创建minio文件夹&#xff1b; mkdir minio赋予权限 chmod 777 minio/执行完后查看目录 进到minio文件夹 创建bin目录 mkdir bin创建data目录 mkdir data创建log touch minio.log创建start.sh文件&#xff0c;并写入数据(不会vi或…

微信公众号扫码授权登录源码 / PHP微信扫码关注公众号并授权登录源码

源码简介&#xff1a; 在当今的互联网时代&#xff0c;微信公众号已成为众多企业与用户之间进行交流和沟通的重要工具&#xff0c;其中包括用户的登录认证。通过关注公众号登录&#xff0c;不仅可以为公众号带来流量&#xff0c;还能够实现用户与公众号粉丝之间的一一对应关系…

数据治理模型的三个模块

数据接入模块 大数据工程的数据来源包含企业内部数据和企业外部数据&#xff0c;其中企业内部数据由资源服务平台、综合资源库、各业务系统生产库中的结构化数据和文件服务器上的文本、图片等非结构化数据组成&#xff0c;其中包括人财物记录、财物报表、原材料、顾客信息、气…

【SpringBoot篇】登录校验 — JWT令牌

文章目录 &#x1f339;简述JWT令牌⭐JWT特点 &#x1f33a;JWT使用流程&#x1f6f8;JWT令牌代码实现&#x1f354;JWT应用 &#x1f339;简述JWT令牌 JWT全称为JSON Web Token&#xff0c;是一种用于身份验证的开放标准。它是一个基于JSON格式的安全令牌&#xff0c;主要用于…

跨越威胁的传说:揭秘Web安全的七大恶魔

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

CVE-2022-4886 ingress命令注入复现与分析

安装 安装ingress-nginx wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.4/deploy/static/provider/cloud/deploy.yamlk apply -f deploy.yaml 原理 nginx.ingress.kubernetes.io/rewrite-target标签会在nginx配置进行插入字符串&#…

Linux - 动静态库(下篇)

前言 在上篇博客当中&#xff0c;对静态库是什么&#xff0c;怎么使用&#xff0c;简单实现自己的静态库&#xff0c;这些做了描述&#xff0c;具体请看上篇博客&#xff1a; 本篇博客将会对 动态库是什么&#xff0c;怎么使用&#xff0c;简单实现自己的动态库&#xff0c…

ESP32-Web-Server 实战编程-使用文件系统建立强大的 web 系统

ESP32-Web-Server 实战编程-使用文件系统建立强大的 web 系统 概述 在前述章节我们讲述了在网页端控制多个 GPIO 的案例。当程序开始变得复杂&#xff0c;让一些功能“自动起来”是一个好的选择。 在前面的示例中&#xff0c;我们需要在后端为每个前端代码的 URL 指定一个对…

Matplotlib直方图的创建_Python数据分析与可视化

Matplotlib直方图的创建 概念区分绘制直方图 概念区分 什么是直方图&#xff1f; 直方图&#xff08;Histogram&#xff09;又称质量分布图&#xff0c;是统计报告图的一种&#xff0c;由一系列高度不等的纵向条纹或线段表示数据分布的情况&#xff0c;一般用横轴表示数据所属…

解锁文件安全新境界!迅软DSE带您领略数据加密的魅力!

随着信息技术的不断发展&#xff0c;企业数据信息的安全与保护受到愈发广泛的关注。而文件加密软件得益于其强大的系统功能能够有效地保护企业重要数据的隐私和安全&#xff0c;成为越来越多企事业单位在进行内部数据安全防护工作时的优选。 一、文件加密软件的作用 文件加密软…

国产数据库

当今世界&#xff0c;数据已成为重要的生产要素&#xff0c;数据库管理系统更是广泛应用于信息化行业各领域&#xff0c;国内数据库产业能否健康可持续的发展&#xff0c;在很大程度上影响着国民经济发展和网络空间安全。 当前&#xff0c;国产数据库行业竞争非常激烈&#xf…

HCIE 01:基于前缀列表的BGP ORF功能

当运行BGP协议的某台设备上&#xff0c;针对入方向配置了基于ip-prefix的路由过滤&#xff0c;过滤了邻居发送的路由&#xff1b; 目前想&#xff0c;通过在peer关系的两端设备上都配置ORF功能&#xff0c;实现路由发送端只能送路由接收端过滤后的路由&#xff1b; ORF功能的说…

Leetcode—1670.设计前中后队列【中等】

2023每日刷题&#xff08;四十三&#xff09; Leetcode—1670.设计前中后队列 实现代码 erase(iterator position)在删除vector中的元素后&#xff0c;会将该元素的后面所有元素都往前挪一位。因此&#xff0c;原先的迭代器指向的元素就不是原来那个了&#xff0c;而是它的后…

2023年05月 Scratch图形化(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共10题,每题3分,共30分) 第1题 下列积木运行后的结果是?( )(说明:逗号后面无空格) A:我 B:爱 C:中 D:国 答案:B 两个字符串连接后的第8个字符是“爱”。 第2题 接鸡蛋游戏中,天空掉下来有鸡蛋、石…

Flink Flink中的合流

一、Flink中的基本合流操作 在实际应用中&#xff0c;我们经常会遇到来源不同的多条流&#xff0c;需要将它们的数据进行联合处理。所以 Flink 中合流的操作会更加普遍&#xff0c;对应的 API 也更加丰富。 二、联合&#xff08;Union&#xff09; 最简单的合流操作&#xf…

开源免费跨平台数据同步工具-Syncthing

Syncthing是一款开源免费跨平台的文件同步工具&#xff0c;是基于P2P技术实现设备间的文件同步&#xff0c;所以它的同步是去中心化的&#xff0c;即你并不需要一个服务器&#xff0c;故不需要担心这个中心的服务器给你带来的种种限制&#xff0c;而且类似于torrent协议&#x…

卡码网语言基础课 | 16. 出现频率最高的字母

目录 一、 哈希表 二、 编写解题 2.1 统计出现次数 2.2 解答 通过本次练习&#xff0c;将学习到C中哈希表的基础知识 题目&#xff1a; 给定一个只包含小写字母的字符串&#xff0c;统计字符串中每个字母出现的频率&#xff0c;并找出出现频率最高的字母&#xff0c;如果…

比尔盖茨:GPT-5不会比GPT-4好多少,生成式AI已达到极限

比尔盖茨一句爆料&#xff0c;成为机器学习社区热议焦点&#xff1a; “GPT-5不会比GPT-4好多少。” 虽然他已不再正式参与微软的日常运营&#xff0c;但仍在担任顾问&#xff0c;并且熟悉OpenAI领导团队的想法。 消息来自德国《商报》&#xff08;Handelsblatt&#xff09;对…