1、这是我在解决电梯动力学参数写的简单遗传算法程序带目标这是我在解决电梯动力学参数写的简单遗传算法(程序带目标函数值、适应度值计算,但是我的适应度函数因为目标函数的计算很特殊,一起放在了程序外面计算,在此不提供)。头文件:/ CMVSOGA.h : main header file for the CMVSOGA.cpp/ / 沈阳航空工业学院 动力工程系 / 作者:李立新 / 完成日期:2006.08.02 / / 本来想使用链表里面套链表的,程序调试比较麻烦,改为种群用链表表示/染色体固定为16的方法。#if !defined(AFX_CMVSOGA_H_45BECA_61EB_4A0E_97
2、46_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 initial
3、population(int, int ,double ,double,double *,double *);/种群初始化void generatenextpopulation();/生成下一代种群void evaluatepopulation();/评价个体,求最佳个体void calculateobjectvalue();/计算目标函数值void calculatefitnessvalue();/计算适应度函数值void findbestandworstindividual();/寻找最佳个体和最差个体void performevolution();void GetResult(doubl
4、e *);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
5、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;/种群C
6、List 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_FILEs
7、tatic 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;
8、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 CM
9、VSOGA:generatenextpopulation()/第三步,生成下一代。selectionoperator();crossoveroperator();mutationoperator();void CMVSOGA:evaluatepopulation() /第二步,评价个体,求最佳个体/calculateobjectvalue();calculatefitnessvalue();/在此步中因该按适应度值进行排序.链表的排序.findbestandworstindividual();void CMVSOGA: calculateobjectvalue() /计算函数值,应该由外部函数
10、实现。主要因为目标函数很复杂。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.FindInd
11、ex(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);fo
12、r(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
13、: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(populatio
14、n.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+)/求适应
15、度总值,以便归一化,是已经排序好的链。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.f
16、itness=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
17、,选择高概率的数。即大于概率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.G
18、etCount();/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( NUL
19、L ) );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)/按顺序序号,按
20、序号选择两个母体进行交叉操作。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代
21、替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.InsertA
22、fter (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.fitnessworstindividual.fitness)worstindividual=current;worst_index=i;population.SetAt(population.FindIndex(worst_index),
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1