⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sa.cpp

📁 c++语言实现的遗传算法的例子,需要的快下啊
💻 CPP
字号:
// SA.cpp: implementation of the SA class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "SA.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;

SA::SA(Adaptability *adapt,Parameter * param)
{
	double loc_max;
	double loc_min;
	int dimension=(int)param->CharToInt(param->GetCombo(5));
	double pr;
	rand=new Rand;

	if(strcmp(param->GetCombo(6),"1/n")==0)
		pr=1;
	else
		pr=(int)(dimension*param->CharToInt(param->GetCombo(6)));
	loc_min=0;
	loc_max=dimension-1;
	if(strcmp(param->GetCombo(4),"随机搜索")==0)
		search=new SearchAreaTsp(rand,pr,dimension);
	island=new Bypath(dimension,search,adapt,rand);
	signalbalance=2;
	
	if(strcmp(param->GetCombo(11),"有")==0)
	{
		signalbalance=3;
		maintain=new MaintainSequence(dimension,(int)(dimension),(AdaptabilityTSP *)adapt,rand);
	}
	maxtest=(int)param->CharToInt(param->GetCombo(13));
	t=param->CharToInt(param->GetCombo(12));
	maxgen=(int)param->CharToInt(param->GetCombo(2));
	rule=new AcceptRule(0.000001,rand);
	if(strcmp(param->GetCombo(3),"对数下降")==0)
	{
		anneal=new LogarithmDescend(t,maxgen);
		signalanneal=1;
	}
	if(strcmp(param->GetCombo(3),"快速下降")==0)
	{
		anneal=new CelerityDescend(t);
		signalanneal=2;
	}
	if(strcmp(param->GetCombo(3),"指数退温")==0)
	{
		double e=param->CharToInt(param->GetCombo(7));
		anneal=new ExponentDescend(e);
		signalanneal=3;
	}
	if(strcmp(param->GetCombo(3),"直线下降")==0)
	{
		anneal=new BeelineDescend(t,maxgen);
		signalanneal=4;
	}
	if(strcmp(param->GetCombo(8),"迭代次数")==0)
		signalfinal=1;
	if(strcmp(param->GetCombo(8),"停止代数")==0)
	{
		signalfinal=2;
	}
	if(strcmp(param->GetCombo(8),"终止温度")==0)
		signalfinal=3;
	stasisgen=(int)param->CharToInt(param->GetCombo(14));
	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(file,"%s  ",param->GetCombo(7));
	fprintf(file,"%s  ",param->GetCombo(3));
	fprintf(file,"%s  ",param->GetCombo(8));
	fprintf(file,"%s  ",param->GetCombo(12));
	fprintf(file1,"%f  ",e1);
	fprintf(file1,"%f  ",e2);
	fprintf(file1,"%f  ",e3);
	fprintf(file1,"%f  ",lp);*/
	fprintf(file,"%d  ",maxtest);
	fprintf(file,"%d\n",signalfinal);fclose(file);
}

void SA::Run()
{
	clock_t star;
	clock_t now;
	star=clock();
	int n=0;
	double time;
	int signal=1;
	int staynum=0;
	char szTitle[128];
	double tf=0.01*t;
	bool isfinish=false;
	while(!isfinish)
	{
		int i=0;
		double temp=search->GetR();
		double sol=island->GetSolution();
		while(i<maxtest)
		{
			search->SetR(signal);
			Balance * newisland;
			switch(signalbalance)
			{
//			case 1:	newisland=new Island((Island *)island);
//					break;
			case 2: newisland=new Bypath((Bypath *)island);
					break;
			case 3: newisland=new Bypath((Bypath *)island,maintain);
					break;
			}
			double newsol=newisland->GetSolution();
//			FILE * file ;
	//		file=fopen("2.zn","w");
		//	fprintf(file,"%f    %f\n",sol,newsol);
	//		fclose(file);
			if(rule->Accept(newsol-sol,t))
			{
				delete island;
				island=newisland;
	//			rule->SetK(fabs(newsol-sol));
				break;
			}
			signal=1;
			delete newisland;
			i++;
		}
		if(i<maxtest)
		{
			if(signalanneal==3)
				t=anneal->Annealing(t);
			else
				t=anneal->Annealing(n);
			staynum=0;
			signal=2;
		}
		else
		{
			signal=1;
			staynum++;
		}
		search->SetR(temp);
		search->SetR(signal);
		island->Store(file1,file2);
		n++;
		switch(signalfinal)
		{
		case 1:if(n<maxgen)
				   isfinish=false;
			else
				isfinish=true;
			break;
		case 2:if(stasisgen>staynum)
				   isfinish=false;
			else
				isfinish=true;
			break;
		case 3:if(t>tf)
				   isfinish=false;
			else
				isfinish=true;
			break;
		}
		now=clock();
		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]=island->GetSolution();
//	fprintf(file2,"%d,%d,%f",n,staynum,t);
}

SA::~SA()
{
	fclose(file1);
	fclose(file2);
	delete island;
	delete search;
	delete rule;
	delete anneal;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -