1. 程式人生 > >蟻群演算法程式碼實現

蟻群演算法程式碼實現

旅行商問題大都是用遺傳演算法求解,不過蟻群演算法比它高效得多,在百度的蟻群演算法吧裡有人發了個註釋清晰的程式碼,有興趣的可以去研究一下蟻群演算法和模擬退火演算法,這兩者都可以解決旅行商問題。而關於遺傳演算法和模擬退火演算法,部落格園裡的某位牛人很清楚地介紹了,發個連結吧

這裡發個貼吧裡面的蟻群演算法程式碼。

// AO.cpp : 定義控制檯應用程式的入口點。
#pragma once

#include <iostream>
#include <math.h>
#include <time.h>

const double ALPHA=1.0; //啟發因子,資訊素的重要程度
const double BETA=2.0;  //期望因子,城市間距離的重要程度
const double ROU=0.5; //資訊素殘留引數

const int N_ANT_COUNT=34; //螞蟻數量
const int N_IT_COUNT=1000; //迭代次數
const int N_CITY_COUNT=51; //城市數量

const double DBQ=100.0; //總的資訊素
const double DB_MAX=10e9; //一個標誌數,10的9次方

double g_Trial[N_CITY_COUNT][N_CITY_COUNT];//兩兩城市間資訊素,就是環境資訊素
double g_Distance[N_CITY_COUNT][N_CITY_COUNT]; //兩兩城市間距離

//eil51.tsp城市座標資料
double x_Ary[N_CITY_COUNT]=
{
   37,49,52,20,40,21,17,31,52,51,
   42,31,5,12,36,52,27,17,13,57,
   62,42,16,8,7,27,30,43,58,58,
   37,38,46,61,62,63,32,45,59,5,
   10,21,5,30,39,32,25,25,48,56,
    30
};

double y_Ary[N_CITY_COUNT]=
{
   52,49,64,26,30,47,63,62,33,21,
   41,32,25,42,16,41,23,33,13,58,
   42,57,57,52,38,68,48,67,48,27,
   69,46,10,33,63,69,22,35,15,6,
   17,10,64,15,10,39,32,55,28,37,
    40
};

//返回指定範圍內的隨機整數
int rnd(int nLow,int nUpper)
{
    returnnLow+(nUpper-nLow)*rand()/(RAND_MAX+1);
}

//返回指定範圍內的隨機浮點數
double rnd(double dbLow,double dbUpper)
{
    doubledbTemp=rand()/((double)RAND_MAX+1.0);
    returndbLow+dbTemp*(dbUpper-dbLow);
}

//返回浮點數四捨五入取整後的浮點數
double ROUND(double dbA)
{
    return(double)((int)(dbA+0.5));
}

//定義螞蟻類
class CAnt
{
public:
   CAnt(void);
   ~CAnt(void);

public:

    intm_nPath[N_CITY_COUNT]; //螞蟻走的路徑
    doublem_dbPathLength; //螞蟻走過的路徑長度

    intm_nAllowedCity[N_CITY_COUNT]; //沒去過的城市
    intm_nCurCityNo; //當前所在城市編號
    intm_nMovedCityCount; //已經去過的城市數量

public:

    intChooseNextCity(); //選擇下一個城市
    void Init();//初始化
    void Move();//螞蟻在城市間移動
    voidSearch(); //搜尋路徑
    voidCalPathLength(); //計算螞蟻走過的路徑長度

};

//建構函式
CAnt::CAnt(void)
{
}

//解構函式
CAnt::~CAnt(void)
{
}

//初始化函式,螞蟻搜尋前呼叫
void CAnt::Init()
{

    for (inti=0;i<N_CITY_COUNT;i++)
    {
       m_nAllowedCity[i]=1; //設定全部城市為沒有去過
       m_nPath[i]=0; //螞蟻走的路徑全部設定為0
    }

   //螞蟻走過的路徑長度設定為0
   m_dbPathLength=0.0;

   //隨機選擇一個出發城市
   m_nCurCityNo=rnd(0,N_CITY_COUNT);

   //把出發城市儲存入路徑陣列中
   m_nPath[0]=m_nCurCityNo;

   //標識出發城市為已經去過了
   m_nAllowedCity[m_nCurCityNo]=0;

   //已經去過的城市數量設定為1
   m_nMovedCityCount=1;

}

