基于差分、粒子群算法下的TSP优化对比

TSP问题,即旅行商问题(Traveling Salesman Problem),是数学领域中的一个著名问题。以下是对TSP问题的详细解释:

一、问题定义

假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求所选的路径路程为所有路径中的最小值。

 二、问题分类

TSP问题可大致分为对称TSP问题和非对称TSP问题。所谓对称指的是在模型中,城市u到城市v的距离与城市v到城市u的距离是一样的,其在图中的体现就是对称TSP问题的输入一般是无向图。而非对称TSP问题的输入往往是有向图。

三、求解方法

1. **暴力枚举**:通过穷举所有可能的路径来找到最短路径,但这种方法的时间复杂度极高,当城市数量较多时,计算量会呈指数级增长,因此在实际应用中并不可行。


2. **动态规划**:动态规划是解决TSP问题的一种有效方法。它通过将问题分解为更小的子问题,并存储子问题的解来避免重复计算。具体来说,可以定义一个状态dp[S][v],表示从顶点v出发,访问集合S中的所有顶点(不包括v),并最终回到起点的最短路径长度。通过逐步扩展已访问的顶点集合S,可以计算出dp[S][v]的值,并最终找到最短路径。动态规划方法的时间复杂度仍然较高,但相对于暴力枚举已经有了显著的降低。


3. **近似算法**:由于TSP问题是NP-hard的,不存在多项式时间的精确算法。因此,研究人员开始研究TSP问题的近似算法。在度量空间(即满足三角不等式的空间)下,存在多种近似算法,如Christofides算法、k-opt算法和Lin–Kernighan算法等。这些算法可以在较短的时间内找到一个近似最优解,虽然其解的质量可能略逊于精确算法,但在实际应用中通常已经足够好。

 四、实际应用

TSP问题在多个领域都有广泛的应用,如物流配送、电路设计、基因测序等。在这些领域中,需要找到一条最短路径或最优路径来优化成本或提高效率。

五、具体实现

这里将介绍采用差分进化算法、粒子群算法进行处理TSP问题。

主要从计算距离和适应度函数优化来寻找最优的距离。

(一)差分进化算法(改进)

下面是差分进化算法处理优化过程:

%% 改进的差分进化算法
function [pop] = DE1(NP,D,pop,F0,CR,DM,G,Tmax,best,Xbest)for i=1:NPr1=1;r2=1;r3=1;%使得个体满足变异条件.此处与Java有点不一样,他是从1开始while(r1==r2||r1==r3||r2==r3||r1==i||r2==i||r3==i)r1=ceil(NP*rand(1));          %保持其中的r1,r2,r3互异,这样做的目的是为了防止种群的单一性r2=ceil(NP*rand(1));r3=ceil(NP*rand(1));end%% 变异操作for j=1:Dif G<=(Tmax/2)v(i,j)=pop(r1,j)+F0*(pop(r2,j)-pop(r3,j));elseif G>(Tmax/2)v(i,j)=pop(i,j)+F0*(pop(best,j)-pop(i,j))+F0*(pop(r1,j)-pop(r2,j));endend%% 交叉Z=randi([1,D],1,1);r=rand;for j = 1:D if (r<=CR) || (j==Z)u(i,j)=v(i,j);elseu(i,j)=pop(i,j);endend%% 选择if PathLength(DM,u(i,:))<PathLength(DM,pop(i,:))pop(i,:)=u(i,:);endendfor i=1:NPif PathLength(DM,Xbest)>PathLength(DM,pop(i,:))Xbest=pop(i,:);best=i;endend
end

(二)粒子群算法(传统)

%% 粒子群算法
%------给定初始化条件----------------------------------------------
% c1学习因子1------c1,c2的取值通常在2左右
% c2学习因子2
% w惯性权重--------通常取[0,1]
% M最大迭代次数-----迭代次数根据自己的需要进行设定
% D搜索空间维数(未知数个数)-----
% N初始化群体个体数目---------通常来说对于种群数和个体数之间的关系并没有准确的一个比例,通常来说设置为N=[5D,10D],如果种群和个体数相差太多会影响收敛性function y =PSO(NP,pop,DM,p,pg,v,y)    %创建粒子群算法函数,可以直接调用%% 初始化参数c1=1.5;c2=2.5;w=0.5;%% 更新种群for i=1:NP     %更新速度、位移v(i,:)=w*v(i,:)+c1*rand*(y(i,:)-pop(i,:))+c2*rand*(pg-pop(i,:));pop(i,:)=pop(i,:)+v(i,:);     %更新之后的点if  PathLength(DM,pop(i,:))< p(i)      %使用选择函数p(i)= PathLength(DM,pop(i,:));y(i,:)=pop(i,:);%更新个体极值endif p(i)< PathLength(DM,pg)           %选择保存最优值pg=y(i,:);endend
end

