【TSP问题】基于萤火虫算法求解TSP问题【Matlab 141期】【路径规划24】

一、背景

问题定义:巡回旅行商问题
给定一组n个城市和俩俩之间的直达距离,寻找一条闭合的旅程,使得每个城市刚好经过一次且总的旅行距离最短。
TSP问题也称为货郎担问题,是一个古老的问题。最早可以追溯到1759年Euler提出的骑士旅行的问题。1948年,由美国兰德公司推动,TSP成为近代组合优化领域的典型难题。
TSP是一个具有广泛的应用背景和重要理论价值的组合优化问题。 近年来,有很多解决该问题的较为有效的算法不断被推出,例如Hopfield神经网络方法,模拟退火方法以及遗传算法方法等。
TSP搜索空间随着城市数n的增加而增大,所有的旅程路线组合数为(n-1)!/2。在如此庞大的搜索空间中寻求最优解,对于常规方法和现有的计算工具而言,存在着诸多计算困难。借助遗传算法的搜索能力解决TSP问题,是很自然的想法。

二、概述

萤火虫算法(Firefly Algorithm)是一种启发式算法,灵感来自于萤火虫闪烁的行为。萤火虫的闪光,其主要目的是作为一个信号系统,以吸引其他的萤火虫。
其假设为:
萤火虫不分性别,这样一个萤火虫将会吸引到所有其他的萤火虫;吸引力与它们的亮度成正比,对于任何两个萤火虫,不那么明亮的萤火虫被吸引,因此移动到更亮的一个,然而,亮度又随着其距离的增加而减少;如果没有比一个给定的萤火虫更亮的萤火虫,它会随机移动。亮度应与目标函数联系起来。萤火虫算法是以自然为灵感的启发式优化算法。
在这里插入图片描述
在这里插入图片描述

三、源代码

clear;
clc;
close all;
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];
R=11;
MAXGEN=200;
NIND=100;
D=Distanse(X);
N=size(D,1);
%%初始化种群
Chrom=InitPop(NIND,N);
%%在二维图上画出所有坐标点
figure
plot(X(:,1),X(:,2),'o');
%%画出随机解的路线图
DrawPath(Chrom(1,:),X);
pause(0.0001)
%%输出随机解的路线和总距离
disp('初始种群中的一个随机解:')
OutputPath(Chrom(1,:));
Rlength=PathLength(D,Chrom(1,:));
disp(['总距离:',num2str(Rlength)]);
disp('-------------------------------------------------------------------------------------------------')
%%优化
gen=0;
figure;
hold on;box on
xlim([0,MAXGEN])
title('优化过程')
xlabel('代数')
ylabel('最优值')
ObjV=PathLength(D,Chrom);                           %计算路线长度title('优化过程')xlable('代数')ylable('最优值')
preObjV=min(ObjV);
while gen<MAXGEN
    %%计算适应度
    ObjV=PathLength(D,Chrom);                        %计算路线长度
    %fprintf('%d    %1.10f\n',gen,min(ObjV))
    line([gen-1,gen],[preObjV,min(ObjV)]);pause(0.0001)
    preObjV=min(ObjV);
    FitnV=Fitness(ObjV);
    for i=1:NIND
        K=0;
        subject=zeros(NIND,N);
        for j=1:i-1
            dij=ristanse(Chrom(i,:),Chrom(j,:));
            if dij<=R
                K=K+1;
                subject(K,:)=Chrom(j,:);
            end
        end
        for j=i+1:NIND
            dij=ristanse(Chrom(i,:),Chrom(j,:));
             if dij<=R
                K=K+1;
                subject(K,:)=Chrom(j,:);
             end
        end
        if K==0
        subject1=zeros(1,N);
        else subject1=zeros(K,N);
        end
 
        end
        end
    end
     gen=gen+1;
end
%%画出最优解的路线图
ObjV=PathLength(D,Chrom);
[minObjV,minInd]=min(ObjV);
DrawPath(Chrom(minInd(1),:),X)
%%输出最优解的路线和总距离
disp('最优解')
p=OutputPath(Chrom(minInd(1),:));
disp(['总距离:',num2str(ObjV(minInd(1)))]);
disp('-------------------------------------------------------------------')

四、运行效果

在这里插入图片描述
注:完整代码或者代写添加QQ1564658423。
往期回顾>>>>>>
【Matlab 015期】【路径规划1】基于粒子群的三维无人机路径规划matlab源码
【Matlab 017期】【路径规划2】采用遗传算法编制多物流中心的开放式车辆路径问题Matlab程序
【Matlab 018期】【路径规划3】基于粒子群之机器人栅格路径规划
【Matlab 019期】【路径规划4】蚁群算法求解最短路径matlab
【Matlab 020期】【路径规划5】Matlab 免疫算法之物流中心选址问题
【Matlab 021期】【路径规划6】基于人工蜂群的无人机三维路径规划
【Matlab 027期】【路径规划7】基于栅格地图——遗传算法的机器人最优路径规划
【Matlab 034期】【路径规划8】基于蚁群的多无人机攻击调度
基于栅格地图——遗传算法的机器人最优路径规划【Matlab 022期】【路径规划9】
考虑分配次序的多无人机协同目标分配建模与遗传算法求解【Matlab 110期】【路径规划10】
蚁群算法求解多中心vrp问题matlab【Matlab 111期】【路径规划11】
基于蚁群算法求解带时间窗的多中心VRP问题matlab【Matlab 112期】【路径规划12】
基于蚁群算法求解带时间窗的多中心VRP问题matlab【Matlab 113期】【路径规划13】
基于遗传算法的多中心VRP求解matlab【Matlab 114期】【路径规划14】
模拟退火求解VRP问题matlab【Matlab 115期】【路径规划15】
基于A星的栅格路径规划【Matlab 116期】【路径规划16】
一种带交叉因子的双向寻优粒子群栅格地图路径规划【Matlab 117期】【路径规划17】
【TSP】蚁群算法求解TSP问题matlab含GUI【Matlab 118期】【路径规划18】
基于蚁群算法栅格地图路径规划matlab【Matlab 119期】【路径规划19】
基于遗传算法的旅行商 TSP 问题【Matlab 135期】【路径规划20】
基于模拟退火算法的旅行商 TSP 问题【Matlab 136期】【路径规划21】
基于蚁群算法的智能车路径规划【Matlab 137期】【路径规划22】
华为杯:无人机在抢险救灾中的优化运用【Matlab 138期】【路径规划23】

猜你喜欢

转载自blog.csdn.net/TIQCmatlab/article/details/112799340