//選擇下一個城市
//返回值 為城市編號
int CAnt::ChooseNextCity()
{

    intnSelectedCity=-1; //返回結果,先暫時把其設定為-1

   //==============================================================================
   //計算當前城市和沒去過的城市之間的資訊素總和
   
    doubledbTotal=0.0;   
    doubleprob[N_CITY_COUNT]; //儲存各個城市被選中的概率

    for (inti=0;i<N_CITY_COUNT;i++)
    {
       if (m_nAllowedCity[i] == 1) //城市沒去過
       {
           prob[i]=pow(g_Trial[m_nCurCityNo][i],ALPHA)*pow(1.0/g_Distance[m_nCurCityNo][i],BETA);//該城市和當前城市間的資訊素
           dbTotal=dbTotal+prob[i]; //累加資訊素,得到總和
       }
       else //如果城市去過了,則其被選中的概率值為0
       {
           prob[i]=0.0;
       }
    }

   //==============================================================================
   //進行輪盤選擇
    doubledbTemp=0.0;
    if (dbTotal> 0.0) //總的資訊素值大於0
    {
       dbTemp=rnd(0.0,dbTotal); //取一個隨機數

       for (int i=0;i<N_CITY_COUNT;i++)
       {
           if (m_nAllowedCity[i] == 1) //城市沒去過
           {
               dbTemp=dbTemp-prob[i]; //這個操作相當於轉動輪盤,如果對輪盤選擇不熟悉,仔細考慮一下
               if (dbTemp < 0.0) //輪盤停止轉動,記下城市編號,直接跳出迴圈

 {
                   nSelectedCity=i;
                   break;
               }
           }
       }
    }

   //==============================================================================
   //如果城市間的資訊素非常小 ( 小到比double能夠表示的最小的數字還要小 )
   //那麼由於浮點運算的誤差原因,上面計算的概率總和可能為0
   //會出現經過上述操作,沒有城市被選擇出來
   //出現這種情況,就把第一個沒去過的城市作為返回結果
   
   //題外話:剛開始看的時候,下面這段程式碼困惑了我很長時間,想不通為何要有這段程式碼,後來才搞清楚。
    if(nSelectedCity == -1)
    {
       for (int i=0;i<N_CITY_COUNT;i++)
       {
           if (m_nAllowedCity[i] == 1) //城市沒去過
           {
               nSelectedCity=i;
               break;
           }
       }
    }

   //==============================================================================
   //返回結果,就是城市的編號
    returnnSelectedCity;
}


//螞蟻在城市間移動
void CAnt::Move()
{
    intnCityNo=ChooseNextCity(); //選擇下一個城市

   m_nPath[m_nMovedCityCount]=nCityNo; //儲存螞蟻走的路徑
   m_nAllowedCity[nCityNo]=0;//把這個城市設定成已經去過了
   m_nCurCityNo=nCityNo; //改變當前所在城市為選擇的城市
   m_nMovedCityCount++; //已經去過的城市數量加1
}

//螞蟻進行搜尋一次
void CAnt::Search()
{
    Init();//螞蟻搜尋前,先初始化

   //如果螞蟻去過的城市數量小於城市數量,就繼續移動
    while(m_nMovedCityCount < N_CITY_COUNT)
    {
       Move();
    }

   //完成搜尋後計算走過的路徑長度
   CalPathLength();
}


//計算螞蟻走過的路徑長度
void CAnt::CalPathLength()
{

   m_dbPathLength=0.0; //先把路徑長度置0
    intm=0;
    int n=0;

    for (inti=1;i<N_CITY_COUNT;i++)
    {
       m=m_nPath[i];
       n=m_nPath[i-1];
       m_dbPathLength=m_dbPathLength+g_Distance[m][n];
    }

   //加上從最後城市返回出發城市的距離
   n=m_nPath[0];
   m_dbPathLength=m_dbPathLength+g_Distance[m][n];   

}