这其中涉及到最重要的处理过程就是PathLength函数,具体如下:

%% 计算各个体的路径长度
% 输入:
% D     两两城市之间的距离
% Chrom 个体的轨迹
function len=PathLength(D,Chrom)
[~,Chrom]=sort(Chrom,2,'ascend');
[~,col]=size(D);
NIND=size(Chrom,1);
len=zeros(NIND,1);
for i=1:NINDp=[Chrom(i,:) Chrom(i,1)];i1=p(1:end-1);i2=p(2:end);len(i,1)=sum(D((i1-1)*col+i2));
end

为了更好的对比算法之间的优势,将其进行封装对比,具体如下:

%% 差分进化算法解决TSP问题,用最短的距离走完所有的城市
clc
clear
close all
%% 初始化参数
F0=0.8;     %变异因子
CR=0.2;     %交叉概率
yita=0.99;   %退火控制参数
T=0.01;       %初始模拟温度
MaxGens=2000;%迭代次数
x_high=500;%上界
x_low=-500;%下界
%% 数据集1
% X =[16.47,96.10
%     16.47,94.44
%     20.09,92.54
%     22.39,93.37
%     25.23,97.24
%     22.00,96.05
%     20.47,97.02
%     17.20,96.29
%     16.30,97.38
%     14.05,98.12
%     16.53,97.38
%     21.52,95.59
%     19.41,97.13
%     20.09,92.55];%% 数据集2
X = [1304 2312;3639 1315;4177 2244;3712 1399;3488 1535;3326 1556;...3238 1229;4196 1044;4312 790;4386 570;3007 1970;2562 1756;...2788 1491;2381 1676;1332 695;3715 1678;3918 2179;4061 2370;...3780 2212;3676 2578;4029 2838;4263 2931;3429 1908;3507 2376;...3394 2643;3439 3201;2935 3240;3140 3550;2545 2357;2778 2826;...2370 2975]; %31 个省会城市坐标
DM=Distanse(X);%距离计算
D=length(X);%数据集的维度
NP=8*D;%种群数
%% 初始化种群
pop=rand(NP,D)*(x_high-x_low)+x_low; 
pop1=rand(NP,D)*(x_high-x_low)+x_low;
pop2=rand(NP,D)*(x_high-x_low)+x_low; 
%% 适应度值
fit=PathLength(DM,pop);
fit1=PathLength(DM,pop1);
fit2=PathLength(DM,pop2);
%% 初次迭代值
trace(1)=min(fit);
trace1(1)=min(fit1);
trace2(1)=min(fit2);%%  计算各个粒子的适应度,并初始化Pi和Pg(粒子群算法)
v=rand(NP,D)*(x_high-x_low)+x_low;
for i=1:NPp(i)=PathLength(DM,pop2(i,:));  %计算初始粒子的适应度值y(i,:)=pop2(i,:);         %个体极值中的变量值等于粒子的初始值---为了后期进行保存全局最优值
end
pg=pop2(NP,:);           %Pg为全局最优值---将初始位置的最后一列元素赋给全局最优值---目的在于保存全局最优值
for i=1:(NP-1)if PathLength(DM,pop2(i,:)) <PathLength(DM,pg)   pg=pop2(i,:);          %更新全局最优值,保存最优值end
end%% 差分进化(DE1)最好个体求解
Xbest=pop1(1,:);
for i=2:NPif PathLength(DM,Xbest)>PathLength(DM,pop1(i,:))Xbest=pop1(i,:);best=i;end
end
%% 主程序
for gen=1:MaxGens%% 传统差分进化算法pop = DE(NP,D,pop,F0,CR,DM);%% 改进变异算子改进的差分进化算法(DE1)[pop1] = DE1(NP,D,pop1,F0,CR,DM,gen,MaxGens,best,Xbest);%pop1 = Metr_DE(NP,D,pop1,F0,CR,DM,yita,T);%% 粒子群算法pop2 = PSO(NP,pop2,DM,p,pg,v,y);%% 寻找出最优路径fit=PathLength(DM,pop);fit1=PathLength(DM,pop1);fit2=PathLength(DM,pop2);[trace(gen+1),d]=min(fit);[trace1(gen+1),d]=min(fit1);[trace2(gen+1),d]=min(fit2);tt=min(fit);tt1=min(fit1);tt2=min(fit2);
end%% 可视化
disp(['传统差分下的最优距离:', num2str(tt)]);
disp(['改进变异算子的差分下的最优距离:', num2str(tt1)]);
disp(['粒子群下的最优距离:', num2str(tt2)]);
figure(1)
[~,pop(d,:)]=sort(pop(d,:),2,'ascend');
DrawPath(X,pop(d,:))
title('传统差分进化算法优化TSP的最优路径')figure(2)
[~,pop1(d,:)]=sort(pop1(d,:),2,'ascend');
DrawPath(X,pop1(d,:))
title('改进变异算子的差分进化优化TSP的最优路径')figure(3)
[~,pop2(d,:)]=sort(pop2(d,:),2,'ascend');
DrawPath(X,pop2(d,:))
title('粒子群算法优化TSP的最优路径')figure(4);
plot(trace,'b-','linewidth',2);
hold on
plot(trace1,'r--','linewidth',2);
hold on
plot(trace2,'g--','linewidth',2);
title('各算法TSP最优化距离对比');
xlabel('迭代次数'); 
ylabel('最优距离');
legend('传统差分进化','改进变异算子的差分进化','粒子群算法');

