⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dancunx.txt

📁 这是一个最优化程序
💻 TXT
字号:
#include "math.h"
#include "stdio.h"
#define iDim 2
#define iNum iDim+1
#define ep 0.001
#define v1 0.75              /*压缩因子*/
#define v2 0.25              /*压缩因子*/
#define u  2                 /*加长因子*/

void select(float *p,int arraynum,int *imax,int *ismax,int *imin)
/*比较诸函数值的大小,选出最好点x(L)、最差点x(H)(对目标函数而言)及次差点 x(G)*/
{
 int i;
 *imax=*ismax=*imin=0;
 for(i=1;i<arraynum;i++)
 {
  if(*(p+i)>*(p+*ismax))
   {
    if(*(p+i)>*(p+*imax))
     {
      *ismax=*imax;
      *imax=i;
     }
    else
      *ismax=i;
   }
  else
    { if(*(p+i)<*(p+*imin))
      *imin=i;
    }
 }
}

float ffunction(float x,float y)
/*求目标函数值*/
{
 float f;
 f=60-10*x-4*y+x*x+y*y-x*y;   
 return f;
}

initx(float a[iNum][iDim],int ifL,float h)
/*初始单纯形产生*/
{int i,j;
 if(ifL!=0)
  {
   for(j=0;j<iNum-1;j++)
     a[0][j]=a[ifL][j];
  }
 for(i=1;i<iNum;i++)
   for(j=0;j<iDim;j++)
     {a[i][j]=a[0][j];}
 for(i=1;i<iNum;i++)
    a[i][i-1]=a[i][i-1]+h;
 return 0;
}


main()
{
 float x[iNum][iDim],fx[iNum];
 float xS[iDim],xE[iDim],xR[iDim],fS,fE,fR;
 int ifH,ifL,ifG;
 int i,j,count=0;
 float v,wucha;
 FILE *fp;

 if((fp=fopen("datef1.txt","w"))==NULL)
   {
    printf("File cannot be opened.\n");
    exit(1);
   }

for(i=0;i<iDim;i++)                  /*初始点*/
  x[0][i]=0;
initx(x,0,2.0);
/*x[0][0]=0;x[0][1]=0; x[1][0]=2;x[1][1]=0; x[2][0]=0;x[2][1]=2;   */
fprintf(fp,"x(0)=[%f,%f]  ",x[0][0],x[0][1]);
fprintf(fp,"x(1)=[%f,%f]  ",x[1][0],x[1][1]);
fprintf(fp,"x(2)=[%f,%f]\n",x[2][0],x[2][1]);

 fS=fE=fR=0;

 do{
    count++;
    for(i=0;i<iDim;i++)
      { xS[i]=xE[i]=xR[i]=0;}
    for(i=0;i<iNum;i++)
      {
       fx[i]=ffunction(x[i][0],x[i][1]);
	xR[0]=xR[0]+x[i][0];
	xR[1]=xR[1]+x[i][1];
       }

    select(fx,iNum,&ifH,&ifG,&ifL);
    if(fx[ifL]!=0)
	wucha=fabs(fx[ifH]-fx[ifL])/fabs(fx[ifL]);

    for(i=0;i<iDim;i++)
	xR[i]=xR[i]-x[ifH][i];
    for(i=0;i<iDim;i++)
	xR[i]=2*xR[i]/(iNum-1)-x[ifH][i];     /*求出反射点x(R)*/
    fR=ffunction(xR[0],xR[1]);

    if(fR>=fx[ifG])                          /*进行步长压缩*/
      {
       v=fR<fx[ifH]?v1:v2;
	for(i=0;i<iDim;i++)
	  {xS[i]=(1-v)*fx[ifH]+v*xR[i];}
	fS=ffunction(xS[0],xS[1]);
      }//end if
    else    /*fR<fx[ifG]    进行加大步长*/
	 {
	 for(i=0;i<iDim;i++)
	    {xE[i]=(1-u)*x[ifH][i]+u*xR[i];}
	  fE=ffunction(xE[0],xE[1]);
	  if(fR>=fE)
	     {
	     for(i=0;i<iDim;i++)
		{xS[i]=xE[i];}
	      fS=fE;
	      }//end if
	  else   /*fR<fE    压缩和加大步长都不成立*/
	     {
	     for(i=0;i<iDim;i++)
	       {xS[i]=xR[i];}
		fS=fR;
	     }//end else
	  }//end else

    
    if(fS<fx[ifG])
       {
	   fprintf(fp,"\n第%d轮迭代:\n" , count);
	   fprintf(fp,"fL=%f,   x(L)=[%f,%f]  \n",fx[ifL],x[ifL][0],x[ifL][1]);
	   fprintf(fp,"fH=%f,   x(H)=[%f,%f]  ",fx[ifH],x[ifH][0],x[ifH][1]);
	   fprintf(fp,"ep=%f\n",wucha);
	   fprintf(fp,"fR=%f,   xR=[%f,%f]  ",fR,xR[0],xR[1]);
	   fprintf(fp,"fS=%f,   x(S)=[%f,%f]  ",fS,xS[0],xS[1]);
	   for(i=0;i<iDim;i++)
	     {x[ifH][i]=xS[i];}
	   fx[ifH]=fS;
       }//end if

    else      /*fS>=fx[ifG]*/
	{  if(fabs(fx[ifH]-fx[ifL])<=ep*fabs(fx[ifL]))
	    {
	      fprintf(fp,"\n最后结果:f=%f,   x=[%f,%f]  ",fx[ifL],x[ifL][0],x[ifL][1]);
             fprintf(fp,"fR=%f,   xR=[%f,%f]  ",fR,xR[0],xR[1]);
	      fprintf(fp,"fH=%f,   x(H)=[%f,%f]  ",fx[ifH],x[ifH][0],x[ifH][1]);
             fprintf(fp,"ep=%f\n",wucha);
	      break;
	     }//end if

	   else         /*fabs(fx[ifH]-fx[ifL])>ep*fabs(fx[ifL])*/
	  {
	      for(i=0;i<iNum;i++)        /*进行单纯形收缩*/
	        for(j=0;j<iDim;j++)
	          x[i][j]=(x[i][j]+x[ifL][j])/2;
	      fprintf(fp,"\n第%d轮迭代,进行单纯形收缩:\n",count);
             fprintf(fp,"fR=%f,   xR=[%f,%f]  ",fR,xR[0],xR[1]);
             fprintf(fp,"fH=%f,   x(H)=[%f,%f]\n",fx[ifH],x[ifH][0],x[ifH][1]);
	  }//end else

       }//end else

    if(count>50)
    break;
  }while(1);//end do_while

 fclose(fp);
 return 0;
 }



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -