?? 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 + -