|
- #include<stdio.h>
- #include<string.h>
- #include<stdlib.h>
- #include<time.h>
- #include<math.h>
- /* PSO粒子群算法中的两个参数 */
- #define c1 2 /* 学习因子1 */
- #define c2 2 /* 学习因子2 */
- #define w 4 /* 惯性权重 */
- #define iter 150 /* 进化次数 */
- #define sizepop 300 /* 种群规模 */
- #define Vmax 1 /* 粒子速度上限 */
- #define Vmin -1 /* 粒子速度下限 */
- #define popmax 9 /* 粒子取值范围上限 */
- #define popmin -9 /* 粒子取值范围下限 */
- #define length_data 1000 /* 预定义原始待分析数据长度 */
- /* 适应度函数 */
- double fun(double data[][4],int lineCount,double pop[]) // 染色体的适应度
- {
- // 输入:
- // data为原始数据 TOA TR Peo EUI
- // lineCount为数据的长度
- // pop 种群粒子个体
- // 输出:
- // 返回粒子对应的适应度值
- int i; // 数组长度
- double C0,C1,C2,C3,C4,C5,C6,C7,C8,C9; /* 待优化求解未知量 */
- double EUI_pso,TOA,TR,Peo,EUI,Z[length_data],sum_Z=0; // 原始数据,4组数据
- C0 = pop[0]; C1 = pop[1]; C2 = pop[2]; C3 = pop[3]; C4 = pop[4];
- C5 = pop[5]; C6 = pop[6]; C7 = pop[7]; C8 = pop[8]; C9 = pop[9];
- // leng = sizeof(data)/sizeof(data[0]); // 数组的长度--行
- // printf("%lf\t%lf\n",C8,C9); // 输出显示
- for(i=0;i<lineCount;i++)
- {
- TOA = data[i][0]; TR = data[i][1]; Peo = data[i][2]; EUI = data[i][3];
- // printf("%lf\n",TOA);
- EUI_pso = C0 +C1*TOA +C2*TR +C3*Peo +C4*TOA*TOA +C5*TR*TR +C6*Peo*Peo +C7*TR*Peo +C8*Peo*TOA +C9*TR*TOA; // PSO算法求解的EUI
- //printf("%lf\n",EUI_pso);
- Z[i]= abs( EUI-EUI_pso ); // 绝对误差和
- // printf("%lf\n",Z[i]);
- sum_Z = sum_Z + Z[i]; // 叠加和
- }
- // printf("%lf\t\n",sum_Z); // 输出显示
-
- return sum_Z; // 绝对误差和---适应度
-
- }
- void main(void)
- {
- char path_excel[]="F:\\intercompilation\\C\\visual_stUdio_2010\\ysw_vs1\\ysw20140921_c++_3\\PSO3\\PSO3"; //
- FILE *fp; // 文件
- double data[length_data][4],TOA,TR,Peo,EUI; // 原始数据,4组数据
- int i,j,k,lineCount=0; // 上下标
- double rand_a,rand_a1,rand_a2,rand_a3; // 随机数
- double pop[sizepop][10],V[sizepop][10],fitness[sizepop]; // 初始化种群变量
- double bestfitness,zbest[10],gbest[sizepop][10],fitnessgbest[sizepop],fitnesszbest,Z;
- // 读取文本文件
- fp = fopen(strcat(path_excel,"\\data.txt"),"r");
- if(fp==NULL)
- {
- printf("fopen error!\n");
- return;
- }
- while(!feof(fp))// 判断获取的字符是否是文件的结束符
- {
- fscanf(fp,"%lf%lf%lf%lf",&TOA,&TR,&Peo,&EUI);
- // printf("%lf\t%lf\t%lf\t%lf\n",TOA,TR,Peo,EUI); // 输出显示
- data[lineCount][0] = TOA; data[lineCount][1] = TR;
- data[lineCount][2] = Peo; data[lineCount][3] = EUI;
- // printf("%lf\t%lf\t%lf\t%lf\n",data[lineCount][0],data[lineCount][1],data[lineCount][2],data[lineCount][3]); // 输出显示
- lineCount++;
- }
- srand(time(0)); // 初始化随机种子
- // 产生初始粒子和速度
- for(i=0;i<sizepop;i++)
- {
- // 随机产生一个种群
- for(j=0;j<10;j++)
- {
- rand_a = 2.0*rand()/RAND_MAX-1; // 产生-1到1之间随机数
- // printf("%lf\n",rand_a); // 输出显示
- pop[i][j] = popmax*rand_a; // 初始种群 C0-C9十个未知量
- // printf("%lf\n",pop[i][j]);
- V[i][j] = Vmax*rand_a; // 初始化速度
- }
- }
- for(i=0;i<sizepop;i++)
- {
- // 计算适应度
- fitness[i] = fun(data,lineCount-1,pop[i]); // 染色体的适应度
- // printf("%lf\n",fitness[i]); // 输出显示
- }
- // 找最好的粒子个体--初始化
- bestfitness = fitness[0]; // 绝对误差和最小--初始化
- for(i=0;i<sizepop;i++)
- {
- for(j=0;j<10;j++)
- {
- if(i==0)
- {
- zbest[j] = pop[i][j]; // 全局最佳--初始化
- }
- gbest[i][j] = pop[i][j]; // 个体最佳--初始化
- }
- fitnessgbest[i] = fitness[i]; // 个体最佳适应度值--初始化
- }
- fitnesszbest = bestfitness; // 全局最佳适应度值--初始化
-
- // 迭代寻优
- for(i=0;i<iter;i++)
- {
- for(j=0;j<sizepop;j++)
- {
- // 速度更新
- for(k=0;k<10;k++)
- {
- rand_a1 = rand()/RAND_MAX; // 产生0到1之间随机数
- rand_a2 = rand()/RAND_MAX; // 产生0到1之间随机数
- V[j][k] = w*V[j][k] + c1*rand_a1*(gbest[j][k] - pop[j][k]) + c2*rand_a2*(zbest[k] - pop[j][k]);
- if(V[j][k]>Vmax){V[j][k]=Vmax;} // 速度上限
- if(V[j][k]<Vmin){V[j][k]=Vmin;} // 速度下限
- // 种群更新
- pop[j][k] = pop[j][k]+0.5*V[j][k];
- if(pop[j][k]>popmax){pop[j][k]=popmax;} // 种群取值上限
- if(pop[j][k]<popmin){pop[j][k]=popmin;} // 种群取值下限
- }
- // 自适应变异
- rand_a3 = rand()/RAND_MAX; // 产生0到1之间随机数
- if(rand_a3>0.8)
- {
- k=rand()%10; // 变异个体标号 0-9
- pop[j][k] = popmax*rand()/RAND_MAX;
- }
- // 适应度值data,lineCount-1,pop[i])
- fitness[j]=fun(data,lineCount-1,pop[j]);
- // 个体最优更新
- if(fitness[j] < fitnessgbest[j])
- {
- for(k=0;k<10;k++){ gbest[j][k] = pop[j][k]; }
- fitnessgbest[j] = fitness[j];
- }
- // 群体最优更新
- if(fitness[j] < fitnesszbest)
- {
- for(k=0;k<10;k++){ zbest[k] = pop[j][k]; }
- fitnesszbest = fitness[j];
- }
- }
- Z = fitnesszbest; // 存取最好适应度值
- }
- printf("最小绝对误差和值:%lf\n",Z); // 最好适应度值输出显示
- printf("C0=%lf\tC1=%lf\tC2=%lf\tC3=%lf\tC4=%lf\n",zbest[0],zbest[1],zbest[2],zbest[3],zbest[4]); // C0-C4输出显示
- printf("C5=%lf\tC6=%lf\tC7=%lf\tC8=%lf\tC9=%lf\n",zbest[5],zbest[6],zbest[7],zbest[8],zbest[9]); // C5-C9输出显示
- printf("\n"); // 输出显示
- fclose(fp);
- system("pause"); // 消除屏幕一闪即消失的情况
- }
复制代码 视频学习:链接:https://pan.baidu.com/s/132jBgG0JLVRAt-b4MM0I9w 密码:pa58
|
|