基于TSP(旅行商)问题的混合粒子群算法 附直接运行代码

这篇具有很好参考价值的文章主要介绍了基于TSP(旅行商)问题的混合粒子群算法 附直接运行代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

如果对粒子群一点都不知道的可以看看上文标准粒子群算法,想看代码的直接去下面1.4标题即可

链接:(105条消息) 自己对粒子群算法的理解(附matlab直接运行代码)(二维)_吕浩轩的博客-CSDN博客_二维粒子群算法​​​​​​h

好现在开始正文:

1.1 前言:理论基础

标准粒子群通过追随个体极值和群体极值完成极值寻优,虽然简单,且能快速收敛,但是随着迭代次数的增加,在种群收敛集中的过程中,各个粒子也越来越相似(接近),这样就有可能进入局部最优解而无法跳出

混合粒子群算法:摈弃了传统粒子群算法中的通过追踪极值来更新粒子位置的方法,引入了遗传算法中的交叉和变异操作,通过粒子同个体极值和群体极值的交叉以及粒子自身变异的方式来搜索最优解。

1.2 算法流程

基本上和标准粒子群基本一致。(图有点糊,抱歉)

基于TSP(旅行商)问题的混合粒子群算法 附直接运行代码

1.3 算法实现

1.3.1 :个体编码

在写代码前,先要讲一下粒子的个体编码

粒子个体采用整数编码,每个粒子代表经过的城市,比如A粒子=5,A的个体编码为[2 5 1 3 6]

表示城市遍历从2开始,途径 5 1 3 6到2结束,没错,是返回2了。这样才能完成TSP的遍历。

1.3.2 :适应度值

粒子适应度值就是遍历路径的长度,计算公式为如下:

 基于TSP(旅行商)问题的混合粒子群算法 附直接运行代码

n为城市数量,path(i,j)为城市i,j之间的路径长度

​​​​​​​1.3.3: 交叉操作

交叉操作
个体通过个体极值和群体极值交叉来更新,交叉方法采用整数交叉法。首先选择两个交叉位置,然后把个体和个体极值或个体与群体极值进行交叉,假定随机选取的交叉位置为3和4位置,操作方法如下:
个体:[9 4 2 1 3 7 6 10 8 5]

极值:[9 2 1 6 3 7 4 10 8 5]
交叉为新个体:[9 4 1 6 3 7 6 10 8 5]

在MATLAB智能算法30个案例这本书中是用上面的素材交换3和5位置生成[9 4 1 6 3 7 6 10 8 5],我个人感觉可能是把3 4 写成了 3 5位置,或者可能是我理解问题,不过这个关系不大,毕竟交叉是随机的

产生的新个体如果存在重复位置则进行调整,调整方法为用个体中未包括的城市代替重复包括的城市,如下所示:
              [9 4 1 6 3 7 6 10 8 5]

调整为:[9 4 2 1 3 7 6 10 8 5] (之前个体中2没有被包括进来,所以用2来代替出现了两次的6)
对得到的新个体采用了保留优秀个体策略,只有当新粒子适应度值好于旧粒子时才更新粒子。​

​​​​​​

1.3.4:变异操作 

编译方法采用个体内部自己两位互换,随机选择两个变异位置,下面举个例子:

[9 4 2 1 3 7 6 10 8 5] 将 pos1 = 2和pos1 = 5互换

变异成 [9 3 2 1 4 7 6 10 8 5]

当然,对新得到的个体采用保留优秀个体的策略,只有当新的粒子适应度值好于旧粒子时才更新粒子(不然不瞎操作一大堆了)

1.4 代码实现

1.4.1 首先加载一下城市的坐标数据

cityCoor : 城市坐标

cityDist : 城市距离

x :个体

indiFit : 个体适应度

%% 下载数据
data=load('eil51.txt');%导入城市坐标文件,后面我会提供
cityCoor=[data(:,2) data(:,3)];%城市坐标矩阵
figure
plot(cityCoor(:,1),cityCoor(:,2),'ms','LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor','r')
legend('城市位置')
ylim([4 78])
title('城市分布图','fontsize',12)
xlabel('km','fontsize',12)
ylabel('km','fontsize',12)
%ylim([min(cityCoor(:,2))-1 max(cityCoor(:,2))+1])

grid on

1.4.2 计算城市间的距离

%% 计算城市间距离
n=size(cityCoor,1);            %城市数目
cityDist=zeros(n,n);           %城市距离矩阵
for i=1:n
    for j=1:n
        if i~=j
            cityDist(i,j)=((cityCoor(i,1)-cityCoor(j,1))^2+...
                (cityCoor(i,2)-cityCoor(j,2))^2)^0.5;
        end
        cityDist(j,i)=cityDist(i,j);
    end
end
nMax=200;                      %进化次数
indiNumber=1000;               %个体数目
individual=zeros(indiNumber,n);
%^初始化粒子位置
for i=1:indiNumber
    individual(i,:)=randperm(n);    
end

1.4.3: 拥有距离后计算种群的适应度

