VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 6076|回复: 2

错误:cannot convert 'double' to 'double*' for argument '1'

[复制链接]
12_avatar_middle
最佳答案
0 
在线会员 发表于 2019-8-16 10:37:44 | 显示全部楼层 |阅读模式
本帖最后由 tmxdlsd 于 2019-8-16 19:46 编辑

套用了一个程序,想实现粒子群优化算法求得最优值,但是一直报错,不知道怎么解决了错误:cannot convert 'double' to 'double*' for argument '1'
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>
  4. #include<time.h>
  5. #define c1 1.49445 //加速度因子一般是根据大量实验所得
  6. #define c2 1.49445
  7. #define ger 50  // 迭代次数
  8. #define N 50 // 种群规模
  9. #define Xmax 50 // 个体最大取值
  10. #define Xmin 0 // 个体最小取值
  11. #define Vmax 1 // 速度最大值
  12. #define Vmin -1 //速度最小值
  13. #define d 1 // 粒子的维数
  14. #define wmax 0.9
  15. #define wmin 0.4
  16. #define pi 3.1415926 //圆周率

  17. double x[N]; // 定义种群数组
  18. double v[N]; // 定义种群速度数组
  19. double fitness[N]; // 定义种群的适应度数组
  20. double result[ger];  //定义存放每次迭代种群最优值的数组
  21. double pbest[N];  // 个体极值的位置
  22. double gbest; //群体极值的位置
  23. double fitnesspbest[N]; //个体极值适应度的值
  24. double fitnessgbest; // 群体极值适应度值
  25. double genbest[ger]; //每一代最优值取值粒子

  26. //适应度函数
  27. void func(double I[], double x)
  28. {
  29.     double t[2] = {3.05e-4,3.25e-4};
  30.     double Iz[2]={13.8137,13.8206};
  31.     double L0 = 73e-6;
  32.     double C0=119.5e-9;
  33.     double L1=152.87e-6;
  34.     double C1=68.26e-9;
  35.     double L2=153.6e-6;
  36.     double C2=67.73e-9;
  37.     double R1=0.49;
  38.     double R2=0.5;
  39.     //RL=30;
  40.     double R=R2+x;
  41.     double Edc=100;
  42.     double f=50000;
  43.     double M=140.5e-6;

  44.     double w=2*pi*f;
  45.     double u0=w*L0-1/(w*C0);
  46.     double u1=w*L1-1/(w*C1);
  47.     double u2=w*L2-1/(w*C2);
  48.     double a=R1+(pow(M,2)*R*pow(w,2))/(pow(R,2) + pow(u2,2));
  49.     double b=1/(C0*w) - u1 + (pow(M,2)*u2*pow(w,2))/(pow(R,2) + pow(u2,2));
  50.     double c=L0/C0 - u0*u1 + (pow(M,2)*u0*u2*pow(w,2))/(pow(R,2) + pow(u2,2));

  51.     double alpha=(a*(c-u0*b))/(pow(a,2)+pow(b,2));
  52.     double beta=(c*b+u0*pow(a,2))/(pow(a,2)+pow(b,2));
  53.     double I0=(4*Edc)/(pi*sqrt(pow(alpha,2)+pow(beta,2)));
  54.     double fai=atan(beta/alpha);
  55.     I[0]=I0*sin(w*t[0]+fai);
  56.     I[1]=I0*sin(w*t[1]+fai);
  57.     double fitness = sqrt((pow((Iz[0]-I[0]),2)+pow((Iz[1]-I[1]),2))/2);

  58. }

  59. // 种群初始化
  60. void pop_init(void)
  61. {
  62.     srand(time(NULL));
  63.     for(int i=0;i<N;i++)
  64.     {

  65.         x[i] = rand()%51; //0到50之间的随机数
  66.         v[i] = rand()%3-1; //-1到1之间

  67.         fitness[i] = func(x[i]); //计算适应度函数值
  68.     }
  69. }

  70. // min()函数定义

  71. double * min(double * fit,int size)
  72. {
  73.     int index = 0; // 初始化序号
  74.     double min = *fit; // 初始化最小值为数组第一个元素
  75.     static double best_fit_index[2];
  76.     for(int i=1;i<size;i++)
  77.     {
  78.         if(*(fit+i) < min)
  79.             min = *(fit+i);
  80.             index = i;
  81.     }
  82.     best_fit_index[0] = index;
  83.     best_fit_index[1] = min;
  84.     return best_fit_index;

  85. }

  86. // 迭代寻优
  87. void PSO_func(void)
  88. {
  89.     pop_init();
  90.     double * best_fit_index; // 用于存放群体极值和其位置(序号)
  91.     best_fit_index = min(fitness,N); //求群体极值
  92.     int index = (int)(*best_fit_index);
  93.     // 群体极值位置

  94.         gbest = x[index];

  95.     // 个体极值位置
  96.     for(int i=0;i<N;i++)
  97.     {

  98.             pbest[i] = x[i];
  99.   
  100.     // 个体极值适应度值

  101.         fitnesspbest[i] = fitness[i];
  102.     }
  103.     //群体极值适应度值
  104.     double bestfitness = *(best_fit_index+1);
  105.     fitnessgbest = bestfitness;

  106.     //迭代寻优
  107.     for(int i=0;i<ger;i++)
  108.     {
  109.         for(int j=0;j<N;j++)
  110.         {
  111.             //速度更新及粒子更新
  112.             
  113.                 // 速度更新
  114.                 double rand1 = (double)rand()/RAND_MAX; //0到1之间的随机数
  115.                 double rand2 = (double)rand()/RAND_MAX;
  116.                 double w;
  117.                 double Tmax = (double)ger;
  118.                        w = wmin + (wmax - wmin)*(Tmax-i)/Tmax;
  119.                 v[j] = w*v[j] + c1*rand1*(pbest[j]-x[j]) + c2*rand2*(gbest-x[j]);
  120.                 if(v[j] > Vmax)
  121.                     v[j] = Vmax;
  122.                 if(v[j] < Vmin)
  123.                     v[j] = Vmin;
  124.                 // 粒子更新
  125.                 x[j] = x[j] + v[j];
  126.                 if(x[j] > Xmax)
  127.                     x[j] = Xmax;
  128.                 if(x[j] < Xmin)
  129.                     x[j] = Xmin;

  130.             fitness[j] = func(x[j]); //新粒子的适应度值
  131.         }
  132.         for(int j=0;j<N;j++)
  133.         {
  134.             // 个体极值更新
  135.             if(fitness[j] > fitnesspbest[j])
  136.             {

  137.                     pbest[j] = x[j];

  138.                 fitnesspbest[j] = fitness[j];
  139.             }
  140.             // 群体极值更新
  141.             if(fitness[j] > fitnessgbest)
  142.             {
  143.                
  144.                     gbest = x[j];
  145.                 fitnessgbest = fitness[j];
  146.             }
  147.         }

  148.             genbest[i] = gbest; // 每一代最优值取值粒子位置记录

  149.         result[i] = fitnessgbest; // 每代的最优值记录到数组
  150.     }
  151. }

  152. // 主函数
  153. int main(void)
  154. {
  155.     clock_t start,finish; //程序开始和结束时间
  156.     start = clock(); //开始计时
  157.     srand((unsigned)time(NULL)); // 初始化随机数种子
  158.     PSO_func();
  159.     double * best_fit_index = min(result,ger);
  160.     double best_result = *(best_fit_index+1); //最优解
  161.     printf("每次实验迭代%d次,求得最优值为:%lf",ger,best_result);   
  162.     finish = clock(); //结束时间
  163.     double duration = (double)(finish - start)/CLOCKS_PER_SEC; // 程序运行时间
  164.     printf("程序运行耗时:%lf\n",duration);
  165.     return 0;
  166. }
复制代码


报错信息:

报错信息

报错信息
错误:cannot convert 'double' to 'double*' for argument '1'
错误:cannot convert 'double' to 'double*' for argument '1'




上一篇:问个奇怪的问题
下一篇:一个关于sizeof的问题
38_avatar_middle
最佳答案
0 
online_vip 发表于 2019-8-16 15:09:51 | 显示全部楼层
传参类型不一致,double类型传给了double *
12_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2019-8-16 19:25:40 | 显示全部楼层
2191265529 发表于 2019-8-16 15:09
传参类型不一致,double类型传给了double *

能麻烦您帮我改下吗?我不太懂C语言编程,临时要求下到硬件里做实验才急着套用了一个程序!
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-9-25 05:37

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表