//tsp類
class CTsp
{
public:
   CTsp(void);
   ~CTsp(void);

public:
    CAntm_cAntAry[N_ANT_COUNT]; //螞蟻陣列
    CAntm_cBestAnt; //定義一個螞蟻變數,用來儲存搜尋過程中的最優結果
                                       //該螞蟻不參與搜尋,只是用來儲存最優結果

public:

   //初始化資料
    voidInitData();

   //開始搜尋
    voidSearch();

   //更新環境資訊素
    voidUpdateTrial();


};


//建構函式
CTsp::CTsp(void)
{
}

CTsp::~CTsp(void)
{
}


//初始化資料
void CTsp::InitData()
{

   //先把最優螞蟻的路徑長度設定成一個很大的值
   m_cBestAnt.m_dbPathLength=DB_MAX;

   //計算兩兩城市間距離
    doubledbTemp=0.0;
    for (inti=0;i<N_CITY_COUNT;i++)
    {
       for (int j=0;j<N_CITY_COUNT;j++)
       {
           dbTemp=(x_Ary[i]-x_Ary[j])*(x_Ary[i]-x_Ary[j])+(y_Ary[i]-y_Ary[j])*(y_Ary[i]-y_Ary[j]);
           dbTemp=pow(dbTemp,0.5);
           g_Distance[i][j]=ROUND(dbTemp);
       }
    }

   //初始化環境資訊素,先把城市間的資訊素設定成一樣
   //這裡設定成1.0,設定成多少對結果影響不是太大,對演算法收斂速度有些影響
    for (inti=0;i<N_CITY_COUNT;i++)
    {
       for (int j=0;j<N_CITY_COUNT;j++)
       {
           g_Trial[i][j]=1.0;
       }
    }

}


//更新環境資訊素
void CTsp::UpdateTrial()
{
   //臨時陣列,儲存各只螞蟻在兩兩城市間新留下的資訊素
    doubledbTempAry[N_CITY_COUNT][N_CITY_COUNT];
   memset(dbTempAry,0,sizeof(dbTempAry)); //先全部設定為0

   //計算新增加的資訊素,儲存到臨時數組裡
    intm=0;
    intn=0;
    for (inti=0;i<N_ANT_COUNT;i++) //計算每隻螞蟻留下的資訊素
    {
           for (int j=1;j<N_CITY_COUNT;j++)
           {
               m=m_cAntAry[i].m_nPath[j];
               n=m_cAntAry[i].m_nPath[j-1];
               dbTempAry[n][m]=dbTempAry[n][m]+DBQ/m_cAntAry[i].m_dbPathLength;
               dbTempAry[m][n]=dbTempAry[n][m];
           }

           //最後城市和開始城市之間的資訊素
           n=m_cAntAry[i].m_nPath[0];
           dbTempAry[n][m]=dbTempAry[n][m]+DBQ/m_cAntAry[i].m_dbPathLength;
           dbTempAry[m][n]=dbTempAry[n][m];

    }

   //==================================================================
   //更新環境資訊素
    for (inti=0;i<N_CITY_COUNT;i++)
    {
       for (int j=0;j<N_CITY_COUNT;j++)
       {
           g_Trial[i][j]=g_Trial[i][j]*ROU+dbTempAry[i][j]; //最新的環境資訊素 =留存的資訊素 + 新留下的資訊素
       }
    }

}


