遗传算法解决旅行商问题

旅行商问题简介

给定一系列城市和每对城市之间的距离,求解访问每一座城市一次并回到起始城市的最短回路。它是组合优化中的一个NP难问题,在运筹学和理论计算机科学中非常重要。

遗传算法

遗传算法已经在之前的博客详细介绍过:遗传算法 因此这边不再多加赘述
由于上次解决的是使用遗传算法解决函数优化问题,交叉操作只要交换0和1就行,而在这次问题中,随机选择两个个体,再随机选择一段基因进行交换,以完成交叉操作,很容易在城市序列中包含重复的城市。
比如一下两个个体之间的交叉
A: 9 1 2 3 5 4 7 6 8 10
B: 10 5 6 4 3 8 7 2 1 9
得到
A: 9 1 2 4 3 8 7 6 8 10
B: 10 5 6 3 5 4 7 2 1 9
可见,两者交换基因段为3 5 4 7和4 3 8 7,保持此段不变,对于A,第一个冲突基因为8,将交换段外冲突基因替换为B中相应位置的基因即5,多次执行直到没有冲突得到基因:
A:9 1 2 4 3 8 7 6 5 10
B:10 8 6 3 5 4 7 2 1 9

而变异操作则是将同一城市序列的两个城市进行交换

代码展示

变异函数 Mutation.m

function a=Mutation(A)
index1=0;index2=0;
nnper=randperm(size(A,2));
index1=nnper(1);
index2=nnper(2);
%fprintf('index1=%d ',index1);
%fprintf('index2=%d ',index2);
temp=0;
temp=A(index1);
A(index1)=A(index2);
A(index2)=temp;
a=A;

end

对调函数 exchange.m

function [x,y]=exchange(x,y)
temp=x;
x=y;
y=temp;
 
end

染色体的路程代价函数 mylength.m

function len=myLength(D,p)%p是一个排列
[N,NN]=size(D);
len=D(p(1,N),p(1,1));
for i=1:(N-1)
    len=len+D(p(1,i),p(1,i+1));
end
end

连点画图函数 plot_route.m

function plot_route(a,R)
scatter(a(:,1),a(:,2),'rx');
hold on;
plot([a(R(1),1),a(R(length(R)),1)],[a(R(1),2),a(R(length(R)),2)]);
hold on;
for i=2:length(R)
    x0=a(R(i-1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值