蚁群算法解TSP(3)-效果验证

引言

蚁群算法差不多已经水落石出了,本章作为该系列的最后一章,再提一些小细节供大家参考。一方面是蚁群算法涉及的一些参数,比如:挥发速率、能见度与信息素的控制因子、信息素增量的控制因子等;另一方面给出蚁群算法分别在10个城市、20个城市和31个城市的TSP问题中找到的最短环游路径结果,并与前面的遗传算法进行纵向比较。

参数配置

把所有可配置的参数归到Constant类,在其他类里通过静态变量的形式获取。当然更优雅的办法是写入一个properties.xml的文本文件中,规定好固定的key-value格式,然后调用java.util.Properties相关类读取,这样把静态或不易改变的数据从动态的程序中解耦出来,让数据由文本文件决定,从而完全不用再次编译程序,为后续维护、测试与调试带来极大便利(当然这个程序很小,所以基本或完全不需要这些考虑)。

class Constant 
{
    static int CITY_NUM; //城市数
    static Road[][] roads; //道路
    static final float C = 10.0f; //信息素初值
    static final int NC = 10; //环游总轮数
    static final int ANT_NUM = 10; //蚂蚁数
    static final int alpha = 2; //信息素控制因子
    static final int beta = 3; //能见度控制因子
    static final float p = 0.3f; //挥发速率
    static final float Q = 300.0f; //信息素增量控制因子
    
    static
    {
        //城市坐标
        int[][] cityPoint={
                {0,0},{12,32},{5,25},{8,45},{33,17},
                {25,7},{15,15},{15,25},{25,15},{41,12}};
        
        
        //确定城市数、构建道路
        CITY_NUM=cityPoint.length;
        roads = new Road[CITY_NUM][CITY_NUM];
        for(int i=0;i<CITY_NUM;i++)
            for(int j=0;j<CITY_NUM;j++)
                roads[i][j]=new Road();
        for(int i=0;i<CITY_NUM;i++)
        {
            for(int j=i;j<CITY_NUM;j++)
            {
                //计算长度
                float dis=(float)Math.sqrt(Math.pow((cityPoint[i][0] - cityPoint[j][0]),2) + Math.pow((cityPoint[i][1] - cityPoint[j][1]),2));
                //装入距离
                roads[i][j].distance=dis;
                roads[j][i].distance=dis;
            }
        }
    }
}

实验结果

我们分别选取网上一些公认的10个城市、20个城市和31个城市的坐标数据,及它们的最优解,来与本文的蚁群算法得到的解进行对比。下面是公认的地图数据:


本文的蚁群算法与遗传算法解TSP(3)-效果验证的对比结果如下表所示:

结语

仅依据上表显示结果的结果来看,我们不难得出以下一些结论:

  • 蚁群算法在城市较少时(10-20个城市)的性能相比遗传算法更好,但随着问题的规模增大(城市数目增加),蚁群算法容易陷入局部最优,很难发现全局最优解。
  • 遗传算法特有的选择算子、交叉算子、变异算子带来的随机性较大,导致收敛性不如蚁群算法。
  • 时间效率方面(本文未给出时间方面的结果),如果要找出长度大致相同的解,蚁群算法的速度更快。但遗传算法在问题规模、时间效率、解的质量三方面的平均效果更优。
    以上是本系列全部内容。若需要完整代码,可在我的GitHub上找到,对于代码和算法本身肯定都还有很多可以优化的地方,本文仅是给出了此算法的一个基本示例,更多深层次问题就等待大家去查阅、比较和实践了。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容