www.pudn.com > erciguihua.rar > niniudun.c


#define A 5
#define B 5
#define C 7
#define D 1
#include 

float x0[4],x1[4],g[3],d[4],dif[4],dif0[4],dif1[4],h[4][4],c[4],b[4],r;
int i,m,l,j,n,time[100];

//目标函数
float ff(float x [4])
{ 
	float ff;
    ff = x[0]*x[0]+x[1]*x[1]+2*x[2]*x[2]+x[3]*x[3]-5*x[0]-5*x[1]-21*x[2]+7*x[3]+D ;
	return ff;
}

//约束条件
float *pp(float x[4])
{
	float *p3;
	g[0] = -x[0]*x[0]-x[1]*x[1]-x[2]*x[2]-x[3]* x[3]-x[0]+ x[1]-x[2]+x[3]+A ;
	g[1] = -x[0]*x[0]-2* x[1]*x[1]- x[2]*x[2]-2* x[3]* x[3]+ x[0]+x[3]+B ;
	g[2] = -2*x[0]*x[0]- x[1]*x[1]- x[2]*x[2]+x[1]+ x[3]+C;
	p3=g;
	return(p3);
}


//障碍函数
float gg(float x[4])
{
	float k[3],f,gg,*p0;
	int i;
	p0=pp(x);	
	for(i=0;i<3;i++)
		k[i]=*(p0+i);		
	f=ff(x);
	gg=f+r*(1/k[0]+1/k[1]+1/k[2]);
	return gg;
}



//导数
float *diff(float x[4])
{
	float *di,*p1;
	p1=pp(x);	
	for(i=0;i<3;i++)
		g[i]=*(p1+i);
	dif[0]=2*x[0]-5-r*((-2*x[0]-1)/(g[0]*g[0])+(-2*x[0]+1)/(g[1]*g[1])+(-4*x[0]-2)/(g[2]*g[2]));
	dif[1]=2*x[1]-5-r*((-2*x[1]+1)/(g[0]*g[0])+(-4*x[1])/(g[1]*g[1])+(-2*x[1]+1)/(g[2]*g[2]));
	dif[2]=4*x[2]-21-r*((-2*x[2]-1)/(g[0]*g[0])+(-2*x[2])/(g[1]*g[1])+(-2*x[2])/(g[2]*g[2]));
	dif[3]=2*x[3]+7-r*((-2*x[3]+1)/(g[0]*g[0])+(-4*x[3]+1)/(g[1]*g[1])+1/(g[2]*g[2]));
	di=dif;
	return(di);
}


//求h
void findh(float hh0[4][4],float b[4],float c[4])
{
	float hh[4][4],hh1[4][4],hh2[4]={0,0,0,0},hh3[4][4],hh4[4][4],hh5[4][4],hh6[4]={0,0,0,0},bb,cc,s;
	int k;
	bb=0;
	cc=0;
	for(i=0;i<4;i++)
		for(m=0;m<4;m++)
			hh4[i][m]=0;
	
	for(i=0;i<4;i++)
		bb=bb+b[i]*c[i];
	for(i=0;i<4;i++)
	{
		for(m=0;m<4;m++)
			hh6[i]+=c[m]*hh0[m][i];
	}
	for(i=0;i<4;i++)
		cc=cc+hh6[i]*c[i];
	for(i=0;i<4;i++)
		for(m=0;m<4;m++)
			hh1[i][m]=b[i]*b[m]/bb;
	for(i=0;i<4;i++)
		for(m=0;m<4;m++)
			hh2[i]+=hh0[i][m]*c[m];
	for(i=0;i<4;i++)
		for(m=0;m<4;m++)
			hh3[i][m]=hh2[i]*c[m];
	for(i=0;i<4;i++)
		for(m=0;m<4;m++)
		{
			s=0;
			for(k=0;k<4;k++)
				s+=hh3[i][k]*hh0[k][m];
			hh4[i][m]=s;
		}
	for(i=0;i<4;i++)
		for(m=0;m<4;m++)
			hh5[i][m]=hh4[i][m]/cc;
	for(i=0;i<4;i++)
		for(m=0;m<4;m++)
			h[i][m]=hh0[i][m]+hh1[i][m]-hh5[i][m];
}

//求d
void findd(float h[4][4],float x[4])
{
	float dd1[4],*p3;
	float dd[4]={0,0,0,0};
	p3=diff(x);
	for(i=0;i<4;i++)
		dd1[i]=*(p3+i);
	for(i=0;i<4;i++)
		d[i]=0;
	for(i=0;i<4;i++)
		for(m=0;m<4;m++)
			d[i]+=(-h[i][m])*dd1[m];
}


//主函数
main()
{
	float f,a,q,e,*p;
	r=0.9;
	do
	{
		printf("Please input the initial values:\n");
		for(i=0;i<4;i++)
		{
			printf("x[%d]=",i);
			scanf("%f",&x0[i]);
		}
		p=pp(x0);
		if((*p)<0 || (*(p+1)<0) || (*(p+2)<0))
			printf("The values do not satisfy restriction\n");
	}
	while((*p)<0 || (*(p+1)<0) || (*(p+2)<0));

	p=diff(x0);
	for(i=0;i<4;i++)
		d[i]=*(p+i);
	e=d[0]*d[0]+d[1]*d[1]+d[2]*d[2]+d[3]*d[3];
	for(i=0;i<4;i++)
		for(m=0;m<4;m++)
		{
			if(i==m)
				h[i][m]=1;
			else
				h[i][m]=0;
		}

	for(l=0;l<100;l++)
	{
		r=r*0.4;		
		for(j=0;j<10000;j++)
		{

			a=0.01;

			for(i=0;i<4;i++)
				x1[i]=x0[i]-a*d[i];
			
			while((gg(x1)-gg(x0))>0.0001)
			{				
				a=a/2;
				for(i=0;i<4;i++)
					x1[i]=x0[i]+a*d[i];
			}

			if(a<0.000001)
				break;	

			p=pp(x1);
			if( (*p)<0 )
				break;

			for(i=0;i<4;i++)
				b[i]=x1[i]-x0[i];

			p=diff(x0);
			for(i=0;i<4;i++)
				dif0[i]=*(p+i);
			p=diff(x1);
			for(i=0;i<4;i++)
				dif1[i]=*(p+i);
			for(i=0;i<4;i++)
				c[i]=dif1[i]-dif0[i];
			
			findh(h,b,c);

			findd(h,x1);

			e=d[0]*d[0]+d[1]*d[1]+d[2]*d[2]+d[3]*d[3];

			if(e<0.0001)
				break;
			for(i=0;i<4;i++)
				x0[i]=x1[i];
		}
		time[l]=j+1;
		if(r*(g[0]+g[1]+g[2])<0.00001)
			break;
	}

	for(i=0;i<100;i++)
	{
		if(time[i]==0)
			break;
		n+=time[i];
	}

	printf("iterative: %d \n",n);
	printf("The values are:\n");
	for(i=0;i<4;i++)
		printf("x[%d]=%f\n",i,x0[i]);
	f=ff(x0);
	printf("The function value is:%f\n",f);

}