当前位置:文档之家› 惩罚函数法C语言相关程序

惩罚函数法C语言相关程序

#include
#include
double d,z,z0,z1,z2,z3,r=1,c=0.2;
double x1[2], x2[2], x3[2],s[2],a[2],b[2];
int i,n=2,k=1;
double f(double x[],double r)
{
double z;
z=(x[0]-2)*(x[0]-2)+(x[1]-2)*(x[1]-2)-r/(x[0]*x[0]-x[1])-r/(x[0]+x[1]-2);//目标函数

return z;
}
waitui()//外推法
{
double h0=0.03,h=h0;
z1=f(x1,r);
for(i=0;is[i]=s[i]*h;
for(i=0;ix2[i]=x1[i]+s[i];
z2=f(x2,r);
if(z2>z1)
{
for(i=0;ifor(i=0;ifor(i=0;ifor(i=0;i}
for(i=0;iwhile(z3{
for(i=0;ifor(i=0;ifor(i=0;ifor(i=0;ifor(i=0;i}
for(i=0;i{
a[i]=x1[i];b[i]=x3[i];
}
}
huangjin()//黄金分割法
{
d=0.618;
waitui();
c=0.2;
for(i=0;i{
x1[i]=b[i]-d*(b[i]-a[i]);
x2[i]=a[i]+d*(b[i]-a[i]);
}
z1=f(x1,r);
z2=f(x2,r);
if(z1>=z2)
{
for(i=0;ifor(i=0;ifor(i=0;i}
else
{
for(i=0;ifor(i=0;ifor(i=0;i}
while(abs(z2-z1)>=c)
{
if(z1>=z2)
{
for(i=0;ifor(i=0;ifor(i=0;i}
else
{
for(i=0;ifor(i=0;ifor(i=0;i}
}
for(i=0;i}
main( )
{
double x0[2],e=0.03,f=0.01,sum;
x0[0]=3;
x0[1]=3;
s[0]=0;
s[1]=1;
z0=(x0[0]-2)*(x0[0]-2)+(x0[1]-1)*(x0[1]-1);
do
{
if(s[1]<1)
{
s[0]=1;s[1]=0;
}
else
{
s[0]=0;s[1]=1;
}
for(i=0;ix1[i]=x0[i];
huangjin();
sum=0;
for(i=0;isum+=(x1[i]-x0[i])*(x1[i]-x0[i]);
if(sqrt(sum)break;
for(i=0;ix0[i]=x1[i];r=r*c;
z0=(x0[0]-2)*(x0[0]-2)+(x0[1]-1)*(x0[1]-1)-r/((x0[0]*x0[0]-x0[1])*c)-r/((x0[0]+x0[1]-2)*c);
printf("第%d次迭代:\n\n",k);
printf("r=%f\n",r);
k++;
for( i=0;iprintf("x(%d)=%f\n",i+1,x1[i]);
}
while(1);
printf("the best result:\n");
z=(x1[0]-2)*(x1[0]-2)+(x1[1]-1)*(x1[1]-1)-r/(x1[0]*x1[0]-x1[1])-r/(x1[0]+x1[1]-2);//目标函数
printf("\nz*=%f\n",z);
}

相关主题
文本预览
相关文档 最新文档