hello,大家好,祝各位端午节快乐!虽说已经是假期,但习惯了平日上班工作的节奏,于是默默地打开了电脑看起了文献。近期打算更新一篇头脑风暴优化(BSO)算法求解旅行商问题(TSP)的推文,在查阅相关文献的时候,看到了一个比较有趣的交叉算子,至于这个交叉算子和BSO求解TSP问题有什么关联,下一期推文会为大家讲解。今天,各位小伙伴先了解一下这个交叉算子的实现机制即可。
我们还是以求解TSP问题为例,8个城市的坐标如下所示。
每两个点之间的距离矩阵如下所示:
现在随机生成两个父代个体parent1和parent2,分别如下:
parent1:1 2 4 6 7 5 8 3,总距离为200.7。
parent2:3 5 1 4 2 7 6 8,总距离为261.9。
然后按照以下步骤生成子代个体child1和child2
(1)初始化child1和child2。
child1=zeros(1,8); %初始化子代个体1
child2=zeros(1,8); %初始化子代个体2
(2)先随机生成一个1~8之间的随机数,作为child1和child2的起点,比如说为这个随机数为6,即start=6。
start=randperm(8,1); %随机选择一个城市作为子代个体的起点
start_c=start; %复制start
child1(1)=start; %更新子代个体1的起点为start
child2(1)=start; %更新子代个体2的起点为start
(3)复制父代个体parent1和parent2,初始化child1更新的位置pos,因为起点已经确定,所以pos初始化为2。
parent1_c1=parent1; %复制parent1
parent2_c1=parent2; %复制parent2
pos=2; %记录child中的位置
(4)先更新子代个体child1。
a)分别在parent1_c1中找到与城市6右侧紧邻的城市right1,parent2_c1中找到与城市6右侧紧邻的城市right2。此例中parent1_c1中与城市6右侧紧邻的城市是7,parent2_c1中与城市6右侧紧邻的城市是8。
b)比较6和7之间的距离dist(6,7)与6和8之间的距离dist(6,8)的大小,
如果dist(6,7)<=dist(6,8),则更新child1的第2个位置上的元素,即child1(pos)=7。否则,child1(pos)=8。
这里其实采用的就是一种贪婪的思想,哪个右紧邻点离6近,就选择哪个点作为下一个点。这里因为dist(6,7)<=dist(6,8),所以child1(2)=7。
c)将城市6从parent1_c1和parent2_c1中删除,此时
parent1_c1:1 2 4 7 5 8 3
parent2_c2:3 5 1 4 2 7 8
%% 更新parent1_c1和parent2_c1
parent1_c1(parent1_c1==start)=[];
parent2_c1(parent2_c1==start)=[];
d)更新start和pos,此时start=7和pos=3
%% 更新start
start=child1(pos);
%% 更新pos
pos=pos+1;
e)按照上述方式不断循环,直到parent1_c1中,只剩下一个元素。
(5)最终child1为6 7 8 3 1 2 5 4,总距离为145.6。
(6)复制父代个体parent1和parent2,重置child2的起点为start_c,重置更新位置pos为2。
parent1_c2=parent1; %复制parent1
parent2_c2=parent2; %复制parent2
start=start_c; %更新start为初始start
pos=2; %记录child中的位置
(7)再更新子代个体child2。
a)分别在parent1_c2中找到与城市6左侧紧邻的城市right1,parent2_c2中找到与城市6左侧紧邻的城市right2。此例中parent1_c2中与城市6左侧紧邻的城市是4,parent2_c2中与城市6左侧紧邻的城市是7。
b)比较dist(4,6)与dist(7,6)的大小,
如果dist(4,6)<=dist(7,6),则更新child2的第2个位置上的元素,即child2(pos)=4。否则,child2(pos)=7。这里因为dist(4,6)>dist(7,6),所以child2(2)=7。
c)将城市6从parent1_c2和parent2_c2中删除,此时
parent1_c1:1 2 4 7 5 8 3
parent2_c2:3 5 1 4 2 7 8
%% 更新parent1_c2和parent2_c2
parent1_c2(parent1_c2==start)=[];
parent2_c2(parent2_c2==start)=[];
d)更新start和pos,此时start=7和pos=3
e)按照上述方式不断循环,直到parent1_c2中,只剩下一个元素。
(8)最终child2为6 7 2 1 3 8 5 4,总距离为178.8。
可以看出这种交叉算子得出的结果还是不错的,那究竟它与BSO的结合求解TSP的效果会如何呢?
下期会公布结果,敬请期待。
参考
Wu Y , Wang X , Qi J , et al. An Adaptive Brain Storm Optimization Algorithm Based on Heuristic Operators for TSP[M]// Bio-inspired Computing: Theories and Applications. 2020.
各位新来的小伙伴如果是智能优化算法初学者的话,可以看
如何自学智能优化算法?mp.weixin.qq.com这篇推文快速进行学习。
更多资源尽在:优化算法交流地
往期精选
- 号内搜索
- 如何自学智能优化算法?
- 头脑风暴优化(BSO)算法(附MATLAB代码)
- 遗传模拟退火算法求解旅行商(TSP)问题
- 车辆路径问题(VRP)合集
- 旅行商问题(TSP)合辑
- MATLAB导入txt文件技巧大全
- 遗传算法(GA)求解旅行商问题(TSP)MATLAB代码讲解
- 遗传算法求解0-1背包问题(附matlab源代码)
- 模拟退火(SA)算法求解旅行商 (TSP)问题MATLAB代码讲解
- 多目标优化 | 基于NSGA-II的多目标0-1背包问题求解(附matlab代码)
- 多目标优化 | NSGA-II进阶教程(全网首个三目标优化教程)
- 机器学习 | 基于遗传算法的BP神经网络优化算法(附MATLAB代码)
- 遗传算法求解车间调度问题(附MATLAB代码)
- 多目标优化 | NSGA-II
- word转换为pdf后图片失真的解决办法(全网首发)
- 机器学习 | 简单实现Bp神经网络
- 二维装箱问题之BL法修正版(附MATLAB代码)
- 快速入门文献管理软件-EndNote X9
- 最小二乘法(附MATLAB代码)
- NSGA-II多目标优化算法讲解(附MATLAB代码)
- 基于人工势场法的机器人二维路径规划(附MATLAB代码)
- 基于粒子群算法的多目标搜索算法讲解(附MATLAB代码)
- 蚁群算法通俗讲解(附MATLAB代码)
- 混合粒子群算法通俗讲解(附MATLAB代码)