上篇我们用遗传算法求解了方程,其中用到的编码方式是二进制的编码,实现起来相对简单很多,

就连交配和变异等操作也是比较简单,但是对于TSP问题,就稍微复杂一点,需要有一定的策略,

才能较好的实现。

这次的TSP问题的题目是:

随机产生10~30个城市,每个城市之间的距离也是随机产生,距离的范围是[1,50],求最优的路径

==========================================================

下面就是具体的求解,由于我的策略是基于知网上的一种改进的遗传算法求解TSP问题》这篇文章,

所以把这篇文章先放上来。下面我简单介绍一下这篇文章关于求解TSP问题的策略,然后附上参照这篇

文章写的代码。

策略简述:

1、染色体编码

为了充分利用城市间相邻边的信息和距离的信息,不采用二进制编码而是采用整数编码,即每个染

色体都是一个1到N的排列,表示周游路线的城市间的先后顺序序列。

遗传算法的简单应用-巡回旅行商(TSP)问题的求解
        /// <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));
            //}
        }    
View Code

2、选择算子

这里没有采用轮盘赌算法,而是采用了锦标赛选择,即每次从群体中随机抽 取出M个个体,然后选

择其中适应值最好的进入下 一代,接着进行下一个锦标赛选择直至选出种群数目个个体为止。锦标

赛选择算子保证了更优的染色体能够有更大的存活机会,当然,同一个优秀的个体被多次选中也是

允许的。这里的M取2.

遗传算法的简单应用-巡回旅行商(TSP)问题的求解
        /// <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];
            }
        }    
View Code

相关文章:

  • 2021-09-16
  • 2022-12-23
  • 2021-12-09
  • 2022-01-26
  • 2023-02-05
  • 2021-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-05-27
  • 2021-09-25
  • 2021-06-25
相关资源
相似解决方案