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 + -
显示快捷键?