从上可以看出,经过改进的差分进化算法有着明显的效果!

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

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

相关文章

17.100ASK_T113-PRO 配置QT运行环境(三)

前言 1.打开QT,新建项目. 做成以下效果,会QT都没有问题吧 编译输出: /home/book/LED_and_TempHumi/build-LED_and_TempHumi-100ask-Debug LED_and_TempHumi 2.下载程序与测试 设置运行环境 export QT_QPA_PLATFORMlinuxfb 这个地方还需要加字体,不然不会显示字体.

智慧社区平台系统提升物业管理效率与居民生活质量

内容概要 智慧社区平台系统是为应对现代城市管理挑战而诞生的重要工具。随着城市化进程的加快&#xff0c;传统的物业管理方式已经难以满足日益增长的居民需求和管理复杂性。因此&#xff0c;引入智能化管理手段显得尤为重要。这个系统不仅仅是一个简单的软件&#xff0c;它是…

远程jupyter lab的配置

打开虚拟环境 conda activate test 在环境下安装ipykernel软件包&#xff0c;这个软件包允许jupyter notebookl使用特定环境的python版本。 conda install ipykernel 将该环境添加到Jupyter Notebook中 python -m ipykernel install --user --nametest --display-name&quo…

python+Django+MySQL+echarts+bootstrap制作的教学质量评价系统,包括学生、老师、管理员三种角色

项目介绍 该教学质量评价系统基于Python、Django、MySQL、ECharts和Bootstrap技术&#xff0c;旨在为学校或教育机构提供一个全面的教学质量评估平台。系统主要包括三种角色&#xff1a;学生、老师和管理员&#xff0c;每个角色有不同的功能权限。 学生角色&#xff1a;学生可…

找不到vcruntime140.dll怎么办,彻底解决vcruntime140.dll丢失的5种方法

当计算机系统中无法找到vcruntime140.dll这个特定的动态链接库文件时&#xff0c;可能会引发一系列运行问题&#xff0c;具体表现形式多样且影响范围较广。对于依赖于该文件运行的各类软件应用来说&#xff0c;缺失vcruntime140.dll将直接导致程序无法正常启动或执行&#xff0…

设计模式-Adapter(适配器模式)GO语言版本

前言 个人感觉Adapter模式核心就在于接口之间的转换。将已有的一些接口转换成其他接口形式。并且一般用于对象上&#xff0c;而不是系统上 问题 就用一个简单的问题&#xff0c;懂数据结构的同学可能知道双端队列。那么就用双端队列实现一个栈&#xff08;stack&#xff09;或…

表格的选择弹窗,选中后返显到表格中

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 表格的下拉框可以直接显示选项&#xff0c;那如果选择框不是下拉的&#xff0c;而是弹窗&#xff0c;那么在表格中如何返显呢&#xff1f; 问题描述 如上图所示&#xff0c;点击表格中的选择&#xf…

4.STM32之通信接口《精讲》之USART通信---实验串口发送程序

本节将进行实战&#xff0c;基础了解请查看第1&#xff0c;2&#xff0c;3节&#xff08;Whappy&#xff09; 开始背&#xff01;&#xff01; USART ---》全双工 异步/同步 点对点 C语言基础printf用法&#xff0c;这节将用到printf的重定向&#xff0c;来打印到串口助手上…

搭建MC服务器

