风花雪月 发表于 2006-10-11 17:02

外点惩罚函数法优化子程序

本程序包含5个C文件
mwdfhs.c
powell.c
funct.c
jtf.c
hjfgf.c


本程序由heizi友情提供

风花雪月 发表于 2006-10-11 17:03

mwdfhs.c代码如下:
#include "powell.c"
void main()
{int i;
double p[]={7,8};
double fom,fxo,c,x;
c=10;
r0=0.1;
fom=100;
do
{fxo=powell(p,0.1,0.0001,0.0001,2,x);
if(fabs(fom-fxo)>0.001)
    {fom=fxo;
   r0=c*r0;
   for(i=0;i<2;i++)
      *(p+i)=x;
    }
else
   {printf("输出最优点及其目标函数值:\n");
    printf("x=%f,x=%f,ff=%f",x,x,fxo);
    return;
   }
}while(1);
}

powell.c代码如下:
#include "hjfgf.c"
double oneoptim(double x0[],double s[],double h0,double epsg,int n,double x[])
{double *a,*b,ff;
a=(double *)malloc(n*sizeof(double));
b=(double *)malloc(n*sizeof(double));
jtf(x0,h0,s,n,a,b);
ff=gold(a,b,epsg,n,x);
free(a);
free(b);
return (ff);
}
double powell(double p[],double h0,double eps,double epsg,int n,double x[])
{int i,j,m;
double *xx,*ss,*s;
double f,f0,f1,f2,f3,fx,dlt,df,sdx,q,d;
ss=(double *)malloc(n*(n+1)*sizeof(double));
s=(double *)malloc(n*sizeof(double));
for(i=0;i<n;i++)
{for(j=0;j<=n;j++)
   *(ss+i*(n+1)+j)=0;
   *(ss+i*(n+1)+i)=1;
}
for(i=0;i<4;i++)
xx=(double *)malloc(n*sizeof(double));
for(i=0;i<n;i++)
*(xx+i)=p;
for(;;)
{for(i=0;i<n;i++)
    {*(xx+i)=*(xx+i);
   x=*(xx+i);
    }
   f0=f1=objf(x);
   dlt=-1;
   for(j=0;j<n;j++)
    {for(i=0;i<n;i++)
      {*(xx+i)=x;
       *(s+i)=*(ss+i*(n+1)+j);
      }
   f=oneoptim(xx,s,h0,epsg,n,x);
   df=f0-f;
   if(df>dlt)
      {dlt=df;
       m=j;
      }
    }
    sdx=0;
    for(i=0;i<n;i++)
   sdx=sdx+fabs(x-(*(xx+i)));
    if(sdx<eps)
   {free(ss);
      free(s);
      for(i=0;i<4;i++)
      free(xx);
      return(f);
   }
    for(i=0;i<n;i++)
   *(xx+i)=x;
    f2=f;
    for(i=0;i<n;i++)
    {*(xx+i)=2*(*(xx+i)-(*(xx+i)));
   x=*(xx+i);
    }
    fx=objf(x);
    f3=fx;
    q=(f1-2*f2+f3)*(f1-f2-dlt)*(f1-f2-dlt);
    d=0.5*dlt*(f1-f3)*(f1-f3);
    if((f3<f1)||(q<d))
   {if(f2<=f3)
       for(i=0;i<n;i++)
      *(xx+i)=*(xx+i);
      else
       for(i=0;i<n;i++)
      *(xx+i)=*(xx+i);
   }
    else
    {for(i=0;i<n;i++)
   {*(ss+(i+1)*(n+1))=x-(*(xx+i));
      *(s+i)=*(ss+(i+1)*(n+1));
   }
   f=oneoptim(xx,s,h0,epsg,n,x);
   for(i=0;i<n;i++)
    *(xx+i)=x;
   for(j=m+1;j<=n;j++)
   for(i=0;i<n;i++)
    *(ss+i*(n+1)+j-1)=*(ss+i*(n+1)+j);
    }
}
}

风花雪月 发表于 2006-10-11 17:04

