📄 dancunx.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 + -