%% 计算种群适应度
indiFit=fitness(individual,cityCoor,cityDist);%个体适应度值
[value,index]=min(indiFit);                        %找到最短和其对应的下标
tourPbest=individual;                              %当前个体最优
tourGbest=individual(index,:) ;                    %当前全局最优
recordPbest=inf*ones(1,indiNumber);                %个体最优记录
recordGbest=indiFit(index);                        %群体最优记录
xnew1=individual;

1.4.4: 运用循环取寻找最优的路径,同时引进交叉操作和变异操作

%% 循环寻找最优路径
L_best=zeros(1,nMax);

for N=1:nMax
    %计算适应度值
    indiFit=fitness(individual,cityCoor,cityDist);
    
    %更新当前最优和历史最优
    for i=1:indiNumber
        if indiFit(i)<recordPbest(i)
            recordPbest(i)=indiFit(i);
            tourPbest(i,:)=individual(i,:);
        end
        if indiFit(i)<recordGbest
            recordGbest=indiFit(i);
            tourGbest=individual(i,:);
        end
    end
    
    [value,index]=min(recordPbest);
    recordGbest(N)=recordPbest(index);
    
    %% 交叉操作
    for i=1:indiNumber
       % 与个体最优进行交叉
        c1=unidrnd(n-1); %产生交叉位,unidrnd可以随机产生一个固定范围内的离散数据
        c2=unidrnd(n-1); %产生交叉位
        while c1==c2
            c1=round(rand*(n-2))+1;
            c2=round(rand*(n-2))+1;
        end
        chb1=min(c1,c2);
        chb2=max(c1,c2);
        cros=tourPbest(i,chb1:chb2);
        ncros=size(cros,2);      
        %删除与交叉区域相同元素,并将个体未被包括的城市代替重复的城市
        for j=1:ncros
            for k=1:n
                if xnew1(i,k)==cros(j)
                    xnew1(i,k)=0;
                    for t=1:n-k
                        temp=xnew1(i,k+t-1);
                        xnew1(i,k+t-1)=xnew1(i,k+t);
                        xnew1(i,k+t)=temp;
                    end
                end
            end
        end
        %插入交叉区域
        xnew1(i,n-ncros+1:n)=cros;
        %新路径长度变短则接受
        dist=0;
        for j=1:n-1
            dist=dist+cityDist(xnew1(i,j),xnew1(i,j+1));
        end
        dist=dist+cityDist(xnew1(i,1),xnew1(i,n));
        if indiFit(i)>dist
            individual(i,:)=xnew1(i,:);
        end
        
        % 与全体最优进行交叉
        c1=round(rand*(n-2))+1;  %产生交叉位
        c2=round(rand*(n-2))+1;  %产生交叉位
        while c1==c2
            c1=round(rand*(n-2))+1;
            c2=round(rand*(n-2))+1;
        end
        chb1=min(c1,c2);
        chb2=max(c1,c2);
        cros=tourGbest(chb1:chb2); 
        ncros=size(cros,2);      
        %删除与交叉区域相同元素
        for j=1:ncros
            for k=1:n
                if xnew1(i,k)==cros(j)
                    xnew1(i,k)=0;
                    for t=1:n-k
                        temp=xnew1(i,k+t-1);
                        xnew1(i,k+t-1)=xnew1(i,k+t);
                        xnew1(i,k+t)=temp;
                    end
                end
            end
        end
        %插入交叉区域
        xnew1(i,n-ncros+1:n)=cros;
        %新路径长度变短则接受
        dist=0;
        for j=1:n-1
            dist=dist+cityDist(xnew1(i,j),xnew1(i,j+1));
        end
        dist=dist+cityDist(xnew1(i,1),xnew1(i,n));
        if indiFit(i)>dist
            individual(i,:)=xnew1(i,:);
        end
        
       %% 变异操作
        c1=round(rand*(n-1))+1;   %产生变异位
        c2=round(rand*(n-1))+1;   %产生变异位
        while c1==c2
            c1=round(rand*(n-2))+1;
            c2=round(rand*(n-2))+1;
        end
        temp=xnew1(i,c1);
        xnew1(i,c1)=xnew1(i,c2);
        xnew1(i,c2)=temp;
        
        %新路径长度变短则接受
        dist=0;
        for j=1:n-1
            dist=dist+cityDist(xnew1(i,j),xnew1(i,j+1));
        end
        dist=dist+cityDist(xnew1(i,1),xnew1(i,n));
        if indiFit(i)>dist
            individual(i,:)=xnew1(i,:);
        end
    end

    [value,index]=min(indiFit);
    L_best(N)=indiFit(index);
    tourGbest=individual(index,:); 
    
end

1.4.5: 结果作图咯

%% 结果作图
figure
plot(L_best)
title('算法训练过程')
xlabel('迭代次数')
ylabel('适应度值')
grid on


figure
hold on
plot([cityCoor(tourGbest(1),1),cityCoor(tourGbest(n),1)],[cityCoor(tourGbest(1),2),...
    cityCoor(tourGbest(n),2)],'ms-','LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor','g')