void CTsp::Search()
{

    charcBuf[256]; //列印資訊用

   //在迭代次數內進行迴圈
    for (inti=0;i<N_IT_COUNT;i++)
    {
       //每隻螞蟻搜尋一遍
       for (int j=0;j<N_ANT_COUNT;j++)
       {
           m_cAntAry[j].Search();
       }

       //儲存最佳結果
       for (int j=0;j<N_ANT_COUNT;j++)
       {
           if (m_cAntAry[j].m_dbPathLength <m_cBestAnt.m_dbPathLength)
           {
               m_cBestAnt=m_cAntAry[j];
           }
       }

       //更新環境資訊素
       UpdateTrial();

       //輸出目前為止找到的最優路徑的長度
       sprintf(cBuf,"\n[%d] %.0f",i+1,m_cBestAnt.m_dbPathLength);
       printf(cBuf);
    }

}

int main()
{
   //用當前時間點初始化隨機種子,防止每次執行的結果都相同
    time_ttm;
   time(&tm);
    unsigned intnSeed=(unsigned int)tm;
   srand(nSeed);

   //開始搜尋
    CTsptsp;

   tsp.InitData(); //初始化
   tsp.Search(); //開始搜尋

   //輸出結果
   printf("\nThe best tour is :\n");

    charcBuf[128];
    for (inti=0;i<N_CITY_COUNT;i++)
    {
       sprintf(cBuf,"d ",tsp.m_cBestAnt.m_nPath[i]+1);
       if (i % 20 == 0)
       {
           printf("\n");
       }
       printf(cBuf);
    }

   printf("\n\nPress any key to exit!");
   getchar();

    return0;
}

三、改進的蟻群演算法[3]

蟻群演算法具有如下一些優點:①通用性較強,能夠解決很多可以轉換為連通圖結構的路徑優化問題;②同時具有正負反饋的特點,通過正反饋特點利用區域性解構造全域性解,通過負反饋特點也就是資訊素的揮發來避免演算法陷入區域性最優;③有間接通訊和自組織的特點,螞蟻之間並沒有直接聯絡,而是通過路徑上的資訊素來進行間接的資訊傳遞,自組織性使得群體的力量能夠解決問題。

但是,基本蟻群演算法也存在一些缺點:①從蟻群演算法的複雜度來看,該演算法與其他演算法相比,所需要的搜尋時間較長;②該演算法在搜尋進行到一定程度以後,容易出現所有螞蟻所發現的解完全一致這種“停滯現象”,使得搜尋空間受到限制

3.1基於遺傳學的改進蟻群演算法研究

該文獻[2]提出的演算法彌補了基本蟻群演算法中“容易陷入停滯狀態”和“盲目隨機搜尋”的不足。文獻中提出的解決辦法是在每一次迭代搜尋後,都把當前解和最優解進行交叉變異,這樣既能搜尋更大的解空間,又能使系統陷入區域性最優後跳出停滯狀態。

這種基於遺傳學的蟻群演算法(G-蟻群演算法)的基本思想是在以蟻群演算法為主體的基礎上引入遺傳演算法的思想,目的是讓蟻群演算法經過迭代產生遺傳演算法所需的初始種群資料,提高種群資料的多樣性。然後,遺傳演算法經過選擇、交叉和變異操作,將處理後的資料交由蟻群演算法模組進行判斷處理,若滿足結束條件則退出系統,否則重新進行迭代操作。

該文獻中的交叉操作採用了Davis提出的OX交叉運算元,即按照交叉概率Pc進行交叉操作,通過一個親體中挑選出的子序列路徑作為後代相對位置的子序列,變異操作以變異概率Pm執行變異操作,在子代序列路徑中隨機選擇兩點進行變異操作,在交叉變異操作結束後,判斷當前解是否滿足收斂條件,若滿足收斂條件則更新當前最優解,返回蟻群演算法程式,執行下一次的迭代操作。若不滿足收斂條件則繼續進行遺傳演算法的交叉變異操作。

3.2蟻群系統(Ant System,AS)

蟻群系統是Gambardella等人於1996年提出的一種修正的蟻群演算法。

該演算法的基本思想是:

(1)引入一個新的常量 ,其取值範圍為 ,在螞蟻k每次選擇路徑之前先產生一個隨機數 ,且有 ,有了這個隨機數之後,螞蟻k的路徑將會按照下面的規則進行。

