版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
这是我在解决电梯动力学参数写的简单遗传算法(程序带目标函数值、适应度值计算,但是我的适应度函数因为目标函数的计算很特殊,一起放在了程序外面计算,在此不提供)。头文件://CMVSOGA.h:mainheaderfilefortheCMVSOGA.cpp//本来想使用链表里面套链表的,程序调试比较麻烦,改为种群用链表表示//染色体固定为16的方法。#if!defined(AFX_CMVSOGA_H__45BECA_61EB_4A0E_9746_9A94D1CCF767__INCLUDED_)#defineAFX_CMVSOGA_H__45BECA_61EB_4A0E_9746_9A94D1CCF767__INCLUDED#if_MSC_VER>1000#pragmaonce#endif//_MSC_VER>1000#include"Afxtempl.h"#definevariablenum16classCMVSOGA{public:CMVSOGA();voidselectionoperator();voidcrossoveroperator();voidmutationoperator();voidinitialpopulation(int,int,double,double,double*,double*);//种群初始化voidgeneratenextpopulation();//生成下一代种群voidevaluatepopulation();//评价个体,求最佳个体voidcalculateobjectvalue();//计算目标函数值voidcalculatefitnessvalue();//计算适应度函数值voidfindbestandworstindividual();//寻找最佳个体和最差个体voidperformevolution();voidGetResult(double*);voidGetPopData(double**);voidSetValueData(double*);voidmaxandexpectation();private:structindividual{doublechromosome[variablenum];//染色体编码长度应该为变量的个数doublevalue;doublefitness;//适应度};doublevariabletop[variablenum];//变量值doublevariablebottom[variablenum];//变量值intpopsize;//种群大小//intgeneration;intbest_index;intworst_index;//世代数doublecrossoverrate;doublemutationrate;intmaxgeneration;//交叉率//变异率//最大世代数structindividualbestindividual;//最佳个体structindividualworstindividual;//最差个体structindividualcurrent;//当前个体structindividualcurrent1;//当前个体structindividualcurrentbest;//当前最佳个体CList<structindividual,structindividual&>population;//种群CList<structindividual,structindividual&>newpopulation;//新种群CList<double,double>cfitness;//存储适应度值//doublemaxfitness;//doubleminfitness;//doubleavefitness;//怎样使链表的数据是一个结构体主要是想把种群作成链表。节省空间。};#endif执行文件//CMVSOGA.cpp:implementationfile//#include"stdafx.h"#include"CMVSOGA.h"#include"math.h"#include"stdlib.h"#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif///////////////////////////////////////////////////////////////////////////////CMVSOGA.cppvoidCMVSOGA::initialpopulation(intps,intgen,doublecr,doublemr,double*xtop,double*xbottom)//第一步,初始化。{inti,j;popsize=ps;maxgeneration=gen;crossoverrate=cr;mutationrate=mr;for(i=0;i<variablenum;i++){variabletop[i]=xtop[i];variablebottom[i]=xbottom[i];}srand((unsigned)time(NULL));for(i=0;i<popsize;i++){for(j=0;j<variablenum;j++){current.chromosome[j]=double(rand()%1000)/1000*(variabletop[j]-variablebottom[j])+variablebottom[j];}current.fitness=0;current.value=0;population.InsertAfter(population.Findlndex(i),current);〃除了初始化使用insertafter外,其他的用setat命令。}}voidCMVSOGA::generatenextpopulation()〃第三步,生成下一代。{selectionoperator();crossoveroperator();mutationoperator();}voidCMVSOGA::evaluatepopulation()//第二步,评价个体,求最佳个体{//calculateobjectvalue();calculatefitnessvalue();//在此步中因该按适应度值进行排序.链表的排序.findbestandworstindividual();}voidCMVSOGA::calculateobjectvalue()//计算函数值,应该由外部函数实现。主要因为目标函数很复杂。{inti,j;doublex[variablenum];for(i=0;i<popsize;i++){current=population.GetAt(population.FindIndex(i));current.value=0;//使用外部函数进行,在此只做结果的传递。for(j=0;j<variablenum;j++){x[j]=current.chromosome[j];current.value=current.value+(j+1)*pow(x[j],4);}////使用外部函数进行,在此只做结果的传递。population.SetAt(population.FindIndex(i),current);}}voidCMVSOGA::mutationoperator()//对于浮点数编码,变异算子的选择具有决定意义。//需要guass正态分布函数,生成方差为sigma,均值为浮点数编码值c。{inti,j;doubler1,r2,p,sigma;//sigma高斯变异参数sigma=0.5;for(i=0;i<popsize;i++){current=population.GetAt(population.FindIndex(i));〃生成均值为current.chromosome,方差为sigma的高斯分布数srand((unsignedint)time(NULL));for(j=0;j<variablenum;j++){r1=double(rand()%1001)/1000;r2=double(rand()%1001)/1000;p=double(rand()%1000)/1000;if(p<mutationrate){//高斯变异current.chromosome[j]=(current.chromosome[j]+sigma*sqrt(-2*log(r1)/0.4323)*sin(2*3.1415926*r2));if(current.chromosome[j]>variabletop[j]){current.chromosome[j]=variabletop[j];}if(current.chromosome[j]<variablebottom[j]){current.chromosome[j]=variablebottom[j];}}}population.SetAt(population.FindIndex(i),current);}}voidCMVSOGA::selectionoperator()//从当前个体中按概率选择新种群,应该加一个复制选择,提高种群的平均适应度//第二次循环出错{inti,j,pindex=0;doublep,pc,sum=0;i=0;j=0;pindex=0;p=0;pc=0;sum=0.001;newpopulation.RemoveAll();cfitness.RemoveAll();//链表排序//population.SetAt(population.FindIndex(0),current);//多余代码for(i=1;i<popsize;i++){current=population.GetAt(population.FindIndex(i));for(j=0;j<i;j++)//从小到大用before排列。{current1=population.GetAt(population.Findindex(j));//临时借用变量if(current.fitness<=current1.fitness){population.insertBefore(population.Findindex(j),current);population.RemoveAt(population.Findindex(i+1));break;}}//m=population.GetCount();}//链表排序for(i=0;ivpopsize;i++)〃求适应度总值,以便归一化,是已经排序好的链。{current=population.GetAt(population.Findindex(i));sum+=current.fitness;}for(i=0;ivpopsize;i++)〃归一化{current=population.GetAt(population.Findindex(i));current.fitness=current.fitness/sum;cfitness.insertAfter(cfitness.Findindex(i),current.fitness);for(i=1;ivpopsize;i++)〃概率值从小到大;{current.fitness=cfitness.GetAt(cfitness.FindIndex(i-1))+cfitness.GetAt(cfitness.FindIndex(i));//归一化cfitness.SetAt(cfitness.FindIndex(i),current.fitness);population.SetAt(population.FindIndex(i),current);}for(i=0;ivpopsize;)〃轮盘赌概率选择。本段还有问题。{p=double(rand()%1000)/1000+0.0001;//随机生成概率pindex=0;//遍历索引pc=cfitness.GetAt(cfitness.FindIndex(0));while(p>=pc&&pindexvpopsize)//问题所在。{pc=cfitness.GetAt(cfitness.FindIndex(pindex));pindex++;}〃必须是从index~popsize,选择高概率的数。即大于概率p的数应该被选择,选择不满则进行下次选择。for(j=popsize-1;jvpindex&&ivpopsize;j--){newpopulation.InsertAfter(newpopulation.FindIndex(0),population.GetAt(population.FindIndex(j)));i++;}}for(i=0;ivpopsize;i++){population.SetAt(population.FindIndex(i),newpopulation.GetAt(newpopulation.FindIndex(i)));}//j=newpopulation.GetCount();//j=population.GetCount();newpopulation.RemoveAll();}//current变化后,以上没有问题了。voidCMVSOGA::crossoveroperator()//非均匀算术线性交叉,浮点数适用,alpha,beta是(0,1)之间的随机数〃对种群中两两交叉的个体选择也是随机选择的。也可取beta=1-alpha;〃current的变化会有一些改变。{inti,j;doublealpha,beta;CList<int,int>index;intpoint,temp;doublep;srand((unsigned)time(NULL));for(i=0;ivpopsize;i++)〃生成序号{index.InsertAfter(index.FindIndex(i),i);}for(i=0;ivpopsize;i++)〃打乱序号{point=rand()%(popsize-1);temp=index.GetAt(index.FindIndex(i));index.SetAt(index.FindIndex(i),index.GetAt(index.FindIndex(point)));index.SetAt(index.FindIndex(point),temp);}for(i=0;ivpopsize-1;i+=2){//按顺序序号,按序号选择两个母体进行交叉操作。p=double(rand()%1000)/1000.0;if(pvcrossoverrate){alpha=double(rand()%1000)/1000.0;beta=double(rand()%1000)/1000.0;current=population.GetAt(population.FindIndex(index.GetAt(index.FindIndex(i))));current1=population.GetAt(population.FindIndex(index.GetAt(index.FindIndex(i+1))));〃临时使用currentl代替for(j=0;jvvariablenum;j++){//交叉current.chromosome[j]=(1-alpha)*current.chromosome[j]+beta*current1.chromosome[j];if(current.chromosome[j]>variabletop[j])//判断是否超界.{current.chromosome[j]=variabletop[j];}if(current.chromosome[j]vvariablebottom[j]){current.chromosome[j]=variablebottom[j];}current1.chromosome[j]=alpha*current.chromosome[j]+(1-beta)*current1.chromosome[j];if(current1.chromosome[j]>variabletop[j]){current1.chromosome[j]=variabletop[j];}if(current1.chromosome[j]<variablebottom[j]){current1.chromosome[j]=variablebottom[j];}}//回代}newpopulation.InsertAfter(newpopulation.FindIndex(i),current);newpopulation.InsertAfter(newpopulation.FindIndex(i),current1);}j=newpopulation.GetCount();for(i=0;i<popsize;i++){population.SetAt(population.FindIndex(i),newpopulation.GetAt(newpopulation.FindIndex(i)));}newpopulation.RemoveAll();}voidCMVSOGA::findbestandworstindividual(){inti;bestindividual=population.GetAt(population.FindIndex(best_index));worstindividual=population.GetAt(population.FindIndex(worst_index));for(i=1;i<popsize;i++){current=population.GetAt(population.FindIndex(i));if(current.fitness>bestindividual.fitness){bestindividual=current;best_index=i;}elseif(current.fitness<worstindividual.fitness){worstindividual=current;worst_index=i;}}population.SetAt(population.FindIndex(worst_index),population.GetAt(population.FindIndex(best_index)));//用最好的替代最差的。使用这个之后结果相差很大。不收敛。if(maxgeneration==0){currentbest=bestindividual;}else{if(bestindividual.fitness>=currentbest.fitness){currentbest=bestindividual;}}}voidCMVSOGA::calculatefitnessvalue()//适应度函数值计算,关键是适应度函数的设计//current变化,这段程序变化较大,特别是排序。{inti;doubletemp;〃alpha,beta;〃适应度函数的尺度变化系数doublecmax=100;for(i=0;i<popsize;i++){current=population.GetAt(population.FindIndex(i));if(current.value<cmax){temp=cmax-current.value;}else{temp=0.0;}/*if((population[i].value+cmin)>0.0){temp=cmin+population[i].value;}else{temp=0.0;}*/current.fitness=temp;population.SetAt(population.FindIndex(i),current);}}voidCMVSOGA::performevolution()//演示评价结果,有冗余代码,current变化,程序应该改变较大{if(bestindividual.fitness>currentbest.fitness){currentbest=population.GetAt(population.FindIndex(best_index));}else{population.SetAt(population.FindIndex(worst_index),currentbest);}}voidCMVSOGA::GetResult(double*Result){inti;for(i=0;i<variablenum;i++){Result[i]=currentbest.chromosome[i];}Result[i]=currentbest.value;}CMVSOGA::CMVSOGA(){best_index=0;worst_index=0;crossoverrate=0;//交叉率mutationrate=0;//变异率maxgeneration=0;}voidCMVSOGA::GetPopData(double**PopData)//不能保证每次计算结果都对,为什么?{inti,j;for(i=0;i<popsize;i++){current=population.GetAt(population.FindIndex(i));for(j=0;j<variablenum;j++){PopData[i][j]=current.chromosome[j];}}}voidCMVSOGA::SetValueData(double*ValueData){intj;for(j=0;j<popsize;j++){current=population.GetAt(population.FindIndex(j));current.value=ValueData[j];population.SetAt(population.FindIndex(j),current);}}DLG中调用代码:voidCMVSOFGADlg::OncalNoGuass(){//TODO:AddyourcontrolnotificationhandlercodehereUpdateData(true);UINTi;UINTgeneration;doubletopx[16],bottomx[16];doubleresultx[17];////////////////////////////////////double**PopData;double*PopValue;PopData=newdouble*[m_popsize];for(i=0;ivm_popsize;i++)〃〃〃〃〃〃〃〃/〃〃〃〃变量数目,程序更改时注意/////////////{PopData[i]=newdouble[16];}PopValue=newdouble[m_popsize];//////////////////////////////////////////////////初始化/////////////CMVSOGAcdata;m_result=0;topx[0]=1.28;topx[1]=1.28;topx[2]=1.28;topx[3]=1.28;topx[4]=1.28;topx[5]=1.28;topx[6]=1.28;topx[7]=1.28;topx[8]=1.28;topx[9]=1.28;topx[10]=1.28;topx[11]=1.28;topx[12]=1.28;topx[13]=1.28;topx[14]=1.28;topx[15]=1.28;bottomx[0]=-1.28;bottomx[1]=-1.28;bottomx[2]=-1.28;bottomx[3]=-1.28;bottomx[4]=-1.28;bottomx[5]=-1.28;bottomx[6]=-1.28;bottomx[7]=-1.28;bottomx[8]=-1.28;bottomx[9]=-1.28;bottomx[10]=-1.28;bottomx[11]=-1.28;bottomx[12]=-1.28;bottomx[13]=-1.28;bottomx[14]=-1.28;bottomx[15]=-1.28;cdata.initialpopulation(m_popsize,m_generation,m_csrate,m_mrate,topx,bottomx);cdata.GetPopData(PopData);TargetFunctionCal(PopData,PopValue);cdata.SetValueData
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 企业办公费用管理系统
- 企业数据备份方案
- 会计学教程答案
- 冬季服装促销活动方案
- 会计的实习总结
- 2026 学龄前自闭症穿鞋袜训练课件
- 健康饮食养生秘诀
- 重庆西南大学附中高2026届高考全真模拟试题物理+答案
- 2026 学龄前自闭症感统训练课件
- 宽容礼让的演讲稿
- 2026年机电维修电工考试试题及答案
- 对外投资合作国别(地区)指南 2025 秘鲁
- 义务教育均衡发展质量监测八年级综合试卷测试题
- 5.4基层群众自治制度 课件(共26张)道德与法治统编版八下
- 2026年检察院聘用制书记员招聘笔试试题(含答案)
- 2025年护理质控工作总结及2026年工作计划汇报
- 防车辆冲撞安全培训课件
- 2025年宁夏事业单位招聘考试(面试)细选试题及试题答案解析
- 个人所得税退税课件
- 中国农业大学-本科生毕业论文(设计)撰写基本规范要求-论文格式-
- GB/T 3299-2011日用陶瓷器吸水率测定方法
评论
0/150
提交评论