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

📄 ga.cpp

📁 有时间约束的车辆数优化的C程序(遗传算法)
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/*****************************************************************/
/*    基于遗传模拟退火算法的银行中心金库车辆数目的优化程序       */
/*    中国农业银行东莞分行  熊刚强   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 + -