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:计