遺傳演算法是一種全域性、概率搜尋演算法,主要用於求解大規模旅行商問題、路徑規劃問題、任務排程等np-hard問題。
遺傳演算法屬於進化演算法,首先將需要求解的自變數通過編碼形成染色體,在遺傳過程中通過交叉、變異等操作產生新個體,選擇種群中較優的個體遺傳到下一代,不斷進化,直到達到遺傳終止條件為止。
本文以乙個小規模的兩兩組合優化問題為例對遺傳演算法的流程進行簡要介紹。問題:乙個倉庫有5個包裹需要運輸至5個不同的目的地,每輛運輸車最多運輸兩件包裹,求解最佳的組合運輸方案。
(1)遺傳編碼。問題屬於路徑規劃組合優化問題,每個問題當且僅當執行一次,因此,選擇任務序號作為基因進行編碼產生染色體。
(2)初始解生成。啟發式演算法初始解的質量直接影響演算法收斂速度,因此一般使用一些簡單優化方法產生初始解,種群大小一般取經驗值20-100。本文使用隨機方法產生初始解,種群大小20,例如:個體1:23415,個體2:13245………………個體20:54321.
(3)選擇。選擇較優個體遺傳到下一代,一般使用輪盤賭的方法,多目標時可能選擇帕累托法等。選擇時需要計算個體的適應值,路徑規劃問題一般為距離最短或時間最短,使用輪盤賭時需要將最小化問題轉換為最大化問題,因此需要引入常數計算適值。
(4)交叉。常用交叉方法有單點交叉、多點交叉和部分對映交叉等。本文使用單點交叉,交叉後可能會產生非法解,需要將個體染色體合法化。
(5)變異。變異一般使用單點變異或交換變異,同樣在變異後需要合法化個體染色體。
下面為遺傳演算法詳細c語言**,程式設計技術有限,僅供初學者參考,也可在matlab等軟體中直接呼叫演算法包實現問題求解。
#include#include#include#include#define s 5 /* 隨機數個數 */
#define c 10 /* 染色體長度 */
#define add 5 /* 節點數 */
void quchong(); //合法化函式
int maxgen; /* 最大遺傳代數 */
int maxruns; /* 最大執行次數 */
float pc; /* 交叉概率 */
float pm; /* 變異概率 */
float rf; /* 隨機浮點數 */
int ri; /* 隨機整數 */
int nc; /* 交叉次數 */
int nm; /* 變異次數 */
int a[add]; /* 初始序列12345 */
int b[s]; /* 隨機數數列 */
file *fp; //檔案指標
int road[6][6]=, /* 路徑地圖 */
,, ,
, };
int ncar=4; /* 車數量 */
struct individual /* 父代0-1,子代2-3 */
father[4];
struct best /* 最佳個體 */
bestfit;
void random() /* 隨機數生成函式 */
else
}} }
}void fselect()
else }
void enter()
void totaltime()
} }
for(i=1;i<7;i=i+2)
}} fprintf(fp,"%d,",bestfit.fitness);
fprintf(fp,"%d\n",sum);
} void run()
enter();
for(i=1;i<=maxruns;i++)
totaltime();
} fclose(fp);
} int main()
啟發式演算法和元啟發式演算法
是一種基於直觀或經驗構造的演算法,在可接受的花費 指計算時間 計算空間等 給出待解決優化問題的每一例項的乙個可行解,該可行解與與最優解的偏離程度一般不可以事先預計。啟發式演算法是一種技術,這種演算法可以在可接受的計算費用內找到最好的解,但不一定能保證所得到解的可行性及最優性,甚至大多數情況下無法闡述...
啟發式演算法與元啟發式演算法
相對與精確演算法提出的。是一種群體智慧型演算法。平衡區域性最優解與全域性最優解。啟發式演算法可以這樣定義 乙個基於直觀或經驗構造的演算法,在可接受的花費 指計算時間和空間 下給出待解決組合優化問題每乙個例項的乙個可行解,該可行解與最優解的偏離程度一般不能被預計。許多啟發式演算法是相當特殊的,依賴於某...
啟發式演算法
元學習 總結 小樣本學習 總結 2017 2019年計算機視覺頂會文章收錄 aaai2017 2019 cvpr2017 2019 eccv2018 iccv2017 2019 iclr2017 2019 nips2017 2019 啟發式方法 試探法 是一種幫你尋求答案的技術,但它給出的答案是具有...