📄 ga.cpp
字号:
/*****************************************************************/
/* 基于遗传模拟退火算法的银行中心金库车辆数目的优化程序 */
/* 中国农业银行东莞分行 熊刚强 2006年09月 */
/*****************************************************************/
#include "StdAfx.h"
#include "ga.h"
#include "test.cpp"
/******************************************************************/
/* 函数名: ReadParameterFromTXT() */
/* 参 数: cKey-参变量名字;dValue-返回值 */
/* 返回值: OK-1;NO-0 */
/* 功 能: 读参数文件data.txt */
/* 根据cKey获取相应的值 */
/******************************************************************/
int GetData()
{
FILE *fp;
char cName[80],ch,cValue[40];
int i=0,j=0,k=0;
int iNameFlag=0; //变量名标识
int iNullFlag=0; //行尾注释标识,若为1,表明是注释,不读
int iBegin1Bracket=0,iBegin2Bracket=0; //括号标识
fp=fopen(fileData,"r");
if(fp==NULL)return NO;
while(feof(fp)==0){
ch=fgetc(fp);
if(ch=='#'){
cName[0]='\0';
i=0;
iNameFlag=1;
iNullFlag=0;
iBegin1Bracket=0;
iBegin2Bracket=0;
continue;
}
if(iNameFlag==1 && ch!='='){
cName[i]=ch;
i++;
continue;
}
if(iNameFlag==1 && ch=='='){
cName[i]='\0';
iNameFlag=0;
continue;
}
if(ch=='{'){
iNullFlag=0;
if(iBegin1Bracket==0){
iBegin1Bracket=1;
}
else if(iBegin2Bracket==0){
iBegin2Bracket=1;
k=0;
}
else k++;
cValue[0]='\0';
i=0;
j=0;
continue;
}
if(iNullFlag==1) continue;
if(ch==0x20) continue;
if(iNameFlag==0){
if(ch!=','&&ch!='}'){
cValue[i]=ch;
i++;
continue;
}
else{
cValue[i]='\0';
if(strcmp(cName,"dWorkTime")==0){
dWorkTime[j]=atof(cValue);
}
if(strcmp(cName,"dSiteWeight")==0){
dSiteWeight[j]=atof(cValue);
}
if(strcmp(cName,"dCarCapacity")==0){
dCarCapacity[j]=atof(cValue);
}
if(strcmp(cName,"dRunTime")==0){
dRunTime[k][j]=atof(cValue);
}
j++;
i=0;
if(ch=='}'){iNullFlag=1;}
continue;
}
}
}
return OK;
}
/******************************************************************/
/* 函数名: ReadParameterFromTXT() */
/* 参 数: cKey-参变量名字;dValue-返回值 */
/* 返回值: OK-1;NO-0 */
/* 功 能: 读参数文件parameter.txt */
/* 根据cKey获取相应的值 */
/******************************************************************/
int ReadParameterFromTXT(char *cKey,double *dValue)
{
FILE *fp;
int iCode,i=0;
char cList[3200],ch;
char *cSubList;
fp=fopen(filePara,"r");
if(fp==NULL)return NO;
while(feof(fp)==0){
ch=fgetc(fp);
cList[i]=ch;
i++;
}
cList[i]='\0';
iCode=fclose(fp);
if(iCode!=0)return NO;
cSubList=strtok(cList,"#");
iCode=0;
while(cSubList!=NULL){
if((strncmp(cSubList,cKey,strlen(cKey)))==0){
*dValue=atof(strchr(cSubList,'=')+1);
return OK;
}
cSubList=strtok(NULL,"#");
}
return NO;
}
/******************************************************************/
/* 函数名: GetParameterValue() */
/* 参 数: 无 */
/* 返回值: OK-1;NO-0 */
/* 功 能: 调用函数ReadParameterFromTXT */
/* 获取遗传模拟退火算法的控制参数 */
/******************************************************************/
int GetParameterValue()
{
int iReturn;
double dBuffer=0.0;
iReturn=ReadParameterFromTXT("dTimeLimit",&dBuffer);
if(iReturn==OK) dTimeLimit=dBuffer;
else return NO;
iReturn=ReadParameterFromTXT("dPCross",&dBuffer);
if(iReturn==OK) dPCross=dBuffer;
else return NO;
iReturn=ReadParameterFromTXT("dPMutation",&dBuffer);
if(iReturn==OK) dPMutation=dBuffer;
else return NO;
iReturn=ReadParameterFromTXT("iPopSize",&dBuffer);
if(iReturn==OK) iPopSize=(int)(dBuffer);
else return NO;
if(iPopSize%2!=0) iPopSize+=1;
iReturn=ReadParameterFromTXT("iChromLong",&dBuffer);
if(iReturn==OK) iChromLong=(int)(dBuffer);
else return NO;
iReturn=ReadParameterFromTXT("iPrintFlag",&dBuffer);
if(iReturn==OK) iPrintFlag=(int)(dBuffer);
else return NO;
iReturn=ReadParameterFromTXT("dAlpha",&dBuffer);
if(iReturn==OK) dAlpha=dBuffer;
else return NO;
iReturn=ReadParameterFromTXT("dMaxTemperature",&dBuffer);
if(iReturn==OK) dMaxTemperature=dBuffer;
else return NO;
iReturn=ReadParameterFromTXT("dMinTemperature",&dBuffer);
if(iReturn==OK) dMinTemperature=dBuffer;
else return NO;
iReturn=ReadParameterFromTXT("iNumCycle",&dBuffer);
if(iReturn==OK) iNumCycle=(int)(dBuffer);
else return NO;
iReturn=ReadParameterFromTXT("dDownRate",&dBuffer);
if(iReturn==OK) dDownRate=dBuffer;
else return NO;
iReturn=ReadParameterFromTXT("iMaxGen",&dBuffer);
if(iReturn==OK) iMaxGen=(int)(dBuffer);
else return NO;
iReturn=ReadParameterFromTXT("iMaxRuns",&dBuffer);
if(iReturn==OK) iMaxRuns=(int)(dBuffer);
else return NO;
return OK;
}
/******************************************************************/
/* 函数名: CreatePopulation() */
/* 参 数: 无 */
/* 返回值: OK-1; NO-0 */
/* 功 能: 随机产生初始种群,并初始化 */
/******************************************************************/
int CreatePopulation()
{
int *iTempChrom;
int iPosition;
iTempChrom = (int*)calloc(iChromLong+1,sizeof(int));
if(iTempChrom == NULL) return NO;
for(int j=0; j<iPopSize; j++){
for(int i=1; i<=iChromLong; i++) iTempChrom[i-1]=i;
iTempChrom[i-1]='\0';
for(i=0; i<iChromLong; i++){
iPosition=Randomize(1,iChromLong-i);
stOldPopulation[j].iChrom[i]=iTempChrom[iPosition-1];
for(int k=iPosition; k<=iChromLong-1-i; k++)
iTempChrom[k-1]=iTempChrom[k];
}
stOldPopulation[j].iChrom[i]='\0';
CalculateFitnessValue(&stOldPopulation[j]);
/* 初始化相关的值 */
stOldPopulation[j].iGeneration=1;
stOldPopulation[j].iXSite1=0;
stOldPopulation[j].iXSite2=0;
stOldPopulation[j].iParent[0]=-1;
stOldPopulation[j].iParent[1]=-1;
/* 用模拟退火算法产生局部最优个体 */
SimulatedAnnealing(&stOldPopulation[j]);
}
free(iTempChrom);
return OK;
}
/******************************************************************/
/* 函数名: InitiateVMemory() */
/* 参 数: 无 */
/* 返回值: OK-1; NO-0 */
/* 功 能: 为全局的指针变量分配空间 */
/******************************************************************/
int InitiateVMemory()
{
int iBytes;
iBytes=iPopSize*sizeof(struct individual);
if((stOldPopulation=(struct individual *)malloc(iBytes))==NULL){
return NO;
}
if((stNewPopulation=(struct individual *)malloc(iBytes))==NULL){
return NO;
}
for(int j=0; j<iPopSize; j++){
if((stOldPopulation[j].iChrom=(int*)calloc(iChromLong+1,sizeof(int)))==NULL){
return NO;
}
if((stOldPopulation[j].dCarFactTime=(double*)calloc(iChromLong+1,sizeof(double)))==NULL){
return NO;
}
if((stOldPopulation[j].dCarFactWeight=(double*)calloc(iChromLong+1,sizeof(double)))==NULL){
return NO;
}
if((stOldPopulation[j].iLineStartPos=(int*)calloc(iChromLong+1,sizeof(int)))==NULL){
return NO;
}
if((stNewPopulation[j].iChrom=(int*)calloc(iChromLong+1,sizeof(int)))==NULL){
return NO;
}
if((stNewPopulation[j].dCarFactTime=(double*)calloc(iChromLong+1,sizeof(double)))==NULL){
return NO;
}
if((stNewPopulation[j].dCarFactWeight=(double*)calloc(iChromLong+1,sizeof(double)))==NULL){
return NO;
}
if((stNewPopulation[j].iLineStartPos=(int*)calloc(iChromLong+1,sizeof(int)))==NULL){
return NO;
}
}
if((stBestFit.iChrom=(int*)calloc(iChromLong+1,sizeof(int)))==NULL){
return NO;
}
if((stBestFit.dCarFactTime=(double*)calloc(iChromLong+1,sizeof(double)))==NULL){
return NO;
}
if((stBestFit.dCarFactWeight=(double*)calloc(iChromLong+1,sizeof(double)))==NULL){
return NO;
}
if((stBestFit.iLineStartPos=(int*)calloc(iChromLong+1,sizeof(int)))==NULL){
return NO;
}
if((dRunTime=(double**)calloc(iChromLong+2,sizeof(double)))==NULL){
return NO;
}
for(j=0; j<iChromLong+1; j++){
if((*(dRunTime+j)=(double*)calloc(iChromLong+2, sizeof(double)))==NULL){
return NO;
}
}
if((dWorkTime=(double*)calloc(iChromLong+1, sizeof(double)))==NULL){
return NO;
}
if((dSiteWeight=(double*)calloc(iChromLong+1, sizeof(double)))==NULL){
return NO;
}
if((dCarCapacity=(double*)calloc(iChromLong+1, sizeof(double)))==NULL){
return NO;
}
if((stOldMin.iChrom=(int*)calloc(iChromLong+1,sizeof(int)))==NULL){
return NO;
}
if((stOldMin.dCarFactWeight=(double*)calloc(iChromLong+1,sizeof(double)))==NULL){
return NO;
}
if((stOldMin.dCarFactTime=(double*)calloc(iChromLong+1,sizeof(double)))==NULL){
return NO;
}
if((stOldMin.iLineStartPos=(int*)calloc(iChromLong+1,sizeof(int)))==NULL){
return NO;
}
if((stNewMin.iChrom=(int*)calloc(iChromLong+1,sizeof(int)))==NULL){
return NO;
}
if((stNewMin.dCarFactWeight=(double*)calloc(iChromLong+1,sizeof(double)))==NULL){
return NO;
}
if((stNewMin.dCarFactTime=(double*)calloc(iChromLong+1,sizeof(double)))==NULL){
return NO;
}
if((stNewMin.iLineStartPos=(int*)calloc(iChromLong+1,sizeof(int)))==NULL){
return NO;
}
if((stNewMax.iChrom=(int*)calloc(iChromLong+1,sizeof(int)))==NULL){
return NO;
}
if((stNewMax.dCarFactWeight=(double*)calloc(iChromLong+1,sizeof(double)))==NULL){
return NO;
}
if((stNewMax.dCarFactTime=(double*)calloc(iChromLong+1,sizeof(double)))==NULL){
return NO;
}
if((stNewMax.iLineStartPos=(int*)calloc(iChromLong+1,sizeof(int)))==NULL){
return NO;
}
return OK;
}
/******************************************************************/
/* 函数名: FreeVMemory() */
/* 参 数: 无 */
/* 返回值: OK-1; NO-0 */
/* 功 能: 释放全局的指针变量的空间 */
/******************************************************************/
int FreeVMemory()
{
for(int i=0; i<iPopSize; i++){
free(stOldPopulation[i].iChrom);
free(stNewPopulation[i].iChrom);
free(stOldPopulation[i].dCarFactTime);
free(stOldPopulation[i].dCarFactWeight);
free(stNewPopulation[i].dCarFactTime);
free(stNewPopulation[i].dCarFactWeight);
free(stOldPopulation[i].iLineStartPos);
free(stNewPopulation[i].iLineStartPos);
}
free(stOldPopulation);
free(stNewPopulation);
free(stBestFit.iChrom);
free(stBestFit.dCarFactTime);
free(stBestFit.dCarFactWeight);
free(stBestFit.iLineStartPos);
free(stOldMin.iChrom);
free(stOldMin.dCarFactTime);
free(stOldMin.dCarFactWeight);
free(stOldMin.iLineStartPos);
free(stNewMin.iChrom);
free(stNewMin.dCarFactTime);
free(stNewMin.dCarFactWeight);
free(stNewMin.iLineStartPos);
free(stNewMax.iChrom);
free(stNewMax.dCarFactTime);
free(stNewMax.dCarFactWeight);
free(stNewMax.iLineStartPos);
for(i=0; i<iChromLong+1; i++)
free(*(dRunTime+i));
free(dRunTime);
free(dWorkTime);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -