流水车间作业码源.docx
- 文档编号:26686577
- 上传时间:2023-06-21
- 格式:DOCX
- 页数:20
- 大小:21.54KB
流水车间作业码源.docx
《流水车间作业码源.docx》由会员分享,可在线阅读,更多相关《流水车间作业码源.docx(20页珍藏版)》请在冰豆网上搜索。
流水车间作业码源
C++遗传算法源程序
//CMVSOGA.h:
mainheaderfilefortheCMVSOGA.cpp
////////////////////////////////////////////////////////////////////
///// /////
///// 沈阳航空工业学院动力工程系 /////
///// 作者:
李立新 /////
///// 完成日期:
2006.08.02 /////
///// 修改日期:
2007.04.10 /////
////////////////////////////////////////////////////////////////////
#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"
#definevariablenum14
classCMVSOGA
{
public:
CMVSOGA();
~CMVSOGA();
voidselectionoperator();
voidcrossoveroperator();
voidmutationoperator();
voidinitialpopulation(int,int,double,double,double*,double*); //种群初始化
voidgeneratenextpopulation(); //生成下一代种群
voidevaluatepopulation(); //评价个体,求最佳个体
voidcalculateobjectvalue(); //计算目标函数值
voidcalculatefitnessvalue(); //计算适应度函数值
voidfindbestandworstindividual(); //寻找最佳个体和最差个体
voidperformevolution();
voidGetResult(double*);
voidGetPopData(CList
voidSetFitnessData(CList
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
CList
CList
//怎样使链表的数据是一个结构体?
?
?
?
主要是想把种群作成链表。
节省空间。
};
#endif
执行文件:
//CMVSOGA.cpp:
implementationfile
//
#include"stdafx.h"
//#include"vld.h"
#include"CMVSOGA.h"
#include"math.h"
#include"stdlib.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CMVSOGA.cpp
CMVSOGA:
:
CMVSOGA()
{
best_index=0;
worst_index=0;
crossoverrate=0; //交叉率
mutationrate=0; //变异率
maxgeneration=0;
}
CMVSOGA:
:
~CMVSOGA()
{
best_index=0;
worst_index=0;
crossoverrate=0; //交叉率
mutationrate=0; //变异率
maxgeneration=0;
population.RemoveAll(); //种群
newpopulation.RemoveAll(); //新种群
cfitness.RemoveAll();
}
voidCMVSOGA:
:
initialpopulation(intps,intgen,doublecr,doublemr,double*xtop,double*xbottom) //第一步,初始化。
{
//应该采用一定的策略来保证遗传算法的初始化合理,采用产生正态分布随机数初始化?
选定中心点为多少?
inti,j;
popsize=ps;
maxgeneration=gen;
crossoverrate=cr;
mutationrate=mr;
for(i=0;i { variabletop[i]=xtop[i]; variablebottom[i]=xbottom[i]; } //srand((unsigned)time(NULL)); //寻找一个真正的随机数生成函数。 for(i=0;i { for(j=0;j { current.chromosome[j]=double(rand()%10000)/10000*(variabletop[j]-variablebottom[j])+variablebottom[j]; } current.fitness=0; current.value=0; population.InsertAfter(population.FindIndex(i),current);//除了初始化使用insertafter外,其他的用setat命令。 } } voidCMVSOGA: : generatenextpopulation()//第三步,生成下一代。 { //srand((unsigned)time(NULL)); selectionoperator(); crossoveroperator(); mutationoperator(); } //voidCMVSOGA: : evaluatepopulation() //第二步,评价个体,求最佳个体 //{ // calculateobjectvalue(); // calculatefitnessvalue(); //在此步中因该按适应度值进行排序.链表的排序. // findbestandworstindividual(); //} voidCMVSOGA: : calculateobjectvalue() //计算函数值,应该由外部函数实现。 主要因为目标函数很复杂。 { inti,j; doublex[variablenum]; for(i=0;i { current=population.GetAt(population.FindIndex(i)); current.value=0; //使用外部函数进行,在此只做结果的传递。 for(j=0;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。 { // srand((unsignedint)time(NULL)); inti,j; doubler1,r2,p,sigma;//sigma高斯变异参数 for(i=0;i { current=population.GetAt(population.FindIndex(i)); //生成均值为current.chromosome,方差为sigma的高斯分布数 for(j=0;j { r1=double(rand()%10001)/10000; r2=double(rand()%10001)/10000; p=double(rand()%10000)/10000; if(p { doublesign; sign=rand()%2; sigma=0.01*(variabletop[j]-variablebottom[j]); //高斯变异 if(sign) { current.chromosome[j]=(current.chromosome[j] +sigma*sqrt(-2*log(r1)/0.4323)*sin(2*3.1415926*r2)); } else { 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]=double(rand()%10000)/10000*(variabletop[j]-variablebottom[j])+variablebottom[j]; } if(current.chromosome[j] { current.chromosome[j]=double(rand()%10000)/10000*(variabletop[j]-variablebottom[j])+variablebottom[j]; } } } population.SetAt(population.FindIndex(i),current); } } voidCMVSOGA: : selectionoperator() //从当前个体中按概率选择新种群,应该加一个复制选择,提高种群的平均适应度 { inti,j,pindex=0; doublep,pc,sum; 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 { current=population.GetAt(population.FindIndex(i)); for(j=0;j { 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;i { current=population.GetAt(population.FindIndex(i));//取出来的值出现问题. sum+=current.fitness; } for(i=0;i { current=population.GetAt(population.FindIndex(i));//population有值,为什么取出来的不正确呢? ? current.fitness=current.fitness/sum; cfitness.InsertAfter(cfitness.FindIndex(i),current.fitness); } for(i=1;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 本段还有问题。 { p=double(rand()%999)/1000+0.0001; //随机生成概率 pindex=0; //遍历索引 pc=cfitness.GetAt(cfitness.FindIndex (1)); //为什么取不到数值? ? ? 20060910 while(p>=pc&&pindex { pc=cfitness.GetAt(cfitness.FindIndex(pindex)); pindex++; } //必须是从index~popsize,选择高概率的数。 即大于概率p的数应该被选择,选择不满则进行下次选择。 for(j=popsize-1;j { newpopulation.InsertAfter(newpopulation.FindIndex(0), population.GetAt(population.FindIndex(j))); i++; } } for(i=0;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 intpoint,temp; doublep; // srand((unsigned)time(NULL)); for(i=0;i { index.InsertAfter(index.FindIndex(i),i); } for(i=0;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;i {//按顺序序号,按序号选择两个母体进行交叉操作。 p=double(rand()%10000)/10000.0; if(p { alpha=double(rand()%10000)/10000.0; beta=double(rand()%10000)/10000.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;j { //交叉 doublesign; sign=rand()%2; if(sign) { current.chromosome[j]=(1-alpha)*current.chromosome[j]+ beta*current1.chromosome[j]; } else { current.chromosome[j]=(1-alpha)*current.chromosome[j]- beta*current1.chromosome[j]; } if(current.chromosome[j]>variabletop[j]) //判断是否超界. { current.chromosome[j]=double(rand()%10000)/10000*(variabletop[j]-variablebottom[j])+variablebottom[j]; } if(current.chromosome[j] { current.chromosome[j]=double(rand()%10000)/10000*(variabletop[j]-variablebottom[j])+variablebottom[j]; } if(sign) { current1.chromosome[j]=alpha*current.chr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 流水 车间 作业
![提示](https://static.bdocx.com/images/bang_tan.gif)