




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
这是我在解决电梯动力学参数写的简单遗传算法(程序带目标函数值、适应度值计算,但是我的适应度函数因为目标函数的计算很特殊,一起放在了程序外面计算,在此不提供)。头文件:/ CMVSOGA.h : main header file for the CMVSOGA.cpp/ 本来想使用链表里面套链表的,程序调试比较麻烦,改为种群用链表表示/染色体固定为16的方法。#if !defined(AFX_CMVSOGA_H_45BECA_61EB_4A0E_9746_9A94D1CCF767_INCLUDED_)#define AFX_CMVSOGA_H_45BECA_61EB_4A0E_9746_9A94D1CCF767_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000#include Afxtempl.h#define variablenum 16class CMVSOGApublic:CMVSOGA();void selectionoperator();void crossoveroperator();void mutationoperator();void initialpopulation(int, int ,double ,double,double *,double *);/种群初始化void generatenextpopulation();/生成下一代种群void evaluatepopulation();/评价个体,求最佳个体void calculateobjectvalue();/计算目标函数值void calculatefitnessvalue();/计算适应度函数值void findbestandworstindividual();/寻找最佳个体和最差个体void performevolution();void GetResult(double *);void GetPopData(double *);void SetValueData(double *);void maxandexpectation();private:struct individualdouble chromosomevariablenum;/染色体编码长度应该为变量的个数double value; double fitness;/适应度;double variabletopvariablenum;/变量值double variablebottomvariablenum;/变量值int popsize;/种群大小/int generation;/世代数int best_index;int worst_index;double crossoverrate;/交叉率double mutationrate;/变异率int maxgeneration;/最大世代数struct individual bestindividual;/最佳个体struct individual worstindividual;/最差个体struct individual current; /当前个体struct individual current1; /当前个体struct individual currentbest;/当前最佳个体CList population;/种群CList newpopulation;/新种群CList cfitness;/存储适应度值/double maxfitness;/double minfitness;/double avefitness;/怎样使链表的数据是一个结构体?主要是想把种群作成链表。节省空间。;#endif执行文件/ CMVSOGA.cpp : implementation file/#include stdafx.h#include CMVSOGA.h#include math.h#include stdlib.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CMVSOGA.cppvoid CMVSOGA:initialpopulation(int ps, int gen ,double cr ,double mr,double *xtop,double *xbottom)/第一步,初始化。int i ,j;popsize=ps ;maxgeneration=gen;crossoverrate=cr;mutationrate =mr;for (i=0;ivariablenum;i+)variabletopi =xtopi;variablebottomi =xbottomi;srand( (unsigned)time( NULL ) );for(i=0;ipopsize;i+)for (j=0;jvariablenum ;j+)current.chromosomej=double(rand()%1000)/1000*(variabletopj-variablebottomj)+variablebottomj;current.fitness=0;current.value=0;population.InsertAfter(population.FindIndex(i),current);/除了初始化使用insertafter外,其他的用setat命令。void CMVSOGA:generatenextpopulation()/第三步,生成下一代。selectionoperator();crossoveroperator();mutationoperator();void CMVSOGA:evaluatepopulation() /第二步,评价个体,求最佳个体/calculateobjectvalue();calculatefitnessvalue();/在此步中因该按适应度值进行排序.链表的排序.findbestandworstindividual();void CMVSOGA: calculateobjectvalue() /计算函数值,应该由外部函数实现。主要因为目标函数很复杂。int i,j; double xvariablenum;for (i=0; ipopsize; i+)current=population.GetAt(population.FindIndex(i); current.value=0;/使用外部函数进行,在此只做结果的传递。for (j=0;jvariablenum;j+)xj=current.chromosomej;current.value=current.value+(j+1)*pow(xj,4);/使用外部函数进行,在此只做结果的传递。population.SetAt(population.FindIndex(i),current);void CMVSOGA:mutationoperator()/对于浮点数编码,变异算子的选择具有决定意义。/需要guass正态分布函数,生成方差为sigma,均值为浮点数编码值c。int i,j;double r1,r2,p,sigma;/sigma高斯变异参数sigma=0.5;for (i=0;ipopsize;i+)current=population.GetAt(population.FindIndex(i);/生成均值为current.chromosome,方差为sigma的高斯分布数srand(unsigned int) time (NULL);for(j=0; jvariablenum; j+)r1 =double( rand()%1001)/1000;r2 = double(rand()%1001)/1000;p=double(rand()%1000)/1000;if(pvariabletopj)current.chromosomej=variabletopj;if (current.chromosomejvariablebottom j)current.chromosomej=variablebottom j;population.SetAt(population.FindIndex(i),current);void CMVSOGA:selectionoperator() /从当前个体中按概率选择新种群,应该加一个复制选择,提高种群的平均适应度/第二次循环出错int i,j,pindex=0;double p,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;ipopsize;i+)current=population.GetAt(population.FindIndex(i);for(j=0;ji;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;ipopsize;i+)/求适应度总值,以便归一化,是已经排序好的链。current=population.GetAt(population.FindIndex(i);sum+=current.fitness;for(i=0;ipopsize; i+)/归一化current=population.GetAt(population.FindIndex(i);current.fitness=current.fitness/sum;cfitness.InsertAfter (cfitness .FindIndex(i),current.fitness);for(i=1;ipopsize; 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;i=pc&pindexpopsize)/问题所在。pc=cfitness.GetAt(cfitness .FindIndex(pindex);pindex+;/必须是从indexpopsize,选择高概率的数。即大于概率p的数应该被选择,选择不满则进行下次选择。for (j=popsize-1;jpindex&ipopsize;j-)newpopulation.InsertAfter (newpopulation.FindIndex(0),population.GetAt (population.FindIndex(j);i+;for(i=0;ipopsize; i+)population.SetAt (population.FindIndex(i),newpopulation.GetAt (newpopulation.FindIndex(i);/j=newpopulation.GetCount();/j=population.GetCount();newpopulation.RemoveAll();/current 变化后,以上没有问题了。void CMVSOGA: crossoveroperator() /非均匀算术线性交叉,浮点数适用,alpha ,beta是(0,1)之间的随机数/对种群中两两交叉的个体选择也是随机选择的。也可取beta=1-alpha;/current的变化会有一些改变。int i,j;double alpha,beta;CList index;int point,temp;double p;srand( (unsigned)time( NULL ) );for (i=0;ipopsize;i+)/生成序号index.InsertAfter (index.FindIndex(i),i);for (i=0;ipopsize;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;ipopsize-1;i+=2)/按顺序序号,按序号选择两个母体进行交叉操作。p=double(rand()%1000)/1000.0;if (pcrossoverrate) 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);/临时使用current1代替for(j=0;jvariabletopj)/判断是否超界.current.chromosomej=variabletopj;if (current.chromosomejvariabletopj)current1.chromosomej=variabletopj;if (current1.chromosomejvariablebottom j)current1.chromosomej=variablebottom j;/回代newpopulation.InsertAfter (newpopulation.FindIndex(i),current);newpopulation.InsertAfter (newpopulation.FindIndex(i),current1);j=newpopulation.GetCount();for (i=0;ipopsize;i+)population.SetAt (population.FindIndex(i),newpopulation.GetAt (newpopulation.FindIndex(i);newpopulation.RemoveAll();void CMVSOGA: findbestandworstindividual( )int i;bestindividual=population.GetAt(population.FindIndex(best_index);worstindividual=population.GetAt(population.FindIndex(worst_index);for (i=1;ibestindividual.fitness)bestindividual=current;best_index=i;else if (current.fitness=currentbest.fitness)currentbest=bestindividual;void CMVSOGA: calculatefitnessvalue()/适应度函数值计算,关键是适应度函数的设计/current变化,这段程序变化较大,特别是排序。int i;double temp;/alpha,beta;/适应度函数的尺度变化系数double cmax=100;for(i=0;ipopsize;i+)current=population.GetAt(population.FindIndex(i);if(current.value0.0) temp=cmin+populationi.value;elsetemp=0.0; */current.fitness=temp;population.SetAt(population.FindIndex(i),current);void CMVSOGA: performevolution() /演示评价结果,有冗余代码,current变化,程序应该改变较大if (bestindividual.fitnesscurrentbest.fitness)currentbest=population.GetAt(population.FindIndex(best_index);elsepopulation.SetAt(population.FindIndex(worst_index),currentbest);void CMVSOGA:GetResult(double *Result)int i;for (i=0;ivariablenum;i+)Resulti=currentbest.chromosomei;Resulti=currentbest.value;CMVSOGA:CMVSOGA()best_index=0;worst_index=0;crossoverrate=0;/交叉率mutationrate=0;/变异率maxgeneration=0;void CMVSOGA:GetPopData(double *PopData) /不能保证每次计算结果都对,为什么?int i,j;for (i=0;ipopsize;i+)current=population.GetAt(population.FindIndex(i);for (j=0;jvariablenum;j+)PopDataij=current.chromosomej;void CMVSOGA:SetValueData(double *ValueData)int j;for (j=0;jpopsize;j+) current=population.GetAt(population.FindIndex(j);current.value=ValueDataj;population.SetAt(population.FindIndex(j),current);DLG中调用代码:void CMVSOFGADlg:OncalNoGuass() / TODO: Add your control notification handler code hereUpdateData(true);UINT i;UINT generation;double topx16, bottomx16;double resultx17;/double * PopData;double *PopValue;PopData = new double*m_popsize;for(i=0; im_popsize; i+)/变量数目,程序更改时注意/PopDatai = new double16;PopValue=new double m_popsize;/初始化/CMVSOGA cdata;m_result=0;topx0=1.28;topx1=1.28;topx2=1.28;topx3=1.28;topx4=1.28;topx5=1.28;topx6=1.28;topx7=1.28;topx8=1.28;topx9=1.28;topx10=1.28;topx11=1.28;topx12=1.28;topx13=1.28;topx14=1.28;topx15=1.28;bottomx0=-1.28;bottomx1=-1.28;bottomx2=-1.28;bottomx3=-1.28;bottomx4=-1.28;bottomx5=-1.28;bottomx6=-1.28;bottomx7=-1.28;bottomx8=-1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025广东广州市天河区华融小学(公办小学)招聘语文教师、体育教师2人(学校自筹经费)笔试模拟试题及答案解析
- 2025年甘肃省庆阳市环县县城高中、初中等学校选调专任教师65人考试模拟试题及答案解析
- 2025中国人民大学高瓴人工智能学院招聘2人考试备考试题及答案解析
- 2025年铁岭市昌图县公益性岗位招聘5人笔试参考题库附答案解析
- 2025福建漳州市国有资本运营集团有限公司权属企业福建金信商业保理有限公司选聘1人笔试模拟试题及答案解析
- 2025西藏日喀则市面向黑龙江省定向招募高校毕业生“三支一扶”计划20人笔试模拟试题及答案解析
- 2025年漯河市中心医院(高水平医院) 引进学科 带头人12名笔试备考试题及答案解析
- 四川省科技交流中心2025年度考核招聘事业编制工作人员考试备考题库及答案解析
- 2025年安徽国控集团所属企业招聘7人考试模拟试题及答案解析
- 2025年河北沧州泊头市泊控产业发展集团有限公司公开招聘工作人员13名考试参考题库附答案解析
- (2025)公开选拔科级领导干部考试笔试试题和答案
- 2025重庆市璧山区辅警考试试卷真题
- 新疆水利面试试题及答案
- 工程挂靠免责协议书
- 物流中心建设的施工难点及应对措施
- 政府采购法律法规规章培训课件(供应商版)
- 监控维护培训
- 医学实验室质量控制知识试题及答案
- 碘125粒子植入护理
- 2025年内燃机车钳工(中级)职业技能鉴定参考试题库(含答案)
- 《2025年CSCO前列腺癌诊疗指南》更新要点解读 2
评论
0/150
提交评论