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

📄 c++.txt

📁 优化算法,可有通过考察所构建模型来组合自己的函数功能,有选择的提供程序
💻 TXT
字号:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define POPSIZE		500		
#define MAXIMIZATION	1	
#define MINIMIZATION	2	



#define Cmax		4000	
#define Cmin		0		
#define LENGTH1		15		
#define LENGTH2		20		
#define CHROMLENGTH		LENGTH1+LENGTH2	
int Function_Mode=MAXIMIZATION;
int PopSize=100;				
int MaxGeneration=100;		
double Pc=0.6;				
double Pm=0.0001;			


struct individual			
{
	char chrom[CHROMLENGTH+1];	
	double value;			
	double fitness;			
};
FILE *fp;

int	generation;				
int	best_index;				
int	worst_index;			
struct individual bestindividual;	
struct individual worstindividual;                                      
struct individual currentbest;		
struct individual population[POPSIZE];	


void GenerateInitialPopulation(void);
void GenerateNextPopulation(void);
void EvaluatePopulation(void);
long DecodeChromosome(char*,int,int);
void CalculateObjectValue(void);
void CalculateFitnessValue(void);
void FindBestAndWorstIndividual(void);
void SelectionOperator(void);
void CrossoverOperator(void);
void MutationOperator(void);
void PerformEvolution(void);
void OutputTextReport(void);


void main(void)
{
	long temp1,temp2;
	float x1,x2;
	int punisher;

	fp=fopen("report.txt","w");
for(punisher=8;punisher<801;punisher=punisher+8) 
{
	{
		generation=0;
		GenerateInitialPopulation();
		EvaluatePopulation();//调用函数
		while(generation<MaxGeneration)
		{
			generation++;
			GenerateNextPopulation();
			EvaluatePopulation();
			PerformEvolution();
			OutputTextReport();
		} 
	}
}
	fprintf(fp,"-------------The Result-------------\n");//输出
	temp1=DecodeChromosome(currentbest.chrom,0,LENGTH1);
	temp2=DecodeChromosome(currentbest.chrom,LENGTH1,LENGTH2);
	x1=0.0264*temp1/32767.0;
	x2=0.6000*temp2/1048575.0+1.2000;
	fprintf(fp,"x1=%f,x2=%f\n",x1,x2);
	fprintf(fp,"f(x)=%f\n",currentbest.value);
	fclose(fp);
}

/
void GenerateInitialPopulation(void)
{
	int i,j;
float r;
	for(i=0;i<PopSize;i++)
	{
		for(j=0;j<CHROMLENGTH;j++)
		{
			r=rand()%1000/1000.0;
			population[i].chrom[j]=(r<0.5)?'0':'1';
		}
		population[i].chrom[CHROMLENGTH]='\0';
	}
}

/
long DecodeChromosome(char *string,int point,int length)
{
	int i;
	long decimal=0L;
	char *pointer;

	for(i=0,pointer=string+point;i<length;i++,pointer++)
	{
		decimal+=(*pointer-'0')<<(length-1-i);
	}
	return(decimal);
}


void CalculateObjectValue(void)
{
	int i,punisher=8;
	long temp1,temp2;
	float x1,x2;
	float x3,x4,x5,vx;
	float f0;
	float x6;
	
	x3=0.5*x1*(x2*x2-1);
	x4=0.5*x1*(x2*x2-1)/(x2*x2);
	x5=0.0763+x3+1.5*(0.1555+x4+178*x1*x1+x1*x2);
	vx=0.000167-0.2396*x1+3.14*x1*x1*x5;

	x6=sqrt(0.000697-x1*x1);
	f0=0.0264-x6-0.394;

	for(i=0;i<PopSize;i++)
	{
		temp1=DecodeChromosome(population[i].chrom,0,LENGTH1);
		temp2=DecodeChromosome(population[i].chrom,LENGTH1,LENGTH2);
		x1=0.0264*temp1/32767.0+0.0050;
		x2=0.6000*temp2/1048575.0+1.2000;
		population[i].value=vx+punisher*f0;
			
	}
}


void EvaluatePopulation(void)
{
	CalculateObjectValue();
	CalculateFitnessValue();
	FindBestAndWorstIndividual();
}



// Function: To Crossover two chromosome by means of one point.两个染色体交叉
// Variable: None
void CrossoverOperator(void)
{
	int i,j;
	int index[POPSIZE];
	int point,tempt;
	float p;
	char ch;

	for(i=0;i<PopSize;i++)		//make a pair of individual randomly随机产生一对个体
	{
		index[i]=i;
	}
	for(i=0;i<PopSize;i++)
	{
		point=(int)rand()%1000/1000.0*(PopSize-i);
		tempt=index[i];
		index[i]=index[point+i];
		index[point+i]=tempt;
	}

	for(i=0;i<PopSize-1;i+=2)		//one point crossover operator
	{
		p=rand()%1000/1000.0;
		if(p<Pc)
		{
			point=(int)rand()%1000/1000.0*CHROMLENGTH;
			for(j=point;j<CHROMLENGTH;j++)
			{
				ch=population[index[i]].chrom[j];
				population[index[i]].chrom[j]=population[index[i+1]].chrom[j];
				population[index[i+1]].chrom[j]=ch;
			}
		}
	}
}


void MutationOperator(void)
{
	int i,j;
	double p;
	for(i=0;i<PopSize;i++)
	{
		for(j=0;j<CHROMLENGTH;j++)
		{
			p=rand()%1000/1000.0;
			if(p<Pm)
			{
				population[i].chrom[j]=(population[i].chrom[j]=='0')?'1':'0';
			}

		}
	}
}


void GenerateNextPopulation(void)
{
	SelectionOperator();
	CrossoverOperator();
	MutationOperator();
}


void PerformEvolution(void)
{
	if(bestindividual.fitness>currentbest.fitness)
	{
		currentbest=population[best_index];
	}
	else
	{
		population[worst_index]=currentbest;
	}
}


{
	int i;
	double sum,average;		

	sum=0.0;
	for(i=0;i<PopSize;i++)
	{
		sum+=population[i].value;
	}
	average=sum/PopSize;

	fprintf(fp,"gen=%d,avg=%f,best=%f,worst=%f\n",generation,average,currentbest.value,worstindividual.value);
//	fprintf(fp,"Chromosome:\n");
//	for(i=0;i<PopSize;i++)
//	{
//		fprintf(fp,"%f\n",population[i].value);
//	}
	fprintf(fp,"\n");
}

⌨️ 快捷键说明

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