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

📄 ebf847eb-572a-4b85-95e0-e3d0c5d9bf50.cpp

📁 一个典型的遗传算法源程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 遗传算法.cpp : Defines the entry point for the console application.
//
#include "stdlib.h"
#include "time.h"
#include "math.h"
#include "Fzc.h"
struct Mat
{
	
	double C;              //材料的Paris C常数
	double N;              //材料的Paris n常数
	double Kc;             //材料的断裂韧性
	double Thema_B;        //材料屈服极限
};

struct structure
{
	double A0;             //结构分析的初始裂纹长
	double S0;             //结构的初始截面积
	double T;              //结构的厚度
	double R;              //结构外载的应力比
	double Thema;          //结构的外载
};

/*宏定义*/
#define MaxGeneration 200                    //最大遗传数    
#define POPSIZE 500                          //种群大小
#define Cmax 100                             //某一个极大值    
#define Cmin 0                               //某一个极小值
#define Length1   15                         //第一变量的染色体的长度  P
#define Length3   20                         //第三变量的染色体的长度  t1
#define Length4   20                         //第四变量的染色体的长度  t2
#define E    70                              //板的弹性模量
#define ES   70                              //筋的弹性模量
#define ROU1 2.69e3                          //筋材料密度
#define ROU2 2.69e3                          //板材料的密度kg/m3
#define BANKAN 200                           //板宽mm
#define BANCHANG 350                         //板长mm
#define BANHOU 1.5                           //板厚mm
#define Chromlength Length1+Length3+Length4  //总的染色体的长度
#define NMAX   1e6
#define NMIN   1.5e3
#define TMAX  (ROU2*BANKAN*BANHOU*BANCHANG+ROU1*BANKAN*BANKAN*BANCHANG)/1e9  //  kg
#define TMIN  (ROU2*BANKAN*BANHOU*BANCHANG)/1e9            //kg
#define QMAX  1/(BANKAN*BANHOU)*1e6                        //1N/m2
#define QMIN  1/(BANKAN*BANHOU+BANKAN*BANKAN)*1e6          //1N/m2
#define QUANN  0.5
#define QUANT  0.3
#define QUANQ  0.2



double  Pc=0.6;										 //交叉率
double  Pm=0.001;									 //变异率
int MAXIMIZATION;									 //优化模式
double Zid[3]={0.1e7,ROU2*BANKAN*BANHOU*BANCHANG/1e9,1/(BANKAN*BANHOU+BANKAN*BANKAN)*1e6};  //理想点初始值

/*定义个体结构体*/
struct individual									 //个体数据结构
{
	char    chrom[Chromlength+1];					 //个体的染色体编码,最后一位为'\0'.
	double  value;									 //该个体的目标函数值
	double  fitness;								 //该个体的置信度
};

/*全局变量的定义*/
int    generation;									 //遗传数
int    best_index;									 //最佳染色体的地址
int    worst_index;									 //最差染色体的地址
struct individual bestindividual;					 //当前遗传代的最佳个体
struct individual worstindividual;					 //当前遗传代的最差个体
struct individual currentbest;					     //现在的最佳个体
struct individual population[POPSIZE];               //种群
double best[MaxGeneration+1];                        //适应值最佳个体集合
double worst[MaxGeneration+1];                       //适应值最差个体集合
double ave[MaxGeneration+1];                         //个体平均适应值集合
double P[MaxGeneration+1];                           //变量P的值
double T1[MaxGeneration+1];                          //变量t1的值
double T2[MaxGeneration+1];                          //变量t2的值
double zhongliang[MaxGeneration+1];                  //重量数组
double shouming[MaxGeneration+1];                    //寿命数组
double yingli[MaxGeneration+1];                      //应力数组
/*函数声明*/
void GenerateInitialPopulation();          
void GenerateNextPopulation();
void EvaluatePopulation();
long DecodeChromosome(char* , int ,int);
void CalculateObjectValue();
void CalculateFitnessValue();
void FindBestAndWorstIndividual();
void PerformEvolution();
void SelectionOperator();
void CrossoverOperator();
void MutationOperator();
void OutputTextReport();
double abb(int a, int b);
double Cal_N(double PP, double RR, struct Mat *P, struct structure *Structure);
double NN(double PP, double R);


