遗传算法求解货郎担问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
[键入公司名称]
遗传算法求解TSP问题最短路径参观特定地点
[键入作者姓名]
2014/12/12
指导老师:
1 问题简介
一个考察团想参观同济大学嘉定校区,参观地点如图1黄色标注所示。他们想从其中一点出发,然后依次经过其它点,中间不重复,最后回到起点。请为他们设计一条最短路径。
图1 同济大学嘉定校区参观点
2 问题分析
这是一个典型的TSP问题。我们可以尝试采用遗传算法来解决。先随机生成若干条有效路径,再选择其中较优的路径进行繁殖,生成下一代。再对下一代进行类似的操作。进过若干代的进化后,将会收敛于一个较优解。具体的流程如图2所示。
3 实验结果
路径为:6 5 7 10 8 9 4 2 1 3 6。长度为:3.1434 Km如图3 所示。
其中,适应度函数如图4所示。
(由于起点不固定,故同一条路径有多种结果:5 7 10 8 9 2 1 3 6 5、2 1 3 6 5 7 10 8 9 4、3 6 5 7 10 8 9 4 2 1;另外,多次运行程序,还出现另一个结果:9 8 10 7 5 6 3 1 2 4、7 5 6 3 1 2 4 9 8 10。但两者的长度一样,实际中两者长度应该差不多)
图3 路径图
图4 适应度函数变化趋势图4 源程序
clc,clear;
%% 距离矩阵
MatrixDis1 = 1e3*[ 0 0.3869 0.4067 0.6400 0.7446 0.6243 0.8617 1.0931 0.6659 1.0823
0.3869 0 0.1214 0.2540 0.4282 0.3446 0.6204 0.7067 0.3057 0.7332
0.4067 0.1214 0 0.2682 0.3464 0.2420 0.5130 0.7228 0.3833 0.6766
0.6400 0.2540 0.2682 0 0.2930 0.2953 0.5320 0.4583 0.1901 0.5149
0.7446 0.4282 0.3464 0.2930 0 0.1299 0.2413 0.5530 0.4818 0.3454
0.6243 0.3446 0.2420 0.2953 0.1299 0 0.2761 0.6502 0.4803 0.4749
0.8617 0.6204 0.5130 0.5320 0.2413 0.2761
0 0.7430 0.7218 0.3984
1.0931 0.7067 0.7228 0.4583 0.5530 0.6502 0.7430 0 0.4625 0.4316
0.6659 0.3057 0.3833 0.1901 0.4818 0.4803
0.7218 0.4625 0 0.6567
1.0823 0.7332 0.6766 0.5149 0.3454 0.4749 0.3984 0.4316 0.6567 0];
N = length(MatrixDis1);
%% 初始种群
Num_Population = 50; % 种群规模
Init_Population = zeros(Num_Population,N);
fori = 1:Num_Population
Init_Population(i,:) = randperm(N);
end
%% 进化过程
k = 0;
Gen_Max = 1000; % 最大进化代数
Population = Init_Population;
Best_Fitness = zeros(1,Gen_Max);
Best_Individual = zeros(Gen_Max,N);
while (k k = k+1; %% 计算适应度函数,距离的倒数 Distance = zeros(1,Num_Population); fori = 1:Num_Population for j = 1:N-1 Distance(i) = Distance(i)+ MatrixDis1(Population(i,j),Population(i,j+1)); end Distance(i) = Distance(i)+ MatrixDis1(Population(i,N),Population(i,1)); end Fitness = 1./Distance; [Best_Fitness(k),Best_Index] = max(Fitness); Best_Individual(k,:) = Population(Best_Index,:); %% 选择(轮盘赌法) Select_Index = zeros(1,Num_Population); P = Fitness/sum(Fitness); Q = P; fori = 1:Num_Population-1 Q(i+1) = Q(i)+P(i+1); end fori = 1:Num_Population Q0 = rand; for j = 1:Num_Population if Q0 < Q(j) Select_Index(i) = j; break; end end end Select_Population = Population(Select_Index,:); % %% 最优个体保存策略 % [BBest_Fitness,BBest_Index] = max(Best_Fitness); %选择迄今为止的最优个体% BBest_Individual = Best_Individual(BBest_Index(1),:); % % [Least_Fitness,Least_Index] = min(Fitness); % 把种群中最差的个体替换掉 % Select_Population(Least_Index(1),:) = BBest_Individual; %% 交叉(分类匹配算子) Probability_Cross = 0.5; % 交叉概率 Cross_Index = []; for i = 1:Num_Population % 选择交叉个体 if rand Cross_Index = [Cross_Index,i]; end end Cross_N = fix(length(Cross_Index)/2); fori = 1:Cross_N Cross_Point1 = fix(1 + 9*rand); % 产生交叉子串