在公式中,假設螞蟻k當前所在的節點為i,那麼螞蟻k由節點i向點節j移動遵循的規則用公式PP表示如下:

                   蟻群優化演算法ACO - Meya - 甜蜜Me,樂悠You

 (2)對全域性資訊素更新策略的改進

按照最短路徑更新全域性資訊素,其具體更新方法如下:

蟻群優化演算法ACO - Meya - 甜蜜Me,樂悠You

  式(3-2)中其中 為資訊素揮發引數, ;式(3-3)中, 表示本次迴圈之後路徑(i,j)上的資訊素增量; 表示到目前為止找出的全域性最優路徑。

(3)對區域性資訊素更新策略也進行了改進

                        蟻群優化演算法ACO - Meya - 甜蜜Me,樂悠You

式(3-4)表示螞蟻從節點i轉移到節點j後,其經過的路徑(i, j)上的資訊素更新的方式。其中, 為常數,表示演算法初始化時路徑上的資訊素濃度; 為可調引數, 。

3.3 精英蟻群系統(Elitist Ant System,EAS)

精英蟻群系統是對AS的第一次改進,是學者們為了解決基本蟻群演算法求解大規模問題時收斂速度慢、不容易產生優化解而提出的。

該演算法具體的改進策略如 :                              

蟻群優化演算法ACO - Meya - 甜蜜Me,樂悠You

 式(3-6)表示資訊素增加強度定義方法,和以前的相同, 是調整最優解的影響權重的引數,適當的設定該引數的值可以提高演算法的效能;式(3-7)表示精英螞蟻給路徑(i,j)上所增加的資訊素量。

3.4 最大最小蟻群系統(Max-Min Ant System,MMAS)

“最大最小蟻群系統”是德國學者Thomas Stutzle 等提出的另一種通用性較強的改進的蟻群演算法。該演算法相比基本蟻群演算法作了如下一些改進:

(1)一次迴圈結束後,並不是所有的螞蟻都進行資訊素更新,而是隻對一隻螞蟻的資訊素進行更新。這隻螞蟻只能是兩類螞蟻:在當前迴圈中找到最優解的螞蟻或者是可能發現已知最優路徑的螞蟻。其資訊素更新依照如下規則:            

蟻群優化演算法ACO - Meya - 甜蜜Me,樂悠You

 式 (3-9)中 根據進行資訊素更新的螞蟻的類別可以是已知的最優解的路徑長度或者是本次迴圈中的最優解的路徑長度。

(2)資訊素濃度的限制。

為了防止某條路徑上的資訊素出現大或者過小的極端情況,設定資訊素濃度區間為 。通過這種方式使得在某條路徑上的資訊素濃度增大到超過區間上限或者減小到低於區間下限時,演算法採用強制手段對其進行調整,以此提高演算法的有效性。

(3)為了在開始吸引更多的螞蟻進行搜尋,資訊素濃度初始化的值不再是一個常數,而是設定為區間的上限 ,並且選定一個較小的揮發係數,以此來得到更多的搜尋路徑。

3.5排序蟻群系統(Rank-Based Ant System,ASrank)

排序蟻群系統引入了遺傳演算法中排序的觀念,其改進的基本原理是:每隻螞蟻釋放的資訊素揮發程度受到它們各自的等級的影響,按照各自等級的高低來決定揮發程度的高低。當每隻螞蟻都生成一條路徑以後,根據其各自的路徑長度進行由短到長的排序,路徑長度越短的代表等級越高,反之越低。因此,在更新資訊素時,並不是考慮所有的螞蟻,只考慮比較“優秀”的 只螞蟻( 表示螞蟻的排名)。

蟻群優化演算法ACO - Meya - 甜蜜Me,樂悠You

 式(3-11)中, 按照式(3-7)的方式計算;式(3-12)中, 表示排名在第 位的螞蟻環遊的長度。

3.6 幾種改進的蟻群演算法的比較

