📄 sa.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 + -