funct.c代码如下:
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
const int kkg=2;
const int qkg=1;
double r0;
double f(double x[])
{double ff;
ff=pow((x-4),2)+pow((x-5),2);
return(ff);
}
void strain(double x[],double g[])
{double dlt=0.001;
g=x-1-dlt;
g=x-4-dlt;
g=7-x-x;
}
double objf(double p[])
{int i;
double ff,sg,*g;
g=(double *)malloc((kkg+qkg)*sizeof(double));
sg=0;
strain(p,g);
for(i=0;i<kkg;i++)
if(*(g+i)<0)
   sg=sg+pow((*(g+i)),2);
if(qkg!=0)
   for(i=kkg;i<kkg+qkg;i++)
   sg=sg+pow((*(g+i)),2);
free(g);
ff=f(p)+r0*sg;
return(ff);
}


jtf.c代码如下:
#include "funct.c"
void jtf(double x0[],double h0,double s[],int n,double a[],double b[])
{int i;
double *x,h,f1,f2,f3;
for(i=0;i<3;i++)
x=(double *)malloc(n*sizeof(double));
h=h0;
for(i=0;i<n;i++)
*(x+i)=x0;
f1=objf(x);
for(i=0;i<n;i++)
*(x+i)=*(x+i)+h*s;
f2=objf(x);
if(f2>=f1)
{h=-h0;
    for(i=0;i<n;i++)
    *(x+i)=*(x+i);
   f3=f1;
    for(i=0;i<n;i++)
    {*(x+i)=*(x+i);
   *(x+i)=*(x+i);
    }
   f1=f2;
   f2=f3;
   }
   for(;;)
   {h=2*h;
   for(i=0;i<n;i++)
   *(x+i)=*(x+i)+h*s;
   f3=objf(x);
   if(f2<f3) break;
   else
    { for(i=0;i<n;i++)
       {*(x+i)=*(x+i);
      *(x+i)=*(x+i);
       }
      f1=f2;
      f2=f3;
    }
   }
   if(h<0)
    for(i=0;i<n;i++)
    {a=*(x+i);
   b=*(x+i);
    }
   else
    for(i=0;i<n;i++)
    {a=*(x+i);
   b=*(x+i);
   }
   for(i=0;i<3;i++)
   free(x);
}


hjfgf.c代码如下:
#include "jtf.c"
double gold(double a[],double b[],double eps,int n,double xx[])
{int i;
double f1,f2,*x,ff,q,w;
for(i=0;i<2;i++)
x=(double *)malloc(n*sizeof(double));
for(i=0;i<n;i++)
{*(x+i)=a+0.618*(b-a);
   *(x+i)=a+0.382*(b-a);
}
f1=objf(x);
f2=objf(x);
do
   {if(f1>f2)
   {for(i=0;i<n;i++)
      {b=*(x+i);
       *(x+i)=*(x+i);
       }
   f1=f2;
   for(i=0;i<n;i++)
      *(x+i)=a+0.382*(b-a);
   f2=objf(x);
   }
    else
   { for(i=0;i<n;i++)
       {a=*(x+i);
       *(x+i)=*(x+i);}
   f2=f1;
    for(i=0;i<n;i++)
   *(x+i)=a+0.618*(b-a);
    f1=objf(x);
   }
q=0;
for(i=0;i<n;i++)
   q=q+(b-a)*(b-a);
w=sqrt(q);
}while(w>eps);
for(i=0;i<n;i++)
   xx=0.5*(a+b);
ff=objf(xx);
for(i=0;i<2;i++)
free(x);
return(ff);
}

mas3593 发表于 2006-12-26 10:34

请教一下楼主,为什么我把这几个程序连起来了调试过了,但运行时就会弹出对话框,忽略以后输出不正确

风花雪月 发表于 2007-1-3 09:40

原帖由 mas3593 于 2006-12-26 10:34 发表
请教一下楼主,为什么我把这几个程序连起来了调试过了,但运行时就会弹出对话框,忽略以后输出不正确

说明详细的错误信息

dxawicso 发表于 2007-2-10 21:29

同问

请教楼主,同样是编译通过,但运行出错.
可否请楼主自己编译运行一下,了解具体情况

heijian20 发表于 2009-9-22 09:21

在Turbo C环境下可以调试通过的

qxkice2004 发表于 2009-9-25 10:03

回复 楼主 风花雪月 的帖子

lz能不能解释一下这几个子程序的含义和用法啊,感激!

wanghuaipan 发表于 2010-4-22 00:54

我的问题同上

程瑞岩 发表于 2012-6-17 10:07

有些东西现在都看不懂了。 {:{19}:}

nari 发表于 2012-7-18 22:56

编译通过,但运行出错.
可否请楼主自己编译运行一下,了解具体情况
页: [1]
查看完整版本: 外点惩罚函数法优化子程序