|
本帖最后由 tmxdlsd 于 2019-8-16 19:46 编辑
套用了一个程序,想实现粒子群优化算法求得最优值,但是一直报错,不知道怎么解决了
- #include<stdio.h>
- #include<stdlib.h>
- #include<math.h>
- #include<time.h>
- #define c1 1.49445 //加速度因子一般是根据大量实验所得
- #define c2 1.49445
- #define ger 50 // 迭代次数
- #define N 50 // 种群规模
- #define Xmax 50 // 个体最大取值
- #define Xmin 0 // 个体最小取值
- #define Vmax 1 // 速度最大值
- #define Vmin -1 //速度最小值
- #define d 1 // 粒子的维数
- #define wmax 0.9
- #define wmin 0.4
- #define pi 3.1415926 //圆周率
- double x[N]; // 定义种群数组
- double v[N]; // 定义种群速度数组
- double fitness[N]; // 定义种群的适应度数组
- double result[ger]; //定义存放每次迭代种群最优值的数组
- double pbest[N]; // 个体极值的位置
- double gbest; //群体极值的位置
- double fitnesspbest[N]; //个体极值适应度的值
- double fitnessgbest; // 群体极值适应度值
- double genbest[ger]; //每一代最优值取值粒子
- //适应度函数
- void func(double I[], double x)
- {
- double t[2] = {3.05e-4,3.25e-4};
- double Iz[2]={13.8137,13.8206};
- double L0 = 73e-6;
- double C0=119.5e-9;
- double L1=152.87e-6;
- double C1=68.26e-9;
- double L2=153.6e-6;
- double C2=67.73e-9;
- double R1=0.49;
- double R2=0.5;
- //RL=30;
- double R=R2+x;
- double Edc=100;
- double f=50000;
- double M=140.5e-6;
-
- double w=2*pi*f;
- double u0=w*L0-1/(w*C0);
- double u1=w*L1-1/(w*C1);
- double u2=w*L2-1/(w*C2);
- double a=R1+(pow(M,2)*R*pow(w,2))/(pow(R,2) + pow(u2,2));
- double b=1/(C0*w) - u1 + (pow(M,2)*u2*pow(w,2))/(pow(R,2) + pow(u2,2));
- double c=L0/C0 - u0*u1 + (pow(M,2)*u0*u2*pow(w,2))/(pow(R,2) + pow(u2,2));
-
- double alpha=(a*(c-u0*b))/(pow(a,2)+pow(b,2));
- double beta=(c*b+u0*pow(a,2))/(pow(a,2)+pow(b,2));
- double I0=(4*Edc)/(pi*sqrt(pow(alpha,2)+pow(beta,2)));
- double fai=atan(beta/alpha);
- I[0]=I0*sin(w*t[0]+fai);
- I[1]=I0*sin(w*t[1]+fai);
- double fitness = sqrt((pow((Iz[0]-I[0]),2)+pow((Iz[1]-I[1]),2))/2);
- }
-
- // 种群初始化
- void pop_init(void)
- {
- srand(time(NULL));
- for(int i=0;i<N;i++)
- {
- x[i] = rand()%51; //0到50之间的随机数
- v[i] = rand()%3-1; //-1到1之间
- fitness[i] = func(x[i]); //计算适应度函数值
- }
- }
- // min()函数定义
- double * min(double * fit,int size)
- {
- int index = 0; // 初始化序号
- double min = *fit; // 初始化最小值为数组第一个元素
- static double best_fit_index[2];
- for(int i=1;i<size;i++)
- {
- if(*(fit+i) < min)
- min = *(fit+i);
- index = i;
- }
- best_fit_index[0] = index;
- best_fit_index[1] = min;
- return best_fit_index;
- }
- // 迭代寻优
- void PSO_func(void)
- {
- pop_init();
- double * best_fit_index; // 用于存放群体极值和其位置(序号)
- best_fit_index = min(fitness,N); //求群体极值
- int index = (int)(*best_fit_index);
- // 群体极值位置
- gbest = x[index];
- // 个体极值位置
- for(int i=0;i<N;i++)
- {
- pbest[i] = x[i];
-
- // 个体极值适应度值
- fitnesspbest[i] = fitness[i];
- }
- //群体极值适应度值
- double bestfitness = *(best_fit_index+1);
- fitnessgbest = bestfitness;
- //迭代寻优
- for(int i=0;i<ger;i++)
- {
- for(int j=0;j<N;j++)
- {
- //速度更新及粒子更新
-
- // 速度更新
- double rand1 = (double)rand()/RAND_MAX; //0到1之间的随机数
- double rand2 = (double)rand()/RAND_MAX;
- double w;
- double Tmax = (double)ger;
- w = wmin + (wmax - wmin)*(Tmax-i)/Tmax;
- v[j] = w*v[j] + c1*rand1*(pbest[j]-x[j]) + c2*rand2*(gbest-x[j]);
- if(v[j] > Vmax)
- v[j] = Vmax;
- if(v[j] < Vmin)
- v[j] = Vmin;
- // 粒子更新
- x[j] = x[j] + v[j];
- if(x[j] > Xmax)
- x[j] = Xmax;
- if(x[j] < Xmin)
- x[j] = Xmin;
- fitness[j] = func(x[j]); //新粒子的适应度值
- }
- for(int j=0;j<N;j++)
- {
- // 个体极值更新
- if(fitness[j] > fitnesspbest[j])
- {
- pbest[j] = x[j];
- fitnesspbest[j] = fitness[j];
- }
- // 群体极值更新
- if(fitness[j] > fitnessgbest)
- {
-
- gbest = x[j];
- fitnessgbest = fitness[j];
- }
- }
- genbest[i] = gbest; // 每一代最优值取值粒子位置记录
- result[i] = fitnessgbest; // 每代的最优值记录到数组
- }
- }
- // 主函数
- int main(void)
- {
- clock_t start,finish; //程序开始和结束时间
- start = clock(); //开始计时
- srand((unsigned)time(NULL)); // 初始化随机数种子
- PSO_func();
- double * best_fit_index = min(result,ger);
- double best_result = *(best_fit_index+1); //最优解
- printf("每次实验迭代%d次,求得最优值为:%lf",ger,best_result);
- finish = clock(); //结束时间
- double duration = (double)(finish - start)/CLOCKS_PER_SEC; // 程序运行时间
- printf("程序运行耗时:%lf\n",duration);
- return 0;
- }
复制代码
报错信息:
|
上一篇: 问个奇怪的问题下一篇: 一个关于sizeof的问题
|