遗传算法求最短路径

本文介绍了使用遗传算法寻找中国城市间最短路径的方法。通过随机生成初始种群,模拟进化过程,优化排列以求解最短总距离。程序仅采用变异操作,不进行交叉,并保留最优个体以加速优化。筛选标准为距离平均值的系数,同时对子序列进行局部优化。结果显示,保留最优个体策略能有效提升路径质量。
摘要由CSDN通过智能技术生成

无所事事,就想找个题目练一下遗传算法。然后想到可以用遗传算法找遍历给定城市的最短路径。从网上搜了一些中国的城市,各城市之间的距离取它们之间的直线距离,每个城市一个编号,然后每个所有编号构成的排列就是一个解,每个解会得到一个相应的总距离。问题就变成寻找最优排列的问题。

用遗传算法处理这个问题,先随机生成一群初始解作为初始种群。每个解作为一个个体可以进行增殖和变异,然后种群的数量增加,再通过筛选函数以更高的概率挑选一部分更加满足要求的个体进行增殖,通过数代的进化,以期得到总距离尽可能短的解。写好程序测试后发现效果还不错。

下面是对程序中一些问题的说明。遗传算法中的一步是要求两个个体通过交叉和变异产生一个新个体,模仿生物的有性生殖。但是对于两个12345或者31452的排列,实在不知道该怎么进行交叉。所以程序只对原始排列进行变异,但是不进行两个排列之间的交叉。

变异的方法可以有很多,这里为了提高程序的运行速度,把变异分为两点之间交换和两个序列之间的交换,其中序列交换时可以进行翻转。

在程序运行过程中发现种群的进化速度较慢,一些优秀的个体会因为随机性被淘汰,所以程序里加上了保留最优个体的规则。尽管这样做可能会降低种群的多样性,降低算法对所有解的“遍历性”,但是实践发现确实能够得到更好的解,而且解优化的速度快很多。不保留最优个体的时候优化速度在越接近极值的时候速度越慢,甚至不会进一步优化。也许是因为这时候选择压力太小了,可能一个更好的办法是提供一个可变的选择压力而不是保留最优个体。

至于筛选函数,不知道该怎么做到尽可能好,就简单的选择了距离平均值乘一个系数作为筛选标准。为了防止出现大小年的现象,进行了二次筛选。

为了提高序列的质量,对序列的子序列进行了优化,重新排列相邻的四个值,使新的子序列对应的长度最小。

为了图简单,程序需要的各城市之间距离的矩阵和城市名直接写在程序里了,改成从文件里读取也是很容易的。