(1)對比基本蟻群演算法(ACA),AS 演算法、EAS 演算法、MMAS 演算法以及ASrank演算法的共同之處就是它們都允許最優解所在的路徑上的資訊素進行加強,有效地利用了最優解,但是這樣產生了一個弊端就是可能會導致搜尋中出現停滯現象。

(2)針對避免停滯現象,幾種改進演算法採取的策略不同。蟻群系統通過增加區域性資訊素的更新來減少路徑上的資訊素量,以此讓後面的螞蟻選擇這條路徑的可能性減小;在 MMAS 演算法中,採用的是給定資訊素量的上下限,以此使得路徑上的資訊素量不會小於下限(某一最小值),也不會超過上限(某一最大值),避免所有螞蟻選擇同一條路徑,也就是避免了搜尋中出現停滯現象。

四、ACO應用進展及發展趨勢

4.1應用的進展[7]

自從ACO在一些經典的組合規劃問題如TSP和QAP等NP難的組合優化問題上取得成功以來,目前已陸續滲透到許多新的實際的工程領域中。

(1)在各種工程和工業生產中的應用[4,5]。例如採用ACO的思想來求解大規模積體電路綜合佈線問題。在佈線過程中,各個引腳對螞蟻的引力可根據引力函式來計算。各個線網agent根據啟發策略,像蟻群一樣在開關盒網格上爬行,所經之處便布上1條金屬線,歷經1個線網的所有引腳之後,線網便布通了。

(2) ACO在各種實際規劃問題中的應用。例如在機器人路徑規劃中的應用[6]。機器人作為一種智慧體,在複雜工作環境下的路徑規劃問題、多機器人之間的協作策略問題,在很大程度上類似於螞蟻覓食優選路徑以及螞蟻群體中個體之間通過資訊素形成協作。路徑規劃演算法是實現機器人控制和導航的基礎之一,試驗證明ACO解決該問題有很大的優越性。

 另外,ACO在動態優化組合問題中也有應用,具體是在有向連線的網路路由和無連線網路系統路由中的應用。其他應用還包括螞蟻人工神經網路、車輛路線問題(Vehicle Routine Prob-lem,VRP)、在影象處理和模式識別領域的應用等等。

4.2 存在的問題[8]

蟻群演算法的研究成果令人矚目,但作為一種較新的理論,它依然存在一些問題。

(1)對於大規模組合優化問題,演算法的計算時間而且複雜。由於蟻群演算法的時間複雜度是,因此在處理較大規模的組合優化問題時,運算量較大,時間較長。

(2)演算法容易在某個或某些區域性最優解的鄰域附近發生停滯現象,造成早熟收斂,即搜尋進行到一定程度後,所有螞蟻發現的解完全一致,不能繼續對解空間進一步搜尋,不利於發現全域性最優解。

(3)不能較好的解決連續域問題。

(4)由於蟻群演算法中螞蟻個體的運動過程的隨機性,當群體規模設定較大時,很難在較短時間內從雜亂無章的路徑中找出一條較好的路徑。

(5)資訊素更新策略,路徑搜尋策略和最優解保留策略都帶有經驗性,沒有經過嚴格的理論論證。因此基本蟻群演算法的求解效率不高、收斂性較差、求解結果具有較大的分散性。

4.3 發展趨勢

隨著蟻群演算法在工程實踐中應用的深入和系統複雜性的增加,需要處理的資料量也越來越大,這些問題的影響日益突出,使得單純一到兩種智慧方法往往不能很好的解決問題。由於蟻群演算法易與其他進化演算法或者區域性搜尋演算法結合。所以如何根據實際情況融合多種智慧方法必將成為今後蟻群演算法新的研究熱點。目前,蟻群演算法的研究大多集中在演算法、模型的更新,以及軟體的開發上,所處理的資料也都是靜態的。硬體的執行速度要高於軟體,如何利用硬體的優勢,利用DSP,FPGA和PLC等硬體實現蟻群演算法,並使它能夠應用於實時系統將是以後研究的一個方向。

 參考文獻