double Cal_N(double PP, double RR, struct Mat *P, struct structure *Structure)
{
	double K_Max;
	double Thema_Max;
	double Temp_a;
	double Da_DN;
	double A0,A1;
	double N_N;
	int NGS;
	NGS=4;
	double *POSGP=new double[NGS];
	double *WEIGP=new double[NGS];
	double A[30],K[300],R[10];
	int Num_A,Num_R;
	int i,j;
	FILE *fp;
	fp=fopen("ak.dat","r");
	fscanf(fp,"%d",&Num_R);

	for(i=0;i<Num_R;i++)
		fscanf(fp,"%lf",&R[i]);

	fscanf(fp,"%d",&Num_A);
	for(i=0;i<Num_A;i++)
	{
		fscanf(fp,"%lf",&A[i]);
		for(j=0;j<Num_R;j++)
			fscanf(fp,"%lf",&K[j*Num_A+i]);
	}
	fclose(fp);
	Temp_a=0.0001;								//积分区间划分的大小
	Gauss(NGS,POSGP,WEIGP);
	N_N=0.;
	A0=Structure->A0;
	A1=A0+Temp_a;
	Thema_Max=Structure->Thema*0.1/(0.10-A1);   //0.1为板的半宽
	K_Max=CA(Num_R,Num_A,   RR*A0   ,PP/A1,R,A,K);

	while(K_Max<P->Kc && Thema_Max<P->Thema_B && A1<0.1)//0.1为板的半宽
	{
		for(j=0;j<NGS;j++)
		{ 
			K_Max=CA(Num_R,Num_A,   RR*A0   ,PP/((A1-A0)/2.*POSGP[j]+(A1+A0)/2.),R,A,K);

			K_Max=K_Max*Structure->Thema*sqrt(3.1415926*((A1-A0)/2.*POSGP[j]+(A1+A0)/2.));
			
			Da_DN=P->C*pow(K_Max,P->N);

			N_N=N_N+(1./Da_DN*WEIGP[j])*(A1-A0)/2.;			
		}
		A0=A1;
		A1=A1+Temp_a;
		Thema_Max=Structure->Thema*0.1/(0.10-A1);//0.1为板的半宽
	}
	return(N_N);
}


