遺傳算法程序設計研究論文

時間:2022-11-04 03:58:00

導語:遺傳算法程序設計研究論文一文來源于網友上傳,不代表本站觀點,若需要原創文章可咨詢客服老師,歡迎參考。

遺傳算法程序設計研究論文

摘要本文通過對基本遺傳算法添加初始化啟發信息、改進交叉算子和利用本身所固有的并行性構架粗粒度并行遺傳算法等方法提高了遺傳算法的收斂性及其尋優能力。

關鍵詞遺傳算法;TSP;交叉算子

1引言

遺傳算法是模擬生物在自然環境中的遺傳和進化過程而形成的一種自適應全局優化概率搜索算法。總的說來,遺傳算法是按不依賴于問題本身的方式去求解問題。它的目標是搜索這個多維、高度非線性空間以找到具有最優適應值(即最小費用的)的點[1]。

基本遺傳算法是一個迭代過程,它模仿生物在自然環境中的遺傳和進化機理,反復將選擇算子、交叉算子和變異算子作用于種群,最終可得到問題的最優解和近似最優解。

2遺傳算法程序設計改進比較

2.1基本遺傳算法對TSP問題解的影響

本文研究的遺傳算法及改進算法的實現是以C++語言為基礎,在Windows2000的版本上運行,其實現程序是在MicrosoftVisualStadio6.0上編寫及運行調試的。

1)遺傳算法的執行代碼

m_Tsp.Initpop();//種群的初始化

for(inti=0;i<m_Tsp.ReturnPop();i++)

m_Tsp.calculatefitness(i);//計算各個個體的適應值

m_Tsp.statistics();//統計最優個體

while(entropy>decen||variance>decvar)//m_Tsp.m_gen<100)

{

//將新種群更迭為舊種群,并進行遺傳操作

m_Tsp.alternate();//將新種群付給舊種群

m_Tsp.generation();//對舊種群進行遺傳操作,產生新種群

m_Tsp.m_gen++;

m_Tsp.statistics();//對新產生的種群進行統計

}

2)簡單的遺傳算法與分支定界法對TSP問題求解結果的對比

遺傳算法在解決NPC問題的領域內具有尋找最優解的能力。但隨著城市個數的增加,已沒有精確解,無法確定遺傳算法求解的精度有多高。一般情況下,當迭代代數增大時,解的精度可能高,但是時間開銷也會增大。因此可以通過改進遺傳算法來提高搜索能力,提高解的精度。

2.2初始化時的啟發信息對TSP問題解的影響

1)初始化啟發信息

在上述實驗算法的基礎上,對每一個初始化的個體的每五個相鄰城市用分支界定法尋找最優子路徑,然后執行遺傳算法。

2)遺傳算法與含有啟發信息的遺傳算法求解結果的對比

當城市數增至20個時,用分支定界法已經不可能在可以接受的時間內得到精確的解了,只能通過近似算法獲得其可接受的解。試驗設計中算法的截止條件:固定迭代1000代。表2中的平均最優解為經過多次試驗(10次以上)得到的最優解的平均值,最優解的出現時間為最優解出現的平均時間,交叉操作次數為最優解出現時交叉次數的平均值。

表220個城市的TSP問題求解結果數據

算法交叉操作

次數最優解

出現時間平均

最優解

簡單遺傳算法80244.479.4s1641.8

含初始化啟發信息的GA79000.237.4s1398.9

從表2中可以看出,當初始種群時引入啟發信息將提高遺傳算法的尋優能力。同時縮短了遺傳算法的尋優時間和問題的求解精度。

2.3交叉算子對TSP問題解的影響

1)循環貪心交叉算子的核心代碼

for(i=1;i<m_Chrom;i++)

{

flag=0;

city=m_newpop[first].chrom[i-1];//確定當前城市

j=0;

while(flag==0&&j<4)

{

sign=adjcity[city][j];//adjcity數組的數據為當前城市按順序排列的鄰接城市

flag=judge(first,i,sign);//判斷此鄰接城市是否已經存在待形成的個體中

j++;

}

if(flag==0)//如果所有鄰接城市皆在待擴展的個體中

{

while(flag==0)

{

sign=(int)rand()/(RAND_MAX/(m_Chrom-1));//隨機選擇一城市

flag=judge(first,i,sign);

}

}

if(flag==1)

m_newpop[first].chrom[i]=sign;

}

