遗传算法(可运行)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
遗传算法是模拟达尔文的遗传选择和自然淘汰的生物进化过程的计算模型.
生存+检测的迭代搜索过程是它的核心.
具体分成五部,其中每步就是程序实现过程:
参数编码(实际问题编码到遗传基因),初始群体设定(祖先),适应度函数的设计(生存选择),遗传操作设计(遗传+变异),控制参数设计(交叉率0.2-0.99,变异率0.001-0.1).
具体过程:
选择编码方式;
产生初始群体;
计算群体适应性;
如果不满足条件
{ 选择
交换
变异
计算新一代的群体适应性(继续迭代)
}
C++程序实现: 直接可以运行
#include
#include
#include
#include
#define POPSIZE 500 //种群大小
#define chromlength 8 //染色体长度
int popsize ; //种群大小
int maxgeneration; //最大世代数
double pc = 0.0; //交叉率
double pm = 0.0; //变异率
struct individual //定义染色体个体结构体
{
int chrom[chromlength]; //定义染色体二进制表达形式,edit by ppme 将char 转为int
double value; //染色体的值
double fitness; //染色体的适应值
};
int generation; //当前执行的世代数
int best_index; //最好的染色体索引序号
int worst_index; //最差的染色体索引序号
struct individual bestindividual; //最佳染色体个体
struct individual worstindividual; //最差染色体个体
struct individual currentbest; //当前最好的染色体个体currentbest
struct individual population[POPSIZE];//种群数组
//函数声明
void generateinitialpopulation(); //ok-初始化当代种群
void generatenextpopulation(); //??产生下一代种群
void evaluatepopulation(); //评价种群
void calculateobjectfitness(); //计算种群适应度
//long decodechromosome(char *,int,int);//染色体解码
double decodechromosome(int,int); //染色体解码
void findbestandworstindividual(); //寻找最好的和最坏的染色体个体
void performevolution(); //进行演变进化
void selectoperator(); //选择操作
void crossoveroperator(); //交换操作
void mutationoperator(); //变异操作
void input(); //输入接口
void outputtextreport(); //输出文字报告
void main() //主函数
{
int i;
srand((unsigned)time(NULL)); //强制类型转化,以当前时间戳定义随机数种子printf("本程序为求函数y=x*x的最大值\n");
generation=0; //初始化generation当前执行的代
input(); //初始化种群大小、交叉率、变异率
/*edit by ppme*/
//调试用。。。。。显示input()结果
printf("popsize %d;maxgeneration %d;pc %f;pm %f\n\n",popsize,maxgeneration,pc,pm);
/*edit by ppme*/
generateinitialpopulation(); //产生初始化种群
evaluatepopulation(); //评价当前种群,(A.计算种群/个体的适应度;B.找出最好和最差的个体)
while(generation { generation++; generatenextpopulation(); //生成子代种群(A.选择; B.交叉; C.变异) evaluatepopulation(); //评价新生子代种群 performevolution(); //进行子代进化 outputtextreport(); //输入当代最终种群 } printf("\n"); printf(" 统计结果:"); printf("\n"); printf("最大函数值等于:%f\n",currentbest.fitness); printf("其染色体编码为:"); //计算currentbest的value for( i = 0 ; i < chromlength ; i++ ) printf(" %d",currentbest.chrom[i]); } void generateinitialpopulation( ) //种群初始化 { int i,j; srand((unsigned)time(NULL)); //强制类型转化,以当前时间戳定义随机数种子 for (i=0;i { for(j=0;j { population[i].chrom[j]=(rand()%10<5)?0:1; //rand()%10随机产生0-9的整数 //,小于5标注0,否则标注1 } } } void generatenextpopulation() //生成下一代 { selectoperator(); crossoveroperator(); mutationoperator(); } void evaluatepopulation() //评价种群??? { calculateobjectfitness(); //计算种群?个体的适应度 findbestandworstindividual(); //赵到最好和最差的染色体个体 } void calculateobjectfitness() //计算染色体个体适应值和适应度 { int i; int j; printf("calculateobjectfitness is executing!"); for(i=0;i {