遗传算法小结
遗传算法的本质是一种随机搜索算法,结合了生物自然选择与遗传机理。和传统搜索算法不同,遗传算法从一组随机产生的初始解,称为种群开始搜索。种群中每个个体是问题的一个解,称为染色体。染色体是一串符号,比如一个二进制字符串。这些染色体在后续迭代中不断进化,称为遗传。染色体的好坏由与问题解的接近程度度量,称为适应值。生成的下一代染色体称为后代。新一代的形成中,适应值高的个体获得交配产生后代的机会大,适应值低的个体则被淘汰,模拟了自然界自然选择的过程。后代由前一代染色体通过交叉或变异得到。
基本遗传算法伪代码
/*
* Pc:交叉发生的概率
* Pm:变异发生的概率
* M:种群规模
* G:终止进化的代数
* Tf:进化产生的任何一个个体的适应度函数超过Tf,则可以终止进化过程
*/
初始化Pm,Pc,M,G,Tf等参数。随机产生第一代种群Pop
do
{
计算种群Pop中每一个体的适应度F(i)。
初始化空种群newPop
do
{
根据适应度以比例选择算法从种群Pop中选出2个个体
if ( random ( 0 , 1 ) < Pc )
{
对2个个体按交叉概率Pc执行交叉操作
}
if ( random ( 0 , 1 ) < Pm )
{
对2个个体按变异概率Pm执行变异操作
}
将2个新个体加入种群newPop中
} until ( M个子代被创建 )
用newPop取代Pop
}until ( 任何染色体得分超过Tf, 或繁殖代数超过G )
染色体编码
适应度函数
选择算子
(1)轮盘赌选择方法
也称比例选择法,此时个体被选中的概率与其适应值的大小成正比。模拟一个圆盘,每个个体在圆盘上所占的面积与其适应度的大小成正比,转动指针,指针最后指向那个圆盘,所代表的个体就被选中,这样适应度低的个体也有机会被选中。
(2)排序选择法
计算完每个个体的适应度并排序后,将事先设计好的概率值分配给每个个体,这样每个个体被选中的概率由序号确定。
(3)最优保存策略
始终用最优个体替换最差个体。这样的后果是容易陷入局部最小值。
交叉算子
交叉前:
00000|011100000000|10000
11100|000001111110|00101
交叉后:
00000|000001111110|10000
11100|011100000000|00101
变异算子
变异前:
000001110000000010000
变异后:
000001110000100010000
<span style="font-size:18px;">// YIchuansuanfa.cpp: implementation of the YIchuansuanfa class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "YIchuansuanfa.h" #include <stdio.h> #include <stdlib.h> #include <math.h> #define POPSIZE 500 //人群总数 #define MAXIMIZATION 1 #define MINIMIZATION 2 #define Cmax 100 #define Cmin 0 #define LENGTH1 10//第一代变量的染色体长度 #define LENGTH2 10//第二代变量的染色体长度 #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// YIchuansuanfa::YIchuansuanfa() { FunctionMode=MAXIMIZATION; PopSize=80; Pc=0.6;//交叉概率0.6 Pm=0.05;//变异概率0.01 index=1; } YIchuansuanfa::~YIchuansuanfa() { } void YIchuansuanfa:: main() { if (centernum!=0) { generation=0; GenerationInitialPopulation(); EvaluatePopulation(); while (generation<MaxGeneration) { generation++; GenerateNextPopulation(); EvaluatePopulation(); PerformEvolution(); } for (int i=0;i<patternnum;i++) { m_pattern[i].category=currentbest.chrom[i]; } CString s; s.Format("最优解出现在第%d代",index); AfxMessageBox(s); } else { AfxMessageBox("类中心数目不能为0!"); return; } } void YIchuansuanfa::GenerationInitialPopulation() { int i,j; CHROMLENGTH=patternnum; for(i=0;i<PopSize;i++) { for(j=0;j<CHROMLENGTH;j++)//初始化染色体 { population[i].chrom[j]=rand()%centernum+1; } population[i].chrom[CHROMLENGTH]='\0'; } } void YIchuansuanfa::GenerateNextPopulation() { SelectionOperator(); CrossoverOperator(); MutationOperator(); } void YIchuansuanfa::EvaluatePopulation() { CalculateObjectValue(); CalculateFitnessValue(); FindBestAndWorstIndividual(); } /* long YIchuansuanfa::DecodeChromosome(char *string,int point,int length) { int i; long decimal=0L; char *pointer; for(i=0,pointer=string+point;i<length;i++,pointer++) { decimal+=(*pointer-'0')<<(length-1-i); } return (decimal); }*/ void YIchuansuanfa::CalculateObjectValue() { if (m_center!=NULL) delete []m_center; m_center=new Center[patternnum]; for (int t=0;t<centernum;t++) { m_center[t].index=t+1; m_center[t].patternnum=0; for (int m=0;m<N*N;m++) m_center[t].feature[m]=0.0; } double sumdistance; for(int i=0;i<PopSize;i++)//计算population[i]的value { for (int t=0;t<centernum;t++) { m_center[t].patternnum=0; for (int m=0;m<N*N;m++) m_center[t].feature[m]=0.0; } for (int j=0;j<centernum;j++)//算中心 { for(int k=0;k<patternnum;k++) { if (population[i].chrom[k]==j+1) { m_center[j].patternnum++; for(int n=0;n<N*N;n++ ) m_center[j].feature[n]+=m_pattern[k].feature[n]; } } if (m_center[j].patternnum!=0) { for(int n=0;n<N*N;n++ ) m_center[j].feature[n]/=(double)m_center[j].patternnum; } } sumdistance=0.0; //cal value for ( j=0;j<centernum;j++) { for(int k=0;k<patternnum;k++) { if (population[i].chrom[k]==j+1) { sumdistance+=GetDistance(m_pattern[k],m_center[j],1); } } } population[i].value=sumdistance ; } } void YIchuansuanfa::CalculateFitnessValue() { //按照value排序由小到大 int i,j; for(i=0;i<PopSize;i++) { population[i].index=-1; } for (i=1;i<=PopSize;i++) { int index=0; for (j=0;j<PopSize;j++) { if (population[j].index==-1) { index=j; break; } } for(j=0;j<PopSize;j++) { if(population[j].index==-1 && population[j].value<population[index].value) index=j; } population[index].index=i; } //计算适应度 for(i=0;i<PopSize;i++) { double a=0.6; population[i].fitness=a*pow((1-a),population[i].index-1); } } void YIchuansuanfa::FindBestAndWorstIndividual() { int i; bestindividual=population[0]; worstindividual=population[0]; for(i=1;i<PopSize;i++) { if(population[i].value<bestindividual.value) { bestindividual=population[i]; best_index=i; }else if(population[i].value>worstindividual.value) { worstindividual=population[i]; worst_index=i; } } if(generation==0) { currentbest=bestindividual; } else { if(bestindividual.value<currentbest.value) { currentbest=bestindividual; index=generation; } } } void YIchuansuanfa::PerformEvolution() { if(bestindividual.value<currentbest.value) { currentbest=population[best_index]; }else { population[worst_index]=currentbest; } } void YIchuansuanfa::SelectionOperator() { int i,index; double p,sum=0.0; double cfitness[POPSIZE]; struct individual newpopulation[POPSIZE]; for(i=0;i<PopSize;i++) { sum+=population[i].fitness; } for(i=0;i<PopSize;i++) { cfitness[i]=population[i].fitness/sum; } for(i=1;i<PopSize;i++) { cfitness[i]=cfitness[i-1]+cfitness[i]; } for(i=0;i<PopSize;i++) { p=rand()%1000/1000.0; index=0; while(p>cfitness[index]) { index++; } newpopulation[i]=population[index]; } //选择下一代群体 for(i=0;i<PopSize;i++) { population[i]=newpopulation[i]; } } void YIchuansuanfa::CrossoverOperator() { int i,j; int index[POPSIZE]; int point=0,temp; double p; int ch; for(i=0;i<PopSize;i++) { index[i]=i; } for(i=0;i<PopSize;i++) { point=rand()%PopSize-i; temp=index[i]; index[i]=index[point+i]; index[point+i]=temp; } //交叉操作 for(i=0;i<PopSize-1;i+=2) { p=rand()%1000/1000.0; if(p<Pc) { point=(rand()%CHROMLENGTH-1)+1; for(j=point;j<CHROMLENGTH;j++) { ch=population[index[i]].chrom[j]; population[index[i]].chrom[j]=population[index[i+1]].chrom[j]; population[index[i+1]].chrom[j]=ch; } } } } void YIchuansuanfa::MutationOperator() { int i,j; double p; //变异 for(i=0;i<PopSize;i++) { for(j=0;j<CHROMLENGTH;j++) { p=rand()%1000/1000.0; if(p<Pm) { population[i].chrom[j]=rand()%centernum+1; } } } } void YIchuansuanfa::OutputTextReport() { CString str,s; s.Format("%f",currentbest.value); str.Insert(str.GetLength(),"present best value: "); str.Insert(str.GetLength(),s); s.Format("第 %d 代",generation); str.Insert(str.GetLength(),"\n"); str.Insert(str.GetLength(),s); str.Insert(str.GetLength(),"\n"); for (int i=0;i<CHROMLENGTH;i++) { s.Format("%d",currentbest.chrom[i]); str.Insert(str.GetLength(),s); } AfxMessageBox(str); } </span>
版权声明: