varfitness_value,
fitness_table;/*fitness_value为种群的适应度,fitness_table为种群累积适应度*/ fori=1:pop_size
r = rand*fitness_table(pop_size);/*随机生成一个随机数,在0和总适应度之间,因为
fitness_table(pop_size)为最后一个个体的累积适应度,即为总适应度*/ first = 1; last = pop_size;
mid = round((last+first)/2); idx = -1;
/*下面按照排中法选择个体*/ while (first <= last) && (idx == -1) if r >fitness_table(mid) first = mid;
elseif r mid = round((last+first)/2); if (last - first) == 1 idx = last; break; end if end while for j=1:chromo_size pop_new(i,j)=pop(idx,j); end for end for /*是否精英选择*/ if elitism p = pop_size-1; else p = pop_size; end if fori=1:p for j=1:chromo_size pop(i,j) = pop_new(i,j);/*若是精英选择,则只将pop_new前pop_size-1个个体赋给pop,最后一个为前代最优个体保留*/ end for end for 1.3 交叉操作 交叉操作是对任意两个个体进行的(在这里我们实现的算法是直接对相邻的两个个体进行的)。随机选择两个个体,如下图所示 然后随机生成一个实数0<=r<=1, 如果r if(rand cross_pos = round(rand * chromo_size);/*交叉位置*/ if or (cross_pos == 0, cross_pos == 1) continue;/*若交叉位置为0或1,则不进行交叉*/ end if for j=cross_pos:chromo_size pop(i,j)<->pop(i+1,j);/*交换*/ end for end if end for 1.4 变异操作 变异操作是对单个个体进行的。首先生成一个随机实数0<=r<=1, 如果r 如个体需要进行变异操作,首先需要确定变异位置(rand*chromo_size),若为0则不进行变异,否则则 对该位置的二进制数字进行变异:1变成0, 0变成1.(当然也可以选择多点进行变异) 单点变异的具体算法描述如下: Mutation algorithm fori=1:pop_size if rand mutate_pos = round(rand*chromo_size);/*变异位置*/ ifmutate_pos == 0 continue;/*若变异位置为0,则不进行变异*/ end if pop(i,mutate_pos) = 1 - pop(i, mutate_pos);/*将变异位置上的数字至反*/ end if end for 1.5 遗传算法流程 遗传算法计算流程图如下图所示