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

📄 分水系统模型.cpp

📁 解线性规划
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>
#include <math.h>
#define n 6

FILE *fp1,*fp2,*fp3;


double min(double a,double b)
      { if(a>b) return b; else return a; }
void eq(float A[][n],float B[][n])                                  //A[i][j]<--B[i][j]
      { int i,j; 
        for(i=0;i<n;i++) 
			for(j=0;j<n;j++)   A[i][j]=B[i][j];  }
void uni_eq(float C[][n],float D[][n])                              //C[i][j]<--D[i][j]
      { int i,j; 
        for(i=0;i<n;i++) 
			for(j=0;j<n;j++)   C[i][j]=(-1)*D[i][j];}
float product(float E[][n],float L[][n])                            //return E[][]*L[][]
      { float sum=0;int i,j;
	    for(i=0;i<n;i++)
			for(j=0;j<n;j++) sum=sum+E[i][j]*L[i][j]; 
			return sum; }              
void  add(float c1,float M[][n],float c2,float N[][n],float R[][n])    //R[][]=c1*M[][]+c2*N[][]
      { int i,j; 
        for(i=0;i<n;i++)
	       for(j=0;j<n;j++)  R[i][j]=c1*M[i][j]+c2*N[i][j] ;    }



  void Add_line(float Line_a[],float Line_x[][n],float Line_c[][n])
    { int i,j;  
     for(i=0;i<n;i++)    Line_a[i]=0;
	  for(i=0;i<n;i++)  
	   for(j=0;j<n;j++)
		   Line_a[i]=Line_a[i]+Line_x[i][j]*Line_c[i][j]; 
	        }  //Line_x[i]为左行c*X和
  void Add_x_line(float Line_a[],float Line_x[][n])
    { int i,j;  
     for(i=0;i<n;i++)   
		 Line_a[i]=0;
	  for(i=0;i<n;i++)  
	   for(j=0;j<n;j++)
		   Line_a[i]=Line_a[i]+Line_x[i][j]; 
	        }  //Line_x[i]为左行X和

void ceshihanghe(float Line_a[],float Line_x[][n])
    { int i,j;  
     for(i=0;i<n;i++)   
		 Line_a[i]=0;
	  for(i=0;i<n;i++)  
	   for(j=0;j<n;j++)
		   Line_a[i]=Line_a[i]+Line_x[i][j]; 
		 fp3=fopen("ls_共厄梯度解目标.txt","a");
       for(i=0;i<n;i++) 
       fprintf(fp3,"\t行和:%f\t",Line_a[i]);
       fprintf(fp3,"over\n");
       fclose(fp3);                               }  //Line_x[i]为左行X和--------------------测试




  void Add_list(float List_a[],float List_x[][n],float List_c[][n])
  {int i,j;
	  for(j=0;j<n;j++)
   {   List_a[j]=0;
	   for(i=0;i<n;i++)
		   List_a[j]=List_a[j]+List_x[i][j]*List_c[i][j];   }    }  //List_x[i]为列c*X和
  void Add_x_list(float List_a[],float List_x[][n])
  {int i,j;
	  for(j=0;j<n;j++)
   {   List_a[j]=0;
	   for(i=0;i<n;i++)
		   List_a[j]=List_a[j]+List_x[i][j];   }    }  //List_x[i]为列X和

  void ceshiliehe(float List_a[],float List_x[][n])
    { int i,j;
	  for(j=0;j<n;j++)
	  {   List_a[j]=0;
	     for(i=0;i<n;i++)
		   List_a[j]=List_a[j]+List_x[i][j];   }
	   fp3=fopen("ls_共厄梯度解目标.txt","a");
       for(i=0;i<n;i++) 
       fprintf(fp3,"\t列和:%f\t",List_a[i]);
       fprintf(fp3,"over\n");
       fclose(fp3);                               }  //Line_x[i]为列c*X和--------------------测试


 
  double F_min(float F_C[][n],float F_X[][n],float F_A[],float F_B[],float F_mu)       //F_min()无约束目标函数 ,  F_A[]=A[i]                                 //f(x)
  {     int i,j,k;
        double f=0;
		float a[n],b[n];
        for(i=0;i<n;i++)
            for(j=0;j<n;j++)  
			{if(F_X[i][j]>=0) k=0;
			 else k=1;
				f=f+k*pow(F_X[i][j],2);             //解决阶跃函数,Xij平方和,解决x为正
			}
        Add_x_line(a,F_X);                            //行和a[i]
		Add_x_list(b,F_X);                            //列和b[i]
        for(i=0;i<n;i++) f=f+pow(a[i]-F_A[i],2)+pow(b[i]-F_B[i],2);  //f追加等式约束
       	f=f*F_mu;                                                 //引入罚因子F_mu
		for(i=0;i<n;i++)
            for(j=0;j<n;j++)  f=f+F_C[i][j]*F_X[i][j];  //追加原约束问题的目标函数c*x


        return f;        
  }

