📄 ebf847eb-572a-4b85-95e0-e3d0c5d9bf50.cpp
字号:
// 遗传算法.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 + -