代码如下:

  1 #include <iostream>
  2 #include <algorithm>
  3 #include <list>
  4 #include <random>
  5 #define NUM 37
  6 
  7 double dis_mat[NUM][NUM] = {
   {
   0.00,101.26,543.55,624.38,270.58,408.52,421.60,618.75,457.61,855.97,1052.50,1066.24,897.04,1050.24,1341.21,1884.46,2287.62,2051.23,1522.09,1462.87,1024.61,1124.39,1206.52,1377.53,898.06,1564.50,1726.42,1248.46,362.94,1718.93,2417.35,1328.53,1185.95,917.73,2090.88,2575.17,1735.43}
  8 ,{
   101.26,0.00,442.45,581.22,268.00,427.52,505.13,601.62,386.93,857.93,1065.92,966.74,804.46,985.11,1280.91,1816.36,2229.02,2003.83,1521.70,1444.72,926.52,1028.59,1107.84,1282.31,813.68,1474.14,1640.55,1171.72,278.25,1623.61,2502.20,1374.80,1223.32,915.77,2073.10,2608.50,1704.83}
  9 ,{
   543.55,442.45,0.00,617.67,566.63,717.80,920.76,690.41,335.80,970.23,1199.59,550.96,468.91,821.97,1117.58,1585.54,2037.59,1874.12,1622.44,1474.56,527.26,646.97,697.39,897.52,546.73,1119.76,1311.45,920.28,301.46,1232.26,2897.35,1655.67,1480.03,1055.27,2079.11,2815.16,1665.86}
 10 ,{
   624.38,581.22,617.67,0.00,374.61,361.57,698.60,1152.84,844.16,1425.05,1640.78,821.18,556.95,461.60,730.30,1286.82,1669.30,1426.87,1008.78,885.79,749.88,784.81,914.64,996.41,461.14,1106.84,1220.35,703.70,369.87,1314.75,2448.23,1092.94,905.93,441.65,1509.29,2201.37,1126.66}
 11 ,{
   270.58,268.00,566.63,374.61,0.00,166.63,389.01,869.08,633.73,1119.95,1321.31,994.58,774.86,826.65,1104.36,1658.56,2043.48,1793.95,1256.65,1192.29,938.06,1014.70,1120.55,1257.41,736.12,1412.72,1552.72,1050.21,276.53,1594.22,2331.46,1125.98,966.09,650.88,1820.34,2345.77,1467.15}
 12 ,{
   408.52,427.52,717.80,361.57,166.63,0.00,337.38,1023.15,800.08,1264.37,1457.52,1098.63,858.07,820.85,1073.64,1634.38,1992.72,1722.71,1116.61,1076.41,1035.97,1097.63,1214.46,1328.76,793.72,1459.84,1580.80,1065.20,418.00,1657.76,2190.94,959.58,799.73,516.59,1700.25,2181.53,1368.71}
 13 ,{
   421.60,505.13,920.76,698.60,389.01,337.38,0.00,987.11,878.93,1173.66,1330.62,1382.60,1162.70,1158.18,1406.02,1967.04,2311.62,2026.95,1318.04,1332.96,1326.93,1402.90,1509.54,1643.36,1115.27,1788.37,1915.69,1401.75,656.00,1977.98,1997.27,969.74,860.07,766.65,1937.12,2235.80,1646.09}
 14 ,{
   618.75,601.62,690.41,1152.84,869.08,1023.15,987.11,0.00,354.93,282.49,510.81,1191.46,1158.81,1483.23,1784.60,2273.73,2719.84,2534.78,2122.56,2034.63,1189.05,1316.28,1335.14,1554.70,1232.31,1792.40,1992.59,1608.16,790.12,1872.38,2905.84,1939.59,1803.11,1516.90,2661.05,3192.79,2276.35}
 15 ,{
   457.61,386.93,335.80,844.16,633.73,800.08,878.93,354.93,0.00,636.02,865.14,856.45,804.63,1136.29,1436.51,1919.09,2367.11,2190.09,1843.57,1729.35,846.15,971.18,1002.69,1215.62,877.98,1447.06,1643.36,1253.51,474.37,1542.04,2871.80,1757.05,1599.79,1246.32,2349.41,2977.03,1951.37}
 16 ,{
   855.97,857.93,970.23,1425.05,1119.95,1264.37,1173.66,282.49,636.02,0.00,229.38,1454.15,1437.28,1765.40,2066.86,2555.06,3002.22,2816.23,2376.46,2301.38,1457.33,1585.66,1594.98,1818.31,1513.98,2060.56,2264.18,1889.49,1067.34,2127.68,2997.08,2142.22,2019.46,1770.83,2929.28,3405.84,2551.05}
 17 ,{
   1052.50,1065.92,1199.59,1640.78,1321.31,1457.52,1330.62,510.81,865.14,229.38,0.00,1679.15,1666.61,1991.71,2293.36,2784.24,3230.47,3040.85,2573.83,2510.29,1684.25,1812.82,1818.68,2043.19,1742.99,2286.99,2491.73,2118.66,1288.47,2348.69,3059.36,2299.04,2187.82,1970.20,3138.77,3565.77,2767.42}
 18 ,{
   1066.24,966.74,550.96,821.18,994.58,1098.63,1382.60,1191.46,856.45,1454.15,1679.15,0.00,269.60,680.39,887.38,1201.33,1675.07,1596.81,1656.10,1438.49,75.92,160.69,146.97,364.15,401.49,610.52,821.95,603.48,730.77,685.79,3266.39,1903.85,1713.65,1218.13,1957.10,2910.99,1521.19}
 19 ,{
   897.04,804.46,468.91,556.95,774.86,858.07,1162.70,1158.81,804.63,1437.28,1666.61,269.60,0.00,450.20,706.81,1124.68,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值