Download presentation
Presentation is loading. Please wait.
Published byAsunción Farías Modified 5年之前
1
statistic 比較fitness的 max,min 如果新值小於最佳 值就將新值的chrom, Phynotype,fitness,
Generation放進 bestfit 計算生存的平均值
2
sumfitness = 0.0 ; sumfitness初始值為 0 . min = pop[ 0 ].fitness ; max= pop[ 0 ].fitness; min, max一開始設為pop第0格的 fitness . for (j = 0 ; j<popsize ; j++) { sumfitness = sumfitness + pop[ j ].fitness ; sumfitness 將所有的 pop 的 fitness 以累加的方式加起來. if (pop[ j ].fitness < max) max = pop[ j ].fitness ; if (pop[ j ].fitness < min ) min = pop[ j ].fitness ; 要找出最大,最小的 pop[ j ].fitness .
3
if ( pop[ j ].fitness < bestfit.fitness)
如果 pop[ j ].fitness 小於最好的 fitness 就執行下面程式 . { for (k = 0 ; k < var ; k++) for (i = 0 ; i < chromsize ; i++) bestfit.chrom [ i + k*chromsize ] = pop[ j ].chrom[ i + k*chromsize ] ; 將最小的的 chrom , 放進bestfit.chrom . bestfit.phynotype[ k ] = pop[ j ].phynotype[ k ] ; 將最好的var , 放進bestfit . } bestfit. fitness = pop[ j ].fitness ; bestfit. generation = gen ; 上兩行程式也是將最好的 fitness 跟 gen 放進 bestfit .
4
avg = sumfitness / popsize ;
這一行是在算所有pop的fitness的平均值 .
5
generate 挑出兩數 Mate1,mate2 進行crossover, mutation 將新值轉成十進制 紀錄新值的父母
紀錄哪個變數 在哪crossover
6
do { mate1 = selecting( ) ; mate2 = selecting( ) ; 以輪盤法或錦標法挑出兩個數 . jcross = (unsigned * ) crossover ( oldpop [ mate1 ].chrom, oldpop[ mate2 ].chrom newpop[ j ]. chrom, newpop[ j+1]. chrom) ; 上面是說兩個 oldpop 做 crossover 會產生兩個 newpop . mutation ( newpop [ j ].chrom); mutation ( newpop [ j+1].chrom); 將 newpop 做 mutation .
7
objfunc (&( newpop[ j ])) ;
newpop[ j ].parent[ 0 ] = mate1+1 ; 紀錄父親 . for ( i = 0 ; i<var ; i++) newpop[ j ].xsite[ i ] = jcross [ i ] ; 紀錄每個變數做的 crossover . newpop[ j ].parent[ 1 ] = mate2+1 ; 紀錄母親 . objfunc (&( newpop[ j+1 ])) ; newpop[ j+1 ].parent[ 0 ] = mate1+1 ; newpop[ j+1 ].xsite[ i ] = jcross [ i ] ; newpop[ j+1].parent[ 1 ] = mate2+1 j = j+2 ; 因為每次都是做兩了newpop所以下一次 j 就要加 2 . } while ( j < (popsize-1)) ;
Similar presentations