一、问题描述
假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。
二、算法描述
2.1 算法简介
遗传算法(GeneticAlgorithm)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,通过模拟自然进化过程搜索最优解。遗传算法是从代表问题可能潜在的解集的一个种群(population)开始的,初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代(generation)演化产生出越来越好的近似解,在每一代,根据问题域中个体的适应度(fitness)大小选择个体,并借助于自然遗传学的遗传算子(genetic operators)进行组合交叉(crossover)和变异(mutation),产生出代表新的解集的种群。这个过程将导致种群像自然进化一样的后生代种群比前代更加适应于环境,末代种群中的最优个体经过解码(decoding),可以作为问题近似最优解。
2.2 遗传算子
遗传算法中有选择算子、交叉算子和变异算子:
选择算子用于在父代种群中选择进入下一代的个体。
交叉算子用于对种群中的个体两两进行交叉。
变异算子用于对种群中的个体进行突变。
2.3 算法步骤描述
遗传算法的基本运算过程如下:
1、随机产生初始群体;
2、判断是否满足终止条件,若符合,输出结果,结束;否则,进行下一步,计算每个个体的适应值;
3、依据适应度选择再生个体,适应度高的个体被选中的概率高,适应度低的个体被淘汰
4、选择一个个体复制到新群体;
5、按照一定的交叉概率和交叉方法,变异概率和变异方法生成新的个体;
6、由交叉和变异产生新一代种群,返回步骤2
三、遗传算法求解TSP问题
3.1 数据(随机生成N个城市的坐标并保存)
pos=randn(N,2);
save city_25 pos;
3.2代码实现
3.2.1 主函数 main.m
%main
clear;
clc;
%%%%%%%%%%%%%%%输入参数%%%%%%%%
N=25; %%城市的个数
M=100; %%种群的个数
ITER=2000; %%迭代次数
%C_old=C;
m=2; %%适应值归一化淘汰加速指数
Pc=0.8; %%交叉概率
Pmutation=0.05; %%变异概率
%%生成城市的坐标
pos=randn(N,2);
save city_25 pos;
%%生成城市之间距离矩阵
D=zeros(N,N);
for i=1:N
for j=i+1:N
dis=(pos(i,1)-pos(j,1)).^2+(pos(i,2)-pos(j,2)).^2;
D(i,j)=dis^(0.5);
D(j,i)=D(i,j);
end
end
%%生成初始群体
popm=zeros(M,N);
for i=1:M
popm(i,:)=randperm(N);%随机排列,比如[2 4 5 6 1 3]
end
%%随机选择一个种群
R=popm(1,:);
figure(1);
scatter(pos(:,1),pos(:,2),'rx');%画出所有城市坐标
axis([-3 3 -3 3]);
figure(2);
plot_route(pos,R); %%画出初始种群对应各城市之间的连线
axis([-3 3 -3 3]);
%%初始化种群及其适应函数
fitness=zeros(M,1);
len=zeros(M,1