遗传算法求解货郎担问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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); % 产生交叉子串

相关文档
最新文档