上篇我们用遗传算法求解了方程,其中用到的编码方式是二进制的编码,实现起来相对简单很多,
就连交配和变异等操作也是比较简单,但是对于TSP问题,就稍微复杂一点,需要有一定的策略,
才能较好的实现。
这次的TSP问题的题目是:
随机产生10~30个城市,每个城市之间的距离也是随机产生,距离的范围是[1,50],求最优的路径
==========================================================
下面就是具体的求解,由于我的策略是基于知网上的《一种改进的遗传算法求解TSP问题》这篇文章,
所以把这篇文章先放上来。下面我简单介绍一下这篇文章关于求解TSP问题的策略,然后附上参照这篇
文章写的代码。
策略简述:
1、染色体编码
为了充分利用城市间相邻边的信息和距离的信息,不采用二进制编码而是采用整数编码,即每个染
色体都是一个1到N的排列,表示周游路线的城市间的先后顺序序列。
/// <summary> /// 初始化群体 /// </summary> static void Initial_Group() { int count = 0;//已产生个体数 List<int> myRoad = new List<int>(); string road = string.Empty;//个体的表现型 for (int i = 0; i < city_count; i++) { myRoad.Add(i); } while (count < gruopCount)//20个个体 { int tmp, index; for (int i = 0; i < myRoad.Count; i++)//随机交换得到一组路径(个体) { index = rd.Next(myRoad.Count); tmp = myRoad[i]; myRoad[i] = myRoad[index]; myRoad[index] = tmp; } for (int i = 0; i < myRoad.Count; i++)//将个体转化成路径存到种群中 { road += MyEncode(myRoad[i]);//自己编码如果大于10,转化成对应的符号 } group.Add(road); count++; road = ""; } //foreach (var item in group) //{ // Console.WriteLine(item + " " + Ca(item)); //} }
2、选择算子
这里没有采用轮盘赌算法,而是采用了锦标赛选择,即每次从群体中随机抽 取出M个个体,然后选
择其中适应值最好的进入下 一代,接着进行下一个锦标赛选择直至选出种群数目个个体为止。锦标
赛选择算子保证了更优的染色体能够有更大的存活机会,当然,同一个优秀的个体被多次选中也是
允许的。这里的M取2.
/// <summary> /// 选择(锦标赛) /// 思路:1.产生两个不同的随机数作为要参加锦标赛的两个个体;2.判断适应度大小, /// 小的被选择(最短路径) /// </summary> /// <param name="list">适应度集合</param> static void Selection(List<int> list) { int count = 0;//选择的数量 List<string> result = new List<string>();//选择的结果 while (count < gruopCount) { int test1 = rd.Next(0, gruopCount);//要参加锦标赛的的两个个体 int test2 = rd.Next(0, gruopCount); if (test1 != test2) { if (list[test1] >= list[test2]) { result.Add(group[test2]); } else { result.Add(group[test1]); } } count++; } //更新种群信息 for (int i = 0; i < result.Count; i++) { group[i] = result[i]; } }