ga.cpp
来自「c++语言实现的遗传算法的例子,需要的快下啊」· C++ 代码 · 共 121 行
CPP
121 行
// GA.cpp: implementation of the GA class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "GA.h"
#include "time.h"
#include "TSP.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
extern int hour;
extern int minute;
extern int second;
extern int millisecond;
extern int nowround;
extern double * gb;
extern clock_t avetime;
GA::GA(Adaptability * adapt,Parameter * param)
{
double loc_max;
double loc_min;
int dimension=(int)param->CharToInt(param->GetCombo(5));
loc_min=0;
loc_max=dimension-1;
double px=param->CharToInt(param->GetCombo(6));
double pm=param->CharToInt(param->GetCombo(7));
int scale=(int)param->CharToInt(param->GetCombo(1));
maxgen=(int)param->CharToInt(param->GetCombo(2));
rand=new Rand;
int signal;
Coding * code;
Mutate * mut;
//编码方式
//
XOver * xover;
Select * sel;
//交叉方式
if(strcmp(param->GetCombo(4),"顺序交叉(改)")==0)
xover=new XOver3(dimension,rand,px);
//选择方式
if(strcmp(param->GetCombo(11),"适应度比例法")==0)
sel=new Select1(scale);
if(strcmp(param->GetCombo(11),"固定比例法")==0)
sel=new Select2(scale);
//变异方式
if(strcmp(param->GetCombo(8),"对换变异")==0)
mut=new Mutate3(pm,dimension);
if(strcmp(param->GetCombo(8),"插入变异")==0)
mut=new MutateInsert(pm,dimension);
if(strcmp(param->GetCombo(8),"翻转变异")==0)
mut=new MutateReversal(pm,dimension);
file1=fopen("location.zn","w");
file2=fopen("solution.zn","w");
// FILE * file ;
// file=fopen("2.zn","w");
// fprintf(file,"%f %f %f %d\n",ph,result,dif[0],length);
/* fprintf(file,"%f ",loc_max);
fprintf(file,"%f ",loc_min);
fprintf(file,"%d ",dimension);
fprintf(file,"%d ",maxgen);
fprintf(file1,"%s ",param->GetCombo(4));
fprintf(file1,"%s ",param->GetCombo(3));
fprintf(file1,"%s ",param->GetCombo(11));
fprintf(file1,"%s ",param->GetCombo(12));
fprintf(file1,"%f ",e1);
fprintf(file1,"%f ",e2);
fprintf(file1,"%f ",e3);
fprintf(file1,"%f ",lp);
fprintf(file1,"%d ",number);
fprintf(file,"%d\n",scale);fclose(file);*/
//群体更新方式
MaintainSequence * maintain;
double temp=param->CharToInt(param->GetCombo(13));
maintain=new MaintainSequence(dimension,(int)(dimension*temp),(AdaptabilityTSP *)adapt,rand);
code=new CodingSequence(loc_min,loc_max,dimension,rand);
signal=3;
if(strcmp(param->GetCombo(12),"最差淘汰")==0)
recomb=new Recombine3(scale,sel,xover,mut,code,adapt,dimension,signal,file1,file2,maintain);
}
void GA::Run()
{
clock_t star;
star=clock();
clock_t now;
char szTitle[128];
int n=0;
while(n<maxgen)
{
recomb->NewPop(rand);
n++;
now=clock();
double time=(double)(now-star)/CLOCKS_PER_SEC;
millisecond=((int)(time*100))%100;
second=((int)time)%60;
minute=((int)time-second)/60%60;
hour=(((int)time-second)/60-minute)/60;
wsprintf(szTitle,"迭代次数%d 运行时间%d%d:%d%d:%d%d.%d%d",n,hour/10,hour%10,minute/10,minute%10,second/10,second%10,millisecond/10,millisecond%10);
SetWindowText(hWndMain,szTitle);
}
avetime+=now-star;
gb[nowround]=recomb->GetBS();
}
GA::~GA()
{
fclose(file1);
fclose(file2);
delete recomb;
delete rand;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?