[1] 吳慶洪,張穎,馬宗民.蟻群演算法綜述[A].2011.

[2] 張懷鋒,宋順林.基於遺傳學的改進蟻群演算法研究[M].2011.

[3] 曾雲.基於改進蟻群演算法的物流配送路徑優化研究[D].北京:北京物資學院,2012.

[4] 莊昌文,範明鈺,李春輝,虞厥邦.基於協同工作方式的一種蟻群佈線系統[J].半導體學報,1999,20(5):400-406.

[5] COELLO C A C,GUTIERREZ R L Z,GARCIA B M,et al.Automated Design of Combinational Logic Circuits Using the Ant System [J].Engineering Optimization,2002,34(2):109-127

[6]樊曉平,羅 熊,易晟,張航.複雜環境下基於蟻群優化演算法的機器人路徑規劃[J].控制與決策,2004,19(2):166-170.

[7] 葉志偉,周欣,夏彬.蟻群演算法研究應用現狀與展望[A].2010.

[8]戴巨集發,張源原,孫國強,劉成亮.蟻群演算法研究現狀及發展[A].2011


相關推薦

演算法程式碼實現

旅行商問題大都是用遺傳演算法求解,不過蟻群演算法比它高效得多,在百度的蟻群演算法吧裡有人發了個註釋清晰的程式碼,有興趣的可以去研究一下蟻群演算法和模擬退火演算法,這兩者都可以解決旅行商問題。而關於遺傳演算法和模擬退火演算法,部落格園裡的某位牛人很清楚地介紹了,發個連結吧

演算法Python實現

解決的問題 三維地形中,給出起點和重點,找到其最優路徑。 作圖原始碼: from mpl_toolkits.mplot3d import proj3d from mpl_toolkits.mplot3d import Axes3D import n

2018-4-8演算法---包子陽《智慧優化演算法以及Matlab實現》第五章

資料來源:《智慧優化演算法以及matlab實現》包子陽  餘繼周 編著第五章-----蟻群演算法是一種元啟發式優化演算法(自己理解:就是作為群體的單位個體也就是元,在裡面充當著隨機的選擇搜尋的方向,有助於全域性勘探)啟發:自然界的螞蟻有能力在沒有然和提示的情況下找到從巢穴矩離

演算法原理詳解和matlab程式碼

1原理: 螞蟻在尋找食物源的時候,能在其走過的路徑上釋放一種叫資訊素的激素,使一定範圍內的其他螞蟻能夠察覺到。當一些路徑上通過的螞蟻越來越多時,資訊素也就越來越多,螞蟻們選擇這條路徑的概率也就越高,結果導致這條路徑上的資訊素又增多,螞蟻走這條路的概率又增加,生生

演算法---matlab程式碼

蟻群演算法簡介 蟻群是自然界中常見的一種生物,人們對螞蟻的關注大都是因為“蟻群搬家,天要下雨”之類的民諺。然而隨著近代仿生學的發展,這種似乎微不足道的小東西越來越多地受到學者們地關注。 1991 年義大利學者 M. Dorigo 等人首先提出了蟻

演算法的Python 實現

# -*- coding: utf-8 -*- """ Created on Wed Jun 08 15:21:03 2016 @author: SYSTEM """ import os os.getcwd() import numpy as np import ma

演算法實現TSP(旅行商)問題(java語言)

旅行商問題,即TSP問題(Traveling Salesman Problem)是數學領域中著名問題之一。假設有一個旅行商人要拜訪N個城市,他必須選擇所要走的路徑,路徑的限制是每個城市只能拜訪一次,而

TSP問題及演算法理解與實現

/** * Created by coco on 17-10-20. */ import java.io.*; import java.util.logging.Logger; import static java.util.logging.Logger.getLogger; public class

數獨問題的一種簡單演算法程式碼實現

