遗传算法tsp matlab代码
时间: 2023-09-04 10:08:04 浏览: 35
以下是一个简单的遗传算法TSP的Matlab代码实现:
```matlab
% 遗传算法TSP代码实现
% 假设有20个城市,距离矩阵为dist,种群大小为100,进化代数为200
% 初始化参数
n_city = 20; % 城市数量
n_gene = n_city; % 染色体长度
n_pop = 100; % 种群大小
n_gen = 200; % 进化代数
pc = 0.8; % 交叉概率
pm = 0.01; % 变异概率
pop = zeros(n_pop, n_gene); % 种群
fitness = zeros(n_pop, 1); % 适应度
best_route = zeros(n_gen, n_gene); % 记录每一代的最优路径
best_dist = zeros(n_gen, 1); % 记录每一代的最短距离
% 初始化种群
for i = 1:n_pop
pop(i,:) = randperm(n_gene);
end
% 迭代进化
for i_gen = 1:n_gen
% 计算适应度
for i_pop = 1:n_pop
route = pop(i_pop,:);
dist = 0;
for i_city = 1:n_city-1
dist = dist + dist(route(i_city), route(i_city+1));
end
dist = dist + dist(route(n_city), route(1));
fitness(i_pop) = 1/dist;
end
% 选择
[~, idx] = sort(fitness, 'descend');
pop = pop(idx,:);
% 记录最优路径和最短距离
best_route(i_gen,:) = pop(1,:);
best_dist(i_gen) = 1/fitness(1);
% 交叉
for i = 1:2:n_pop
if rand < pc
% 随机选择两个父代
parent1 = pop(i,:);
parent2 = pop(i+1,:);
% 随机生成交叉点
point = randi(n_gene-1);
% 交叉
child1 = parent1;
child2 = parent2;
child1(point+1:end) = parent2(point+1:end);
child2(point+1:end) = parent1(point+1:end);
% 更新种群
pop(i,:) = child1;
pop(i+1,:) = child2;
end
end
% 变异
for i = 1:n_pop
if rand < pm
% 随机选择两个变异点
point1 = randi(n_gene);
point2 = randi(n_gene);
% 交换
pop(i,[point1 point2]) = pop(i,[point2 point1]);
end
end
end
% 输出最优路径和最短距离
[~, idx] = max(best_dist);
best_route = best_route(idx,:);
best_dist = best_dist(idx);
disp(['最短距离: ' num2str(best_dist)]);
disp(['最优路径: ' num2str(best_route)]);
```
需要注意的是,该代码中距离矩阵`dist`需要自己输入或者生成,可以根据实际情况进行修改。同时,该代码只是一个简单的实现,可能存在优化的空间,可以根据实际需求进行改进。