烟花优化算法求解TSP离散问题的MATLAB程序源码

烟花优化算法是2010年提出来,相对其他算法可算是一个比较新颖的算法,所以越来越多的人开始使用烟花算法来求解实际问题和写论文。
但是烟花算法和其他群体类算法一样,如粒子群算法、布谷鸟算法、蝙蝠算法等等,它是求解连续函数的问题,它的编码也是实数编码。对于一些离散问题,如旅行商TSP问题,这些算法就不怎么适用了,需要一定的转换。

重点来了:很多人的转换方法其实是不对的,金玉其外,败絮其中。

比如TSP问题,他们依然使用实数编码,如实数编码是【0.44 0.62 0.56 0.67 0.32 0.42 0.76 0.28 0.05 0.44】,他们只是解码的时候将这些实数从小到大排序,然后用离散的索引编码,如上面实数编码的从小到大排序的索引为【9 8 5 6 1 10 3 2 4 7】看起来好像是实现了离散编码,所以我说它是金玉其外。

那为啥我又说它是败絮其中呢?因为:(1)这种方法本质还是连续编码,不能叫离散编码;(2)中间这个转换是不确定的,也就没有继承性,对优化问题是没有任何帮助的。什么意思呢?就是说我们的优化算法都是一代一代搜索达到最优的,一般下一代的最优解是在上一代最优解的基础上进化得到的。这种转换方式的不确定性是指上一代的最优解和下一代的最优解没有什么关系,甚至会出现互不相干。我不知道说到这你能理解了吗。

为此,我想到了一种方法,实现了用烟花算法求解离散问题,如TSP问题。在这个问题中,编码是离散的自然数编码,即1~N编码,然后我根据烟花算法的原理对离散编码时的爆炸火花和爆炸半径进行了定义,效果很好!先看看效果图。(因为我写的是最基本的烟花算法,可以在这个算法的基础上进行改进,当然参数设置也会影响程序的效果)程序效果图如下:

在这里插入图片描述
在这里插入图片描述

所有的程序文件如下:代码为付费服务,有需要的可以联系我,非诚勿扰,谢谢!
在这里插入图片描述

主程序代码如下:
%%%% 烟花算法求解TSP问题
%%%% by 圆 一个有心的人在用心做事
%%%% 2020-09-10
%%%% 如有问题请联系 QQ3171304690/530807088(好友已满) 新浪微博:MATLAB圆创工作室
% ======================= 高 端 定 制 · 华 丽 分 割 ======================clear
close all
clc
%%
data = load(‘eil51.txt’);
position = data(:,2:3); % 城市坐标矩阵
dim = size(position,1);
D = zeros(dim,dim);
% 计算距离矩阵
for i = 1:dim
for j = i+1:dim
D(i,j) = ((position(i,1)-position(j,1))2+(position(i,2)-position(j,2))2)^0.5;
D(j,i) = D(i,j);
end
end
%% 初始化参数
NP = 20; % 烟花数量
M = 30; % 爆炸数目
Amax = 20; % 最大爆炸半径
maxgen = 500; % 最大迭代次数
Smax = round(M * 0.8);
Smin = round(M * 0.1);
%% 初始化烟花位置
X = zeros(NP,dim); % 烟花位置
for i = 1 : NP
X(i,:) = randperm(dim);
end
% 计算适应度
FX = zeros(NP,1);
for i = 1 : NP
FX(i,1) = fitness(X(i,:), D);
end[fpbest,id] = sort(FX,‘ascend’); % 评估fitness,然后进行排序
fgbest = fpbest(1);
%% 开始迭代
FG = zeros(1,maxgen); % 各代最优函数值
for gen = 1 : maxgen
gen
% 计算爆炸数目
En = calculate_En(FX, NP, M, Smin, Smax);
% 计算爆炸半径
Er = calculate_Er(FX, NP, Amax, fgbest);
% 产生爆炸火花
[eSpark,feSpark] = generate_eSpark(En, Er, X, FX, D);
% 产生高斯变异火花
[mSpark,fmSpark] = generate_mSpark(X, NP, dim, D);
% 所有烟花、火花
allX = [X; eSpark; mSpark];
% 计算适应度
FallX = [FX; feSpark; fmSpark]
% 更新全局最优值和最优解
[Fsort,index]=sort(FallX,‘ascend’);
gbest = allX(index(1),: );
fgbest = Fsort(1);
FG(gen) = fgbest;
% 选择下一代烟花
[X, FX] = select(allX, FallX, NP);
end
gbest
fgbest
route = [gbest gbest(1)];
figure
plot(position(route,1),position(route,2),‘bo-’,‘LineWidth’,1,‘MarkerFaceColor’,‘g’)
hold on
for i = 1 : dim
text(position(i,1),position(i,2),[’ ’ num2str(i)])
end
%%
figure
plot(FG ,‘r’,‘LineWidth’,1);
xlabel(‘迭代次数’)
ylabel(‘最短距离’)
title(‘烟花优化算法求解TSP问题’)

  • 0
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值