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

📄 单行替换法.txt

📁 黄金分割法
💻 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 + -