遺傳算法的變異操作
1 /* Mutation routines */ 2 3 # include <stdio.h> 4 # include <stdlib.h> 5 # include <math.h> 6 7 # include "global.h" 8 # include "rand.h" 9 10 /* Function to perform mutation in a population */ 11 void mutation_pop (population *pop) 12 { 13 int i; 14 for (i=0; i<popsize; i++) 15 { 16 mutation_ind(&(pop->ind[i])); 17 } 18 return; 19 }
一次進化過程中的 變異操作, 需要調用 變異函數 mutation_ind 種群個數popsize 次。
函數包裝,判斷是實數編碼還是二進制編碼並調用不同的變異函數。
1 /* Function to perform mutation of an individual */ 2 void mutation_ind (individual *ind) 3 { 4 if (nreal!=0) 5 { 6 real_mutate_ind(ind); 7 } 8 if (nbin!=0) 9 { 10 bin_mutate_ind(ind); 11 } 12 return; 13 }
二進制編碼 的 變異操作:
每個個體 的 每個變量 的 二進制編碼段 的 每個比特位, 以變異概率 pmut_bin 進行變異。
(單點變異)
1 /* Routine for binary mutation of an individual */ 2 void bin_mutate_ind (individual *ind) 3 { 4 int j, k; 5 double prob; 6 for (j=0; j<nbin; j++) 7 { 8 for (k=0; k<nbits[j]; k++) 9 { 10 prob = randomperc(); 11 if (prob <=pmut_bin) 12 { 13 if (ind->gene[j][k] == 0) 14 { 15 ind->gene[j][k] = 1; 16 } 17 else 18 { 19 ind->gene[j][k] = 0; 20 } 21 nbinmut+=1; 22 } 23 } 24 } 25 return; 26 }
實數編碼 情況下的 變異操作:
(多項式變異)
1 /* Routine for real polynomial mutation of an individual */ 2 void real_mutate_ind (individual *ind) 3 { 4 int j; 5 double rnd, delta1, delta2, mut_pow, deltaq; 6 double delta; 7 double y, yl, yu, val, xy; 8 for (j=0; j<nreal; j++) 9 { 10 rnd = randomperc(); 11 if (rnd <= pmut_real) 12 { 13 y = ind->xreal[j]; 14 yl = min_realvar[j]; 15 yu = max_realvar[j]; 16 delta1 = (y-yl)/(yu-yl); 17 delta2 = (yu-y)/(yu-yl); 18 delta = minimum (delta1,delta2); 19 rnd = randomperc(); 20 mut_pow = 1.0/(eta_m+1.0); 21 if (rnd <= 0.5) 22 { 23 xy = 1.0-delta1; 24 val = 2.0*rnd+(1.0-2.0*rnd)*(pow(xy,(eta_m+1.0))); 25 deltaq = pow(val,mut_pow) - 1.0; 26 } 27 else 28 { 29 xy = 1.0-delta2; 30 val = 2.0*(1.0-rnd)+2.0*(rnd-0.5)*(pow(xy,(eta_m+1.0))); 31 deltaq = 1.0 - (pow(val,mut_pow)); 32 } 33 y = y + deltaq*(yu-yl); 34 if (y<yl) 35 { 36 y = yl; 37 } 38 if (y>yu) 39 { 40 y = yu; 41 } 42 ind->xreal[j] = y; 43 nrealmut+=1; 44 } 45 } 46 return; 47 }
eta_m 為 實數編碼的 多項式變異的 參數, 為全局設定。
(該變異方式是為了模擬二進制編碼的單點變異,邏輯比較簡單,數學含義不明)
每個個體 的 每個變量 的 實數表示, 以變異概率 pmut_real 進行變異 。