hold on
for i=2:n
    plot([cityCoor(tourGbest(i-1),1),cityCoor(tourGbest(i),1)],[cityCoor(tourGbest(i-1),2),...
        cityCoor(tourGbest(i),2)],'ms-','LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor','g')
    hold on
end
legend('规划路径')
scatter(cityCoor(:,1),cityCoor(:,2));
title('规划路径','fontsize',10)
xlabel('km','fontsize',10)
ylabel('km','fontsize',10)

grid on
ylim([4 80])

第一组:城市共20个

基于TSP(旅行商)问题的混合粒子群算法 附直接运行代码

基于TSP(旅行商)问题的混合粒子群算法 附直接运行代码

第二组 :城市76个

基于TSP(旅行商)问题的混合粒子群算法 附直接运行代码

基于TSP(旅行商)问题的混合粒子群算法 附直接运行代码

如果您看完了,请给我点个赞吧,谢谢o(* ̄▽ ̄*)ブ文章来源地址https://www.toymoban.com/news/detail-415185.html

到了这里,关于基于TSP(旅行商)问题的混合粒子群算法 附直接运行代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++动态规划解决TSP(旅行商)问题

    题目描述: 某旅行商希望从某城市出发经过一系列的城市最后再回到出发的城市。这些城市之间均可直航,他希望只经过这些城市一次且旅行的总线路最短。设有n个城市,城市的编号从1到n。 输入第一行为整数n,表示城市的数量。其后n行,每行有n个整数,用空格隔开,表

    2024年02月03日
    浏览(39)
  • 旅行商问题 Traveling Salesman Problem(TSP)

    一个商人从一点出发,经过所有点后返回原点。 目标:经过所有点的最短路程。 约束: 1,除起点和终点外,所有点当且仅当经过一次; 2,起点与终点重合;所有点构成一个连通图 图论解释:该问题实质是在一个带权完全无向图中,找一个权值最小的哈密尔顿回路 哈密尔

    2024年02月03日
    浏览(43)
  • 旅行商问题(TSP)及Python图论求解

    旅行商问题(Traveling Salesman Problem, TSP)是指给定一个城市的集合以及每两个城市之间的距离,找到一条经过每个城市恰好一次且路径最短的回路。 可以想象成一个旅行商要拜访多个城市,问他如何安排路线,使得行程最短。这个问题可能看起来简单,但是随着城市数量的增

    2024年02月12日
    浏览(37)
  • 【无人机】基于遗传算法混合粒子群算法的无人机路径规划研究[和遗传算法、粒子群算法进行比较](Matlab代码实现)

      💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 对于

    2024年04月25日
    浏览(53)
  • Hopfield神经网络求解旅行商(TSP)问题matlab代码

            1.网络结构         连续Hopfield神经网络(Continuous Hopfield Neural Network,CHNN)的拓扑结构和离散Hopfield神经网络的结构类似,如图11-1所示。连续Hopfield网络和离散Hopfield 网络的不同点在于其传递函数不是阶跃函数,而是连续函数。         与离散型Hopfield神经网络不

    2024年02月14日
    浏览(43)
  • 强化学习求解TSP:Qlearning求解旅行商问题(Traveling salesman problem, TSP)提供Python代码

    Q-learning是一种强化学习算法,用于解决基于奖励的决策问题。它是一种无模型的学习方法,通过与环境的交互来学习最优策略。Q-learning的核心思想是通过学习一个Q值函数来指导决策,该函数表示在给定状态下采取某个动作所获得的累积奖励。 Q-learning的训练过程如下: 1. 初

    2024年02月03日
    浏览(44)
  • python实现大规模邻域搜索(LNS)求解旅行商问题(TSP)

    参考《Handbook of Metaheuristics (Third Edition)》中的Large neighborhood search章节, 建议直接阅读英文原版 大规模邻域搜索(LNS) 属于超大邻域搜索(Very Large-Scale Neighborhood Search, VLNS)的一类 ,随着算例规模的增大,邻域搜索算法的邻域规模呈指数增长或者当邻域太大而不能在实际中明确搜索

    2024年02月08日
    浏览(43)
  • 遗传算法解决tsp问题(基于python)

    目录 1.遗传算法简要介绍 2.tsp问题简要介绍 3.遗传算法解决tsp问题的几个特殊点 4.源码         简单来说,遗传算法是用于解决最优化问题的一种搜索算法。其核心基于自然界种群进化的规律,即初始种群进行交配,在基因层面上,其中会发生交叉互换、基因突变等变异

    2023年04月12日
    浏览(79)
  • 基于贪心算法的TSP问题(c语言)

     data.txt 代码   

    2024年02月11日
    浏览(44)
  • 【Matlab】基于粒子群优化算法优化BP神经网络的数据回归预测(Excel可直接替换数据)

    基于粒子群优化算法(Particle Swarm Optimization, PSO)优化BP神经网络的数据回归预测是一种结合了PSO和BP神经网络的方法,用于提高BP神经网络在回归预测任务中的性能。BP神经网络是一种常用的前向人工神经网络,用于处理回归和分类问题,但在复杂问题上可能陷入局部最优解。

    2024年02月15日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包