📄 单行替换法.txt
字号:
#include<iostream.h>
#include<math.h>
int const n=2;
double fun(double x[n]);
void compare(double x[n+1][n],double LGH[3][n],double LGH_tap[3]);
void zx(double x[n+1][n],double LGH[3][n],double LGH_tap[3],double xn_1[n],double xn_2[n]);
double H(double x[n+1][n],double LGH[3][n],double c);
void danchun(double original_point[n]);
void main()
{
double x[n]={8,9};
cout<<"单行替换法:"<<endl;
cout<<"minf(x)=4*(x1-5)^2+(x2-6)^2"<<endl;
cout<<"结果是:"<<endl;
cout<<"xk="<<endl;
danchun(x);
}
double fun(double x[n])
{
double y;
y=4*pow((x[0]-5),2)+pow((x[1]-6),2);
return y;
}
void compare(double x[n+1][n],double LGH[3][n],double LGH_tap[3])
{
int i;
double y[n+1];
for(i=0;i<n+1;i++)
y[i]=fun(x[i]);
double temp[2];
temp[0]=y[0];
for(i=0;i<n+1;i++)//temp[0]存储最小的值XL,temp[1]存储对应x的下标
{
if(y[i]<=temp[0])
{
temp[0]=y[i];
temp[1]=i;
}
}
LGH_tap[0]=temp[1];//记录标记
for(i=0;i<n;i++)
LGH[0][i]=x[int(temp[1])][i];
for(i=0;i<n+1;i++)//temp[0]存储最大的值XH,temp[1]存储对应x的下标
{
if(y[i]>=temp[0])
{
temp[0]=y[i];
temp[1]=i;
}
}
LGH_tap[2]=temp[1];//记录标记
for(i=0;i<n;i++)
LGH[2][i]=x[int(temp[1])][i];
temp[0]=y[0];
if(LGH_tap[2]==0)
{
temp[0]=y[1];
}
for(i=0;i<n+1;i++)//temp[0]存储次大的值XG,temp[1]存储对应x的下标
{
if(i==LGH_tap[2])
continue;
if(y[i]>=temp[0])
{
temp[0]=y[i];
temp[1]=i;
}
}
LGH_tap[1]=temp[1];
for(i=0;i<n;i++)
LGH[1][i]=x[int(temp[1])][i];
}
void zx(double x[n+1][n],double LGH[3][n],double LGH_tap[3],double xn_1[n],double xn_2[n])
{
int i,j;
for(i=0;i<n;i++)
xn_1[i]=xn_2[i]=0;
for(i=0;i<n+1;i++)
{
if(i==LGH_tap[2])
continue;
for(j=0;j<n;j++)
{
xn_1[j]+=x[i][j];
}
}
for(i=0;i<n;i++)
xn_1[i]/=n;
for(i=0;i<n;i++)
xn_2[i]=2*xn_1[i]-LGH[2][i];
}
double H(double x[n+1][n],double LGH[3][n],double c)
{
int i;
double s=0;
for(i=0;i<n+1;i++)
{
s+=pow(fun(x[i])-fun(LGH[0]),2);
}
if(s<=c)
return 1;
else
return 0;
}
void danchun(double original_point[n]) //(origina_point:初始点)
{
double x[n+1][n]={0};
double c=0.000001;
double a=2;
double b=0.5;
double LGH[3][n]={0};
double LGH_tap[3]={0};
double xn_1[n]={0}; //重心Xn+1
double xn_2[n]={0}; //反射点Xn+2
double xn_3[n]={0};
double xn_4[n]={0};
int i,j,tap=0;
for(i=0;i<n;i++)
x[0][i]=original_point[i];//构造点x0:x[0][0] 通过如此赋值,将一维数组数据传送到二维数组中
for(i=1;i<n+1;i++)
{
for(j=0;j<n;j++)//通过该循环构造点x1,x2:通过沿"各坐标轴方向"走步长h=1,得到单纯性的其他n个顶点,单纯行共有n+1个顶点
{
if(j+1==i)
x[i][j]=x[0][j]+1;
else
x[i][j]=x[0][j];
}
}
compare(x,LGH,LGH_tap); //通过比较函数compare()返回单纯性n+1个点中最优点xl,最差点xh,次差点xg
zx(x,LGH,LGH_tap,xn_1,xn_2); //并返回次差点的下标用于求重心函数zx()
while(H(x,LGH,c)==0)
{
if(fun(xn_2)<fun(LGH[0]))
{
for(i=0;i<n;i++)
{
xn_3[i]=xn_1[i]+a*(xn_2[i]-xn_1[i]);
}
if(fun(xn_3)<fun(LGH[0]))
{
for(i=0;i<n;i++)
{
x[int(LGH_tap[2])][i]=LGH[2][i]=xn_3[i];
}
}
else
{
for(i=0;i<n;i++)
{
x[int(LGH_tap[2])][i]=LGH[2][i]=xn_2[i];
}
}
}
else
{
if(fun(xn_2)<fun(LGH[1]))
{
for(i=0;i<n;i++)
{
x[int(LGH_tap[2])][i]=LGH[2][i]=xn_2[i];
}
}
else
{
if(fun(xn_2)<fun(LGH[2]))
{
for(i=0;i<n;i++)
{
x[int(LGH_tap[2])][i]=LGH[2][i]=xn_2[i];
}
}
else
{
for(i=0;i<n;i++)
{
xn_4[i]=xn_1[i]+b*(xn_2[i]-xn_1[i]);
}
if(fun(xn_4)<fun(LGH[2]))
{
for(i=0;i<n;i++)
{
x[int(LGH_tap[2])][i]=LGH[2][i]=xn_4[i];
}
}
else
{
for(i=0;i<n+1;i++)
{
if(i==LGH_tap[0])
continue;
for(j=0;j<n;j++)
{
x[i][j]=(LGH[0][j]+x[i][j])/2;
}
}
}
}
}
}
compare(x,LGH,LGH_tap);//返回Xl,Xh,Xg及它们在x[n+1][n]中的下标
zx(x,LGH,LGH_tap,xn_1,xn_2);//返回中心X(n+1)和反射点X(n+2)
tap++;
//cout<<"迭代次数:"<<tap<<endl;
}
for(i=0;i<n;i++)
cout<<LGH[0][i]<<endl;
for(i=0;i<n;i++)
original_point[i]=LGH[0][i];//把在某个Mk值下增广目标函数的最优值返回
}
//以上程序由互联网下载而得,本人略加修改,程序还不完善
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -