sun1993 发表于 2007-9-20 22:28

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

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

风花雪月 发表于 2007-10-11 08:57

复合形法怎么会不一样的?不能理解


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

#include "stdlib.h"

#include "math.h"

#include "stdio.h"

float objfx(float x[]);

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

{

       int i;

       constraint(x,g);

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

       {

         if(g<0)

         goto s333;

       }

       return 1;

s333:return 0;

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

{

       int i,l;

       float xs;

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

       {

         xs=0;

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

         {

    if(l!=lh)

    xs=xs+xcom;

         }

         if(lh>-1)

    x0=xs/(ll-1);

         else

    x0=xs/ll;

       }

}
void fxse(int n,int k,float x[],float xcom[],float fxk[])

{

       int l,lp,lp1,i;

       float w;

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

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

       {

         lp1=lp+1;

         if(fxk<=fxk)

         {

    w=fxk;

    fxk=fxk;

    fxk=w;

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

    {

      x=xcom;

      xcom=xcom;

      xcom=x;

    }

         }

       }

}


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

      float xcom[],float *f,int *nf,int *ng)

{

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

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

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

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

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

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

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

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

       x=bl+rand()/40000.0*(bu-bl);

       iw=gau(x,g,kg);

       *ng=*ng+1;

       if(iw==0)goto s5;

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

       xcom=x;

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

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

       xcom=bl+rand()/50000.0*(bu-bl);

       lh=-1;

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

       {

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

         iw=gau(x0,g,kg);

         *ng=*ng+1;

         if(iw==0)goto s5;

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

         x=xcom;

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

         *ng=*ng+1;

         if(iw==0)

         {

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

    x=x0+0.5*(x-x0);

    goto s24;

         }

         else

         {

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

    xcom=x;

         }

       }

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

       {

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

         x=xcom;

         fx=objfx(x);

         *nf=*nf+1;

         fxk=fx;

       }

       it=0;

s14: it=it+1;

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

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

       lh=-1;

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

       fx0=objfx(x0);

       *nf=*nf+1;

       iw=gau(x0,g,kg);

       *ng=*ng+1;

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

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

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

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

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

       sdx=0;

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

         sdx=sdx+(fx0-fxk)*(fx0-fxk);

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

       if(sdx<ep)goto s38;

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

       lh=0;

s22: fxh=fxk;

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

         xh=xcom;

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

       iw=gau(x0,g,kg);

       *ng=*ng+1;

       if(iw==0)goto s36;

       alp=1.3;

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

       xr=x0+alp*(x0-xh);

       iw=gau(xr,g,kg);

       *ng=*ng+1;

       if(iw==0)

       {

         alp=alp*0.5;

         goto s12;

       }

       fxr=objfx(xr);

       *nf=*nf+1;

       if(fxr>=fxh)

       {

         if(alp>1.0e-4)

         {

    alp=alp*0.5;

    goto s12;

         }

         lh=lh+1;

         if(lh<3)goto s22;

       }

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

       xcom=xr;

       fxk=fxr;

       goto s14;

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

       {

         bl=xcom;

         bu=x0;

       }

       goto s5;

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

       x=x0;

       *f=objfx(x);

       *nf=*nf+1;

       free(x0);

       free(xh);

       free(xr);

       free(g);

       free(fxk);

}

来自:http://hi.baidu.com/mec_auto/blog/item/7783d3fe6a999f305d600850.html
页: [1]
查看完整版本: 哪位能告诉我正确的复合形算法啊?谢谢!