说到最短路径的求解,我们想到的往往是Dijkstra算法、Floyd算法、SPFA算法,这些算法都非常的经典,这些算法往往保证了路径最短,但是走过的路径可能构不成一个环,也就是说上述算法在修路,修桥这些方面能够很好地被应用,因为用到的材料会保证最少,但如果你是计划着出去旅游,准备着将N个旅游景点都走完,并保证每个景点只去一次,最后正好还回到你家的话(例如TSP问题),今天我们要学习的这种仿生算法就能很好地解决你的问题。
仿生算法其实是模拟的人类基因的,染色体交叉,变异,它体现了达尔文“物竞天择,适者生存”的思想,通过代数的增加,子代会越来越适应环境,不适应的在迭代的过程中会被逐渐淘汰掉,这样就保证了结果比较优(如果迭代次数设置地大一点,结果基本可以认为最优了)
https://www.bilibili.com/video/av22056690/?redirectFrom=h5
这个链接是B站上的一个教学视频,读者可以打开看看,讲得很详细,这是第四章的内容
关键词:种群大小、父代、子代、收敛、交叉、交叉概率、变异、变异概率、代沟
以下是代码实现(代码一块一块地粘在变异环境中就能运行,你只需要修改参数即可):
主函数:
clear %运用了仿生学中的生物遗传变异,如果感觉结果不是很优,你可以增大迭代次数,这里设了200次
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]; %各个城市的坐标位置
NIND = 100; %种群大小
MAXGEN = 200; %最大迭代次数
Pc = 0.9; %交叉概率,相当于基因遗传的时候染色体交叉
Pm = 0.05; %染色体变异
GGAP = 0.9; %这个是代沟,通过遗传方式得到的子代数为父代数*GGAP
D = Distance(X); %通过这个函数可以计算i,j两点之间的距离
N = size(D,1); %计算有多少个坐标