局域网中玩MC&#xff0c;直接自己创建房间开启局域网就可以了。如果想开一个24小时不关机的服务器呢&#xff1f;其实最开始我是想在windows云服务器&#xff0c;图形化界面运行一个开启局域网即可。可能是云服务器上没有显卡&#xff0c;还是其他什么原因&#xff0c;游戏打开…

css 使用图片作为元素边框

先看原始图片 再看效果 边框的四个角灭有拉伸变形,但是图片的中部是拉伸的 代码 border-style: solid;/* 设置边框图像的来源 */border-image-source: url(/static/images/mmwz/index/bk_hd3x.png);/* 设置如何切割图像 */border-image-slice: 66;/* 设置边框的宽度 */border…

通用定时器---输出比较功能

目录 一、概念 二、输出比较的8种模式 三、输出比较输出PWM波形的基本结构 配置步骤 四、示例代码 一、概念 OC&#xff08;OutPut Compare&#xff09;输出比较。输出比较可以通过比较CNT与CCR寄存器的关系&#xff0c;来对输出电平进行置1/置0/翻转的操作&#xff0c;可…

【网页设计】CSS3 进阶(动画篇)

1. CSS3 2D 转换 转换&#xff08;transform&#xff09;是CSS3中具有颠覆性的特征之一&#xff0c;可以实现元素的位移、旋转、缩放等效果 转换&#xff08;transform&#xff09;你可以简单理解为变形 移动&#xff1a;translate旋转&#xff1a;rotate缩放&#xf…

探索 HTML 和 CSS 实现的 3D旋转相册

效果演示 这段HTML与CSS代码创建了一个包含10张卡片的3D旋转效果&#xff0c;每张卡片都有自己的边框颜色和图片。通过CSS的3D变换和动画&#xff0c;实现了一个动态的旋转展示效果 HTML <div class"wrapper"><div class"inner" style"-…

WTV芯片在智能电子锁语音留言上的应用方案解析

一、概述 电子锁的留言功能允许用户通过语音或文字方式给其他家庭成员留下信息。这项功能可以增强家庭成员之间的沟通&#xff0c;特别是在忙碌的家庭生活中提供便利。 WTV是一款功能强大的高品质语音芯片&#xff0c;采用了高性能32位处理器、最高频率可达120MHz。具有低成本、…

Ajax的相关内容

一、Ajax的使用步骤 1.创建XML对象 const xhrnew XMLHttpRequest(); 2.监听事件&#xff0c;处理响应 3.准备发送请求 true表示异步 ajax中永远是异步&#xff0c;永远是true 4.发送请求 二、GET和POST请求 三、JSON的三种形式 四、JSON的方法 五、跨域 六、XHR的属性和方法…

群控系统服务端开发模式-应用开发-前端级别功能开发

一、添加视图 在根目录下src文件夹下views文件夹下param文件夹下grade文件夹下&#xff0c;新建index.vue&#xff0c;代码如下 <template><div class"app-container"><div class"filter-container" style"float:left;"><…

【含开题报告+文档+PPT+源码】基于springboot的教师评价系统的设计与实现

开题报告 随着信息技术的迅猛发展&#xff0c;教育信息化已成为现代教育的必然趋势。教研室作为高校教学管理的重要机构&#xff0c;肩负着提升教学质量、推动教学改革的重要使命。然而&#xff0c;传统的教学管理方式往往存在效率低下、数据分散、管理不便等问题&#xff0c;…

Nginx 使用入门介绍

大家好&#xff0c;我是G探险者&#xff01; 今天聊一聊nginx. Nginx 是一款高性能的 Web 服务器、反向代理服务器以及负载均衡器。它因其轻量级、稳定性和高并发处理能力&#xff0c;在全球范围内得到了广泛应用。许多大型网站&#xff08;如 Netflix、Dropbox 和 WordPress…

Elasticsearch 重建索引 数据迁移

Elasticsearch 重建索引 数据迁移 处理流程创建临时索引数据迁移重建索引写在最后 大家都知道&#xff0c;es的索引创建完成之后就不可以再修改了&#xff0c;包括你想更改字段属性或者是分词方式等。那么随着业务数据量的发展&#xff0c;可能会出现需要修改索引&#xff0c;或…

vue3 路由写法及传参方式 !超详细

Vue Router 是 Vue.js 官方的路由管理器。它主要用于单页面应用程序&#xff08;SPA, Single Page Application&#xff09;中&#xff0c;帮助解决页面导航、组件复用等问题。 基本的使用 1.router配置文件代码 创建一个ts文件,用来写路由器 // 创建一个路由器,并暴露出去 …