double rf(float F_C[][n],float F_X[][n],float F_A[],float F_B[])       //F_min()无约束目标函数 ,  F_A[]=A[i]                                 //f(x)
  {     int i,j,k;
        double f=0;
        float a[n],b[n];
        for(i=0;i<n;i++)
            for(j=0;j<n;j++)  
			{if(F_X[i][j]>=0) k=0;
			 else k=1;
				f=f+k*pow(F_X[i][j],2);             //解决阶跃函数,Xij平方和,解决x为正
			}
        Add_x_line(a,F_X);                            //行和a[i]
		Add_x_list(b,F_X);                            //列和b[i]
        for(i=0;i<n;i++) f=f+pow(a[i]-F_A[i],2)+pow(b[i]-F_B[i],2);//f追加等式约束
		
       fp3=fopen("ls_共厄梯度解目标.txt","a");
       fprintf(fp3,"\n+++++++++++++++++++++++++++++++++++++++++++++++rf(a)=%-17.5e+++++++++++++++++++++++++++++++++++++\n",f);
       fclose(fp3);                                 //测试罚函数
	   return f;   
  }


void F_DF(float F_g[][n],float F_C[][n],float F_X[][n],float F_A[],float F_B[],float F_mu)       //无约束目标函数F梯度 F_g[][]存放   ,  F_B[]=B[i]                              
  {     int i,j,k;
        float f=0,a[n],b[n];        	  				            		
        Add_x_line(a,F_X);                            //行和a[i]
		Add_x_list(b,F_X);                            //列和b[i]
         
		for(i=0;i<n;i++)
            for(j=0;j<n;j++)  
			{   if(F_X[i][j]>=0) k=0;
			    else k=1;                            //解决阶跃函数
				F_g[i][j]=F_C[i][j]+2*F_mu*(a[i]-F_A[i]+b[j]-F_B[j]+k*F_X[i][j]);          }    //梯度分量分配结束
  }

void ceshitidu(float F_g[][n],float F_C[][n],float F_X[][n],float F_A[],float F_B[],float F_mu)       //无约束目标函数F梯度 F_g[][]存放   ,  F_B[]=B[i]                              
  {     int i,j,k;
        float f=0,a[n],b[n];        	  				            		
        Add_x_line(a,F_X);                            //行和a[i]
		Add_x_list(b,F_X);                            //列和b[i]
         
		for(i=0;i<n;i++)
            for(j=0;j<n;j++)  
			{   if(F_X[i][j]>=-1e-9) k=0;
			    else k=1;                            //解决阶跃函数
				F_g[i][j]=F_C[i][j]+2*F_mu*(a[i]-F_A[i]+b[j]-F_B[j]+k*F_X[i][j]);          }    //梯度分量分配结束----------------------测试
  fp3=fopen("ls_共厄梯度解目标.txt","a");
       for(i=0;i<n;i++) 
	   {for(j=0;j<n;j++)
			   fprintf(fp3,"DF%-d%-d=%f",i,j,F_g[i][j]);
	   fprintf(fp3,"over\n");}
       fclose(fp3); 

}


void  ls(float NP[][n],float F_X0[][n],float F_C[][n],float F_X[][n],float F_A[],float F_B[],float F_mu)      //RX[][]=ls(MX[][]F_X,NP[][]_-F_g,RX[][]_NEW_X_Point)
      { float p=0.1,B=2,v=0.4,gg1[n][n],gg2[n][n],g1=0,g2=0;
	    int i,k=0,j;
		float f1,f2;
		double t=1,a=0,b=1e+6;
	     f1=F_min(F_C,F_X0,F_A,F_B,F_mu);                   //f1 为无约束函数值
	     F_DF(gg1,F_C,F_X0,F_A,F_B,F_mu); 

		 g1=product(gg1,NP);
         
	   for(k=0;k<500;k++)
	   { add(1,F_X0,t,NP,F_X);                               //MX has been changed



	     f2=F_min(F_C,F_X,F_A,F_B,F_mu);
	
		 F_DF(gg2,F_C,F_X,F_A,F_B,F_mu);                  //g=DF(x)
		 
	     g2=product(gg2,NP);
 
//fp3=fopen("ls_共厄梯度解目标.txt","a");
     //  for(i=0;i<n;i++) 
//	   {for(j=0;j<n;j++)
	    		   
//	   fprintf(fp3,"F_X(%-d%-d)=%f",i,j,F_X[i][j]);
//	   fprintf(fp3,"over\n");}
//	   fprintf(fp3,"over\n");
 //      fclose(fp3); 
//fp3=fopen("ls_共厄梯度解目标.txt","a");

  //     fprintf(fp3,"g2=%-17.20eg1=%-17.5ef1=%-17.15ef2=%-17.15et=%.30f",g2,g1,f1,f2,t);
	//   fprintf(fp3,"\n"); 
       
      //fclose(fp3);


	     if(g2-v*g1<-1e-10&&fabs(a-b)>1e-20)  
		 { a=t;t=min((a+b)/2.0,2.0*a);
		          //fp3=fopen("ls_共厄梯度解目标.txt","a");
                    //fprintf(fp3,"条件一a=%-17.20e\tb=%-17.20e\tt=%-17.25e\tf2=%-17.15e",a,b,t,f2);
	                  //fprintf(fp3,"\n"); 
                        //  fclose(fp3);
		 continue;}
	     else  if(f1-f2<(-1.0)*p*t*g1&&fabs(a-b)>1e-20)
		  {b=t;
		     t=0.5*(a+b);
		       //fp3=fopen("ls_共厄梯度解目标.txt","a");
                 // fprintf(fp3,"条件二a=%-17.20e\tb=%-17.20e\tt=%-17.25e\tf2=%-17.15e",a,b,t,f2);
	               //   fprintf(fp3,"\n"); fclose(fp3);
		 continue; }

⌨️ 快捷键说明

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