声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1697|回复: 1

[经典算法] 哪位能告诉我正确的复合形算法啊?谢谢!

[复制链接]
发表于 2007-9-20 22:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
我倒. 手头上三本关于优化的书, 介绍的复合形法都有点不同,
试着编了三个程序验证一下哪个比较好, 优化出的结果都离正确值偏差很多.
搞不懂怎么会这样!
请大家帮帮我!谢谢!
回复
分享到:

使用道具 举报

发表于 2007-10-11 08:57 | 显示全部楼层
复合形法怎么会不一样的?不能理解


  1. /* 以下为复合形法法子程序 */

  2. #include "stdlib.h"

  3. #include "math.h"

  4. #include "stdio.h"

  5. float objfx(float x[]);

  6. void constraint(float x[],float g[]);
  7. int gau(float x[],float g[],int kg)

  8. {

  9.        int i;

  10.        constraint(x,g);

  11.        for(i=0;i<kg;i++)

  12.        {

  13.          if(g[i]<0)

  14.          goto s333;

  15.        }

  16.        return 1;

  17. s333:return 0;

  18. }
  19. void xcent(int n,int k,int ll,int lh,float x0[],float xcom[][100])

  20. {

  21.        int i,l;

  22.        float xs;

  23.        for(i=0;i<n;i++)

  24.        {

  25.          xs=0;

  26.          for(l=0;l<ll;l++)

  27.          {

  28.     if(l!=lh)

  29.     xs=xs+xcom[i][l];

  30.          }

  31.          if(lh>-1)

  32.     x0[i]=xs/(ll-1);

  33.          else

  34.     x0[i]=xs/ll;

  35.        }

  36. }
  37. void fxse(int n,int k,float x[],float xcom[][100],float fxk[])

  38. {

  39.        int l,lp,lp1,i;

  40.        float w;

  41.        for(l=0;l<k-1;l++)

  42.        for(lp=0;lp<k-l;lp++)

  43.        {

  44.          lp1=lp+1;

  45.          if(fxk[lp]<=fxk[lp1])

  46.          {

  47.     w=fxk[lp];

  48.     fxk[lp]=fxk[lp1];

  49.     fxk[lp1]=w;

  50.     for(i=0;i<n;i++)

  51.     {

  52.       x[i]=xcom[i][lp];

  53.       xcom[i][lp]=xcom[i][lp1];

  54.       xcom[i][lp1]=x[i];

  55.     }

  56.          }

  57.        }

  58. }


  59. void complex(int n,int k,int kg,float ep,float x[],float bl[],float bu[],

  60.         float xcom[][100],float *f,int *nf,int *ng)

  61. {

  62.        int i,iw,l,ll,lh,it;

  63.        float fx,fx0,sdx,fxh,fxr,alp;

  64.        float *x0=(float*)calloc(n,sizeof(float));

  65.        float *xh=(float*)calloc(n,sizeof(float));

  66.        float *xr=(float*)calloc(n,sizeof(float));

  67.        float *fxk=(float*)calloc(k,sizeof(float));

  68.        float *g=(float*)calloc(kg,sizeof(float));

  69. s5:    for(i=0;i<n;i++)

  70.        x[i]=bl[i]+rand()/40000.0*(bu[i]-bl[i]);

  71.        iw=gau(x,g,kg);

  72.        *ng=*ng+1;

  73.        if(iw==0)goto s5;

  74.        for(i=0;i<n;i++)

  75.        xcom[i][0]=x[i];

  76.        for(l=1;l<k;l++)

  77.        for(i=0;i<n;i++)

  78.        xcom[i][l]=bl[i]+rand()/50000.0*(bu[i]-bl[i]);

  79.        lh=-1;

  80.        for(ll=1;ll<k;ll++)

  81.        {

  82.          xcent(n,k,ll,lh,x0,xcom);

  83.          iw=gau(x0,g,kg);

  84.          *ng=*ng+1;

  85.          if(iw==0)goto s5;

  86.          for(i=0;i<n;i++)

  87.          x[i]=xcom[i][ll+1];

  88. s24:     iw=gau(x,g,kg);

  89.          *ng=*ng+1;

  90.          if(iw==0)

  91.          {

  92.     for(i=0;i<n;i++)

  93.     x[i]=x0[i]+0.5*(x[i]-x0[i]);

  94.     goto s24;

  95.          }

  96.          else

  97.          {

  98.     for(i=0;i<n;i++)

  99.     xcom[i][ll+1]=x[i];

  100.          }

  101.        }

  102.        for(l=0;l<k;l++)

  103.        {

  104.          for(i=0;i<n;i++)

  105.          x[i]=xcom[i][l];

  106.          fx=objfx(x);

  107.          *nf=*nf+1;

  108.          fxk[l]=fx;

  109.        }

  110.        it=0;

  111. s14: it=it+1;

  112.        printf("\n\n    +++ ITERATION COMPUTE +++");

  113.        printf("\n       ITER    = %d",it);

  114.        lh=-1;

  115.        xcent(n,k,k,lh,x0,xcom);

  116.        fx0=objfx(x0);

  117.        *nf=*nf+1;

  118.        iw=gau(x0,g,kg);

  119.        *ng=*ng+1;

  120.        printf("\n       Fmid    = %f",fx0);

  121.        for(i=0;i<n;i++)

  122.          printf("\n       X(%d)mid=%f",i,x0[i]);

  123.        for(i=0;i<kg;i++)

  124.          printf("\n       G(%d)mid=%f",i,g[i]);

  125.        sdx=0;

  126.        for(l=0;l<k;l++)

  127.          sdx=sdx+(fx0-fxk[l])*(fx0-fxk[l]);

  128.        sdx=sqrt(sdx/(float)k);

  129.        if(sdx<ep)goto s38;

  130.        fxse(n,k,x,xcom,fxk);

  131.        lh=0;

  132. s22: fxh=fxk[lh];

  133.        for(i=0;i<n;i++)

  134.          xh[i]=xcom[i][lh];

  135.        xcent(n,k,k,lh,x0,xcom);

  136.        iw=gau(x0,g,kg);

  137.        *ng=*ng+1;

  138.        if(iw==0)goto s36;

  139.        alp=1.3;

  140. s12: for(i=0;i<n;i++)

  141.        xr[i]=x0[i]+alp*(x0[i]-xh[i]);

  142.        iw=gau(xr,g,kg);

  143.        *ng=*ng+1;

  144.        if(iw==0)

  145.        {

  146.          alp=alp*0.5;

  147.          goto s12;

  148.        }

  149.        fxr=objfx(xr);

  150.        *nf=*nf+1;

  151.        if(fxr>=fxh)

  152.        {

  153.          if(alp>1.0e-4)

  154.          {

  155.     alp=alp*0.5;

  156.     goto s12;

  157.          }

  158.          lh=lh+1;

  159.          if(lh<3)goto s22;

  160.        }

  161.        for(i=0;i<n;i++)

  162.        xcom[i][lh]=xr[i];

  163.        fxk[lh]=fxr;

  164.        goto s14;

  165. s36: for(i=0;i<n;i++)

  166.        {

  167.          bl[i]=xcom[i][k];

  168.          bu[i]=x0[i];

  169.        }

  170.        goto s5;

  171. s38: for(i=0;i<n;i++)

  172.        x[i]=x0[i];

  173.        *f=objfx(x);

  174.        *nf=*nf+1;

  175.        free(x0);

  176.        free(xh);

  177.        free(xr);

  178.        free(g);

  179.        free(fxk);

  180. }
复制代码


来自:http://hi.baidu.com/mec_auto/blo ... 999f305d600850.html
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-6-17 15:58 , Processed in 0.107082 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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