遗传算法之TSP问题

1、遗传算法

遗传算法的基本内容在之前的博客已经讲述过了,详情请点击:遗传算法

遗传算法的上一篇博客解决的是函数优化问题,即求解最大值或最小值问题;而此次要解决的是组合优化问题中的TSP问题,即旅行商问题。

旅行商问题:给定一系列城市位置,求解访问每一座城市一次并回到起始城市的最短回路,又称TSP问题。

TSP问题就是要找到图中的最短哈密尔顿回路,即全局最短路径。

那么,这两种到底有何区别呢?

在遗传算法的上一篇博客中,交叉变异操作是通过0与1之间相互转换即可简单实现。但在TSP问题中,若只采取简单的交换操作,则城市序列内容易包含重复的城市。

因此,TSP问题中的交叉操作:

  • 先确定两个城市序列中进行交换的城市。
  • 交换城市时,观察城市序列中是否会包含重复城市;若重复了,则增加一个交换操作。例如:已知城市序列1中的城市A与城市序列2中的城市B进行交叉操作,考虑城市A与城市B直接交换时,若交换过后的城市序列1中含有两个城市B,则将城市序列1中原来就已经含有的城市B换成城市A,城市序列2同理操作。

这样就满足了城市序列中不包含重复城市的要求。
若还不清楚,请看下面这个例子,当城市序列A、B如下:

未进行交叉操作前:
A: 7 6 5 4 3 2
B: 4 3 5 2 6 7

已知进行交换的城市为城市序列中的后三个城市,即城市序列A中的 4、3、2 城市与城市序列B中的 2、6、7 城市进行交换。

  • 城市序列A中:城市4替换成城市2,不包含重复城市;城市3替换成城市6,由于城市序列中已存在该城市,因此将城市序列中的城市6替换成城市3;城市2替换成城市7,由于城市序列中已存在该城市,因此将城市序列中的城市7替换成城市2。
  • 城市序列B中:城市2替换成城市4,由于城市序列中已存在该城市,因此将城市序列中的城市4替换成城市2;城市6替换成城市3,由于城市序列中已存在该城市,因此将城市序列中的城市3替换成城市6,城市7替换成城市2,不包含重复城市。

最终,交叉操作完成后的城市序列分别为:

交叉操作完成后:
A: 2 3 5 4 6 7
B: 2 6 5 4 3 2

TSP问题中的变异操作:直接将同一城市序列中的两个城市进行交换。

2、遗传算法实现TSP问题

2.1 代码

<1> city.m:随机生成N个城市的坐标并保存

N=25;		%%城市的个数
citys=randn(N,2);		%%随机生成城市位置
save citys.mat		%%将城市位置保存到citys.mat中

<2> plot_route.m:实现连点画图

%连点画图函数 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),1);
	    y0=a(R(i-1),2);
	    x1=a(R(i),1);
	    y1=a(R(i),2);
	    xx=[x0,x1];
	    yy=[y0,y1];
	    plot(xx,yy);
	    hold on;
	end
	
end

<3> mylength.m:计

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值