蟻群算法解TSP(3)-效果驗證

引言

蟻群算法差不多已經(jīng)水落石出了,本章作為該系列的最后一章,再提一些小細節(jié)供大家參考。一方面是蟻群算法涉及的一些參數(shù),比如:揮發(fā)速率、能見度與信息素的控制因子、信息素增量的控制因子等;另一方面給出蟻群算法分別在10個城市、20個城市和31個城市的TSP問題中找到的最短環(huán)游路徑結(jié)果,并與前面的遺傳算法進行縱向比較。

參數(shù)配置

把所有可配置的參數(shù)歸到Constant類,在其他類里通過靜態(tài)變量的形式獲取。當(dāng)然更優(yōu)雅的辦法是寫入一個properties.xml的文本文件中,規(guī)定好固定的key-value格式,然后調(diào)用java.util.Properties相關(guān)類讀取,這樣把靜態(tài)或不易改變的數(shù)據(jù)從動態(tài)的程序中解耦出來,讓數(shù)據(jù)由文本文件決定,從而完全不用再次編譯程序,為后續(xù)維護、測試與調(diào)試帶來極大便利(當(dāng)然這個程序很小,所以基本或完全不需要這些考慮)。

class Constant 
{
    static int CITY_NUM; //城市數(shù)
    static Road[][] roads; //道路
    static final float C = 10.0f; //信息素初值
    static final int NC = 10; //環(huán)游總輪數(shù)
    static final int ANT_NUM = 10; //螞蟻數(shù)
    static final int alpha = 2; //信息素控制因子
    static final int beta = 3; //能見度控制因子
    static final float p = 0.3f; //揮發(fā)速率
    static final float Q = 300.0f; //信息素增量控制因子
    
    static
    {
        //城市坐標(biāo)
        int[][] cityPoint={
                {0,0},{12,32},{5,25},{8,45},{33,17},
                {25,7},{15,15},{15,25},{25,15},{41,12}};
        
        
        //確定城市數(shù)、構(gòu)建道路
        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;
            }
        }
    }
}

實驗結(jié)果

我們分別選取網(wǎng)上一些公認(rèn)的10個城市、20個城市和31個城市的坐標(biāo)數(shù)據(jù),及它們的最優(yōu)解,來與本文的蟻群算法得到的解進行對比。下面是公認(rèn)的地圖數(shù)據(jù):


本文的蟻群算法與遺傳算法解TSP(3)-效果驗證的對比結(jié)果如下表所示:

結(jié)語

僅依據(jù)上表顯示結(jié)果的結(jié)果來看,我們不難得出以下一些結(jié)論:

  • 蟻群算法在城市較少時(10-20個城市)的性能相比遺傳算法更好,但隨著問題的規(guī)模增大(城市數(shù)目增加),蟻群算法容易陷入局部最優(yōu),很難發(fā)現(xiàn)全局最優(yōu)解。
  • 遺傳算法特有的選擇算子、交叉算子、變異算子帶來的隨機性較大,導(dǎo)致收斂性不如蟻群算法。
  • 時間效率方面(本文未給出時間方面的結(jié)果),如果要找出長度大致相同的解,蟻群算法的速度更快。但遺傳算法在問題規(guī)模、時間效率、解的質(zhì)量三方面的平均效果更優(yōu)。
    以上是本系列全部內(nèi)容。若需要完整代碼,可在我的GitHub上找到,對于代碼和算法本身肯定都還有很多可以優(yōu)化的地方,本文僅是給出了此算法的一個基本示例,更多深層次問題就等待大家去查閱、比較和實踐了。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容