double NN(double PP, double R)					 //铆距PP,R:参数r
{

	double N;
	char string[100];
	struct Mat AL_Mat;
	struct structure Structure;
	int flag=1;
	FILE *fp;
	fp=fopen("mat.dat","r");
	fscanf(fp,"%s",string);
	fscanf(fp,"%lf,%lf",&AL_Mat.C,&AL_Mat.N);
	fscanf(fp,"%s",string);
	fscanf(fp,"%lf",&AL_Mat.Kc);
	fscanf(fp,"%s",string);
	fscanf(fp,"%lf",&AL_Mat.Thema_B);
	fclose(fp);
	fp=fopen("structure.dat","r");
	fscanf(fp,"%s",string);
	fscanf(fp,"%lf,%lf",&Structure.R,&Structure.Thema);
	fscanf(fp,"%s",string);
	fscanf(fp,"%lf,%lf",&Structure.S0,&Structure.T);
	fscanf(fp,"%s",string);
	fscanf(fp,"%lf",&Structure.A0);
	fclose(fp);
	N=Cal_N(PP,R,&AL_Mat,&Structure);
//	printf("N=%e\n",N);
	return N;

}
/*主函数*/
void main()
{   FILE  *fp1,*fp2,*fp3,*tp1,*tp3,*tp4,*tmp1,*tmp2,*tmp3;
   int i;
loop:	printf("请选择优化模式.即优化目标是最大值时,输入 1,优化目标是最小值时,输入 2\n");
	scanf("%d",&MAXIMIZATION);
	if(MAXIMIZATION==1||MAXIMIZATION==2)
	{
	generation=0;
    GenerateInitialPopulation();               //调用第一代种群生成函数;
	EvaluatePopulation();                      //调用适应值计算函数
	while(generation<MaxGeneration)            //迭代过程
	{
		generation++;
	    GenerateNextPopulation();
		EvaluatePopulation();
		PerformEvolution();
	    OutputTextReport();
	}
	if((fp1=fopen("适应值最大个体集合.txt","w"))==NULL)       
   {
         printf("不能打开这个文件!\n");
		 exit(0);
	}

    if((fp2=fopen("适应值最差个体集合.txt","w"))==NULL)              
   {
         printf("不能打开这个文件!\n");
		 exit(0);
	}
    if((fp3=fopen("平均适应值个体集合.txt","w"))==NULL)   
   {
         printf("不能打开这个文件!\n");
		 exit(0);
	}
  for(i=0;i<MaxGeneration;i++)                          
	 {
	  fprintf(fp1,"%f",best[i]);                  //输出适应值最大个体集合 
	  fprintf(fp1,"%c",'\n');
  }
  for(i=0;i<MaxGeneration;i++)
	 {
	  fprintf(fp2,"%f",worst[i]);                 //输出适应值最差个体集合
	  fprintf(fp2,"%c",'\n');
  }
  for(i=0;i<MaxGeneration;i++)
	 {
	  fprintf(fp3,"%f",ave[i]);                   //输出平均适应值个体集合
	  fprintf(fp3,"%c",'\n');
  }
	
    fclose(fp1);
	fclose(fp2);
	fclose(fp3);
	
		if((tp1=fopen("P最佳值.txt","w"))==NULL)       
   {
         printf("不能打开这个文件!\n");
		 exit(0);
	}

    
    if((tp3=fopen("t1最佳值.txt","w"))==NULL)   
   {
         printf("不能打开这个文件!\n");
		 exit(0);	
	}
	if((tp4=fopen("t2最佳值.txt","w"))==NULL)   
   {
         printf("不能打开这个文件!\n");
		 exit(0);	
	}
	
	 for(i=0;i<MaxGeneration;i++)
	 {
	  fprintf(tp1,"%f",P[i]);                
	  fprintf(tp1,"%c",'\n');
	 }
	 
	   for(i=0;i<MaxGeneration;i++)
	 {
	  fprintf(tp3,"%f",T1[i]);               
	  fprintf(tp3,"%c",'\n');
	 }
	    for(i=0;i<MaxGeneration;i++)
	 {
	  fprintf(tp4,"%f",T2[i]);                 
	  fprintf(tp4,"%c",'\n');
	 }
    fclose(tp1);
	fclose(tp3);
	fclose(tp4);

	if((tmp1=fopen("寿命最佳值.txt","w"))==NULL)       
   {
         printf("不能打开这个文件!\n");
		 exit(0);
	}
	if((tmp2=fopen("重量最佳值.txt","w"))==NULL)       
   {
         printf("不能打开这个文件!\n");
		 exit(0);
	}
	if((tmp3=fopen("应力最佳值.txt","w"))==NULL)       
   {
         printf("不能打开这个文件!\n");
		 exit(0);
	}

 for(i=0;i<MaxGeneration;i++)
	 {
	  fprintf(tmp1,"%f",shouming[i]);                
	  fprintf(tmp1,"%c",'\n');
	 }
  for(i=0;i<MaxGeneration;i++)
	 {
	  fprintf(tmp2,"%f",zhongliang[i]);                
	  fprintf(tmp2,"%c",'\n');
	 }
   for(i=0;i<MaxGeneration;i++)
	 {
	  fprintf(tmp3,"%f",yingli[i]);                
	  fprintf(tmp3,"%c",'\n');
	 }

    fclose(tmp1);
	fclose(tmp2);
	fclose(tmp3);
	
	}
	else 
	{
		printf("您的输入有错误!!请重新输入!\n");
	    goto loop;
	}
	
}
/****************************************************************/
/*   函数:读取第一代种群编码.txt文件中存放的第一代种群编码  ok */
/****************************************************************/  
void GenerateInitialPopulation()                                                  
{
	FILE *fp;
	int i,j;
   if((fp=fopen("第一代种群编码.txt","r"))==NULL)
   {
         printf("不能打开此文件!\n");
		 exit(0); 
   }  
   for(i=0;i<POPSIZE;i++)
   {
	   for(j=0;j<Chromlength+1;j++)
		   fscanf(fp,"%c",&population[i].chrom[j]);
	           population[i].chrom[Chromlength]='\0';
   }
   fclose(fp);

}



/*********************************************************/
/*      函数:根据具体的公式进行目标函数的适应值计算     */
/*********************************************************/
void EvaluatePopulation()	
{	
	CalculateObjectValue();         //调用计算目标函数值函数
	CalculateFitnessValue();        //调用计算适应值函数 
	FindBestAndWorstIndividual();   //调用寻找当前代中的最佳个体函数  
}


/*****************************************************************/
/*                   函数:计算目标函数值                        */
/* 5<p<40 15位 1.5<B<3.5 10位 10<t1<200 20位 1<t2<t1 20位 单位mm */
/*****************************************************************/

void CalculateObjectValue()
{
	int i;
	

⌨️ 快捷键说明

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