%%主函数:TSP(旅行商问题):已知n个城市相互之间的距离,某一旅行商从某个城市出发访问某个城市一次且仅一次,
%最后回到出发城市,如何安排才使其所走路线最短。
%输入:
%D 距离矩阵
%NIND 为种群个数
%X 参数是中国34个城市的坐标(初始给定)
%MAXGEN 为停止代数,遗传到第MAXGEN代时程序停止,MAXGEN的具体取值视问题的规模和耗费的时间而定
%m 为适值淘汰加速指数,最好取为1,2,3,4,不宜太大
%Pc 交叉概率
%Pm 变异概率
%输出:
%R 为最短路径
%Rlength 为路径长度
clear
clc
close all
%%加载数据,可分别测试3个不同的数据集
load CityPosition1;
%load CityPosition2;
%load CityPosition3;
%X = CityPosition1;
D = Distance(X); %生成距离矩阵
N = size(D,1); %城市个数
%%遗传参数
NIND = 100; %种群大小
MAXGEN = 200; %最大遗传代数
Pc = 0.9; %交叉概率
Pm = 0.05; %变异概率
GGAP = 0.9; %代沟
%%初始种群
Chrom = InitPop(NIND,N);
%%画出随机解的路径图
DrawPath(Chrom(1,:),X); %X是在CityPosition1中存储的各个城市地理位置数据
pause(0.0001); %为了动态观察变化过程 pause(a)暂停a秒后执行下一条指令
%%输出随机解的路线和总距离
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); %计算路线长度
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);
FitnV = Fitness(ObjV);
%%选择
SelCh = Select(Chrom,FitnV,GGAP);
%%交叉操作
SelCh = Recombin(SelCh,Pc);
%%变异
SelCh = Mutate(SelCh,Pm);
%%逆转操作
SelCh = Reverse(SelCh,D);
%%重插入子代的新种群
Chrom = Reins(Chrom,SelCh,ObjV);
%%更新迭代次数
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('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~');
评论2