五一期間無聊時想起去年考研複試有一道上機題目當時沒作出來,於是一時興起想重新拾起看看是當時太緊張,還是自己能力不足。然後發現這道題目還真稍微有些難度,相當於一道數獨問題(sudoku)的簡化版。自己想來想去也只能想到兩種演算法,一種是拿剩餘元素做全排列測試,一種是回溯法測試。最後只實現了一個全排

演算法學習

** 蟻群演算法的基本原理(簡單概括): ** 剛開始螞蟻按照同等概率選擇各條路徑。 螞蟻在經過的路徑下留下資訊素。 短的路徑螞蟻會率先找到食物源,因此資訊素濃度偏大。 由於資訊素的揮發,較長路徑上的資訊素逐漸消失 特點:正反饋;不容易陷入區域

C++:演算法解決TSP(C++多執行緒版)

TSP問題:旅行商問題,最短迴路。 這裡採用att48資料,鄰接矩陣全部取整數,原資料放在文後。 解決程式碼如下: //#define TEST_INPUT //#define TEST_T //#define TEST_ANT //#define TEST_VALUE #

MD4 演算法程式碼實現

介紹 MD4是一種資訊摘要演算法,由麻省理工學院教Ronald Rivest於1990年開發完成,演算法根據輸入的數值計算128位的摘要資訊,用於檢測資訊的完整性。該演算法影響了後來其他的密碼演算法的設計,如MD5、sha-1和RIPEMD演算法。 安全性 1991年

Spark Word2Vec演算法程式碼實現

1 import com.hankcs.hanlp.tokenizer.NLPTokenizer 2 import org.apache.hadoop.io.{LongWritable, Text} 3 import org.apache.hadoop.mapred.TextInputFormat

【機器學習筆記35】演算法

【參考資料】 【1】《蟻群演算法原理及其應用》 【2】測試資料: https://comopt.ifi.uni-heidelberg.de/software/TSPLIB95/tsp/att48.tsp.gz 演算法原理(以TSP問題為例) (1)引數初始化。令時間t=0和迴圈次數

一致性hash演算法程式碼實現

什麼是一致性hash 一致性雜湊演算法(Consistent Hashing Algorithm)是一種分散式演算法,常用於負載均衡。Memcached client也選擇這種演算法,解決將key-value均勻分配到眾多Memcached server上的問題。它可以取代傳統的取模操作

演算法matlab

(一)蟻群演算法的由來 蟻群演算法最早是由Marco Dorigo等人在1991年提出,他們在研究新型演算法的過程中,發現蟻群在尋找食物時,通過分泌一種稱為資訊素的生物激素交流覓食資訊從而能快速的找到目標,據此提出了基於資訊正反饋原理的蟻群演算法。 蟻群演算法的基本思想來源於自然界螞

特徵選擇mRMR演算法程式碼實現及安裝下載

演算法程式碼實現連線可以直接下載解壓執行,在mac或者Linux系統下:https://github.com/csuldw/MachineLearning/tree/master/mRMR    要看懂result.out檔案結果中,有兩個關鍵字:*** MaxRel fea

簡單易懂,演算法解決旅行商問題

轉載宣告: 原文把蟻群解決旅行商問題寫的很清楚,只不過本人認為原文中有一些小錯誤,特此更改(文中紅色加粗字型為改正處),程式碼中出現的一些演算法的小問題也進行了更正(比如程式碼中的貪心演算法),程式碼也附在下面,謝謝博主的分享。 1.關於旅行商(TSP)問題及衍化

智慧演算法---演算法

  1 蟻群演算法及其基本思想 蟻群演算法是一種智慧優化演算法,通過蟻群優化求解複雜問題,ACO在離散優化問題方面有比較好的優越性。     基本思想(以旅行商問題為例)       &nbs

基於基本演算法解決連續優化問題

基於基本蟻群演算法解決連續優化問題 相關連結 TSP_旅行商問題-基本蟻群演算法 基本蟻群演算法解決連續優化問題基本流程 用一個螞蟻代表一個可行解,一個螞蟻含有的資訊包括各變數值; 1、確定迭代週期; 2、確定螞蟻數;