2)問題描述與結果比較

下面筆者用經典的測試遺傳算法效率的OliverTSP問題來測試循環貪心交叉算子的解的精度和解效率。OliverTSP問題的30個城市位置坐標如表3所示[2]。

從表4、圖1中可以看到,貪心交叉算子大大提高了遺傳算法的尋優能力,同時也降低了交叉操作次數。在多次試驗中,貪心交叉算子找到的最優解與目前記載的最佳數據的誤差率為2.7%。而部分匹配交叉算子找到的最優解與目前記載的最佳數據的誤差率高達7%。從而可以得到交叉算子對于遺傳算法

2.4并行遺傳算法消息傳遞實現的核心代碼

1)主程序代碼

//接收各個從程序的最優個體

for(i=0;i<slave;i++)

{

MPI_Recv(Rchrom[i],chrom,MPI_UNSIGNED,MPI_ANY_SOURCE,gen,MPI_COMM_WORLD,&status);

}

//計算接收各個從程序的最優個體的回路距離

for(i=0;i<slave;i++)

{

fitness[i]=0.0;

for(intj=0;j<chrom-1;j++)

fitness[i]=fitness[i]+distance[Rchrom[i][j]][Rchrom[i][j+1]];

fitness[i]=fitness[i]+distance[Rchrom[i][0]][Rchrom[i][chrom-1]];

}

//找到最優的個體并把它記錄到文件里

for(i=0;i<slave;i++)

{

if(1/fitness[i]>min)

{

sign=i;

min=1/fitness[i];

}

}

fwrite(&gen,sizeof(int),1,out);

for(i=0;i<chrom;i++)

fwrite(&Rchrom[sign][i],sizeof(unsigned),1,out);

fwrite(&fitness[sign],sizeof(double),1,out);

//每九代向從程序發送一個最優個體

if(gen%9==0)

MPI_Bcast(Rchrom[sign],chrom,MPI_UNSIGNED,0,MPI_COMM_WORLD);

2)從程序代碼

//將上一代的最優個體傳回主程序

MPI_Send(Rchrom1,chrom,MPI_UNSIGNED,0,gen,MPI_COMM_WORLD);

//每九代接收一個最優個體并將其加入種群中替換掉最差個體

if(gen%9==0)

{

PI_Bcast(Rchrom2,chrom,MPI_UNSIGNED,0,MPI_COMM_WORLD);

Tsp.IndiAlternate(Rchrom2);

}

//進行下一代的計算

Tsp.Aternate();

Tsp.Generation();

Tsp.Statistics();

3)并行遺傳算法的性能

筆者在MPI并行環境下,用C++語言實現了一個解決TSP問題的粗粒度模型的并行遺傳算法。該程序采用的是主從式的MPI程序設計,通過從硬盤的文件中讀取數據來設置染色體長度、種群的規模、交叉概率和變異概率等參數。試驗環境為曙光TC1700機,測試的對象是OliverTSP問題的30個城市的TSP問題。

正如在測試串行遺傳算法所提到的數據結果,并行遺傳算法也沒有達到目前所記錄的最好解,但是它提高了算法的收斂性,并行遺傳算法的收斂趨勢如圖2所示[4]。

圖2遺傳算法的收斂過程

3結束語

本文通過對基本遺傳算法的不斷改進,證明了添加啟發信息、改進遺傳算子和利用遺傳算法固有的并行性都可以提高遺傳算法的收斂性,其中對遺傳算法交叉算子的改進可以大大提高遺傳算法的尋優能力。

參考文獻

[1]劉勇、康立山,陳毓屏著.非數值并行算法-遺傳算法.北京:科學出版社1995.1

[2]IMOliverDJSmithandJRCHolland,Astudyofpermutationcrossoveroperatorsonthetravelingsalesman[C]//ProblemofthesecondInternationalConferenceonGeneticAlgorithmsandTheirApplication,Erlbaum1897:224-230

[3]于海斌,王浩波,徐心和.兩代競爭遺傳算法及其應用研究.信息與控制,2000Vol.29,No.4:309-314

[4]穆艷玲,李學武,高潤泉.遺傳算法解TSP問題的并行實現.北京聯合大學學報(自然科學版),2006Vol.20No.2:40-43