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

📄 dpview.cpp

📁 DP规划
💻 CPP
字号:
// dpView.cpp : implementation of the CDpView class
//

#include "stdafx.h"
#include "dp.h"

#include "dpDoc.h"
#include "dpView.h"
#include "math.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDpView

IMPLEMENT_DYNCREATE(CDpView, CView)

BEGIN_MESSAGE_MAP(CDpView, CView)
	//{{AFX_MSG_MAP(CDpView)
	ON_COMMAND(IDM_DPYH, OnDpyh)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDpView construction/destruction

CDpView::CDpView()
{
	// TODO: add construction code here

}

CDpView::~CDpView()
{
}

BOOL CDpView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CDpView drawing

void CDpView::OnDraw(CDC* pDC)
{
	CDpDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CDpView printing

BOOL CDpView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CDpView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CDpView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CDpView diagnostics

#ifdef _DEBUG
void CDpView::AssertValid() const
{
	CView::AssertValid();
}

void CDpView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CDpDoc* CDpView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDpDoc)));
	return (CDpDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CDpView message handlers

void CDpView::OnDpyh() 
{


	int i,j,k,l,m,n;//循环变量

	int ll,kk;

	long int a,b,c,d;//备用参数
	float x,y,z;//备用参数
	float x1,x2,x3;
	int mark;//标记用
	int sign;

	float Vu_bottom,Vu_top,hu_bottom=615.0,hu_top=620.0;
	float Vd_bottom,Vd_top,hd_bottom=554.0,hd_top=556.5;
	int U_st_num,D_st_num;

	float U_st[1000],D_st[1000];

  
	readdata_flood_TZY();

	
	  
////以库容作为状态变量,步长100万m3

	long int step=2e5;//步长
///////////生成状态序列
///////////上库



	Vu_bottom=HtoV_TZY(hu_bottom);
	Vu_top=HtoV_TZY(hu_top);

	a=Vu_bottom/step;
    Vu_bottom=(a+1)*step;//忽略不足步长的库容

	a=Vu_top/step;
    Vu_top=a*step;//忽略小于步长的库容

	U_st_num=(Vu_top-Vu_bottom)/step;
	for(i=0;i<U_st_num;i++)
		U_st[i]=Vu_bottom+i*step;//上库状态序列



	Vd_bottom=HtoV_LD(hd_bottom);
	Vd_top=HtoV_LD(hd_top);

	a=Vd_bottom/step;
    Vd_bottom=(a+1)*step;//忽略不足步长的库容

	a=Vd_top/step;
    Vd_top=a*step;//忽略小于步长的库容

	D_st_num=(Vd_top-Vd_bottom)/step;
	for(i=0;i<D_st_num;i++)
		D_st[i]=Vd_bottom+i*step;//下库状态序列



///////////////////////////////////////////////////
///////////////////////////////////////////////////
///////////////////////////////////////////////////
	FILE *fp=fopen("检验状态序列.txt","w");
	
	for (i=0;i<U_st_num;i++)
	{
		fprintf(fp,"%4.2f\n",U_st[i]);
    }

	for (i=0;i<D_st_num;i++)
	{
		fprintf(fp,"%4.2f\n",D_st[i]);
    }
	fclose(fp);
////////////////////////////////////////////////////
////////////////////////////////////////////////////	
////////////////////////////////////////////////////

////dp优化

	float ff[100][100];//阶段优化目标存储数组[U_st][D_st]
	float Qo_dp_TZY[100][100];
	float tt=3600;
	float Qin_dp_LD[100][100],Qo_dp_LD_0[100][50];
	float y1;
/*	float Qo_dp_LD_tmp[100][100];*/
	float ff_tmp[100];
	float AA=10e10;

////////////第一阶段

	for(ll=0;ll<U_st_num;ll++)
		for(kk=0;kk<D_st_num;kk++)
		{
			Qo_dp_TZY[0][ll]=Qin_TZY[0]-(U_st[ll]-U_st[0])/tt;


			Qin_dp_LD[0][ll]=Qin_TZY[0]*0.4632+Qo_dp_TZY[0][ll];
			Qo_dp_LD_0[ll][kk]=Qin_dp_LD[0][ll]-(D_st[kk]-D_st[0])/tt;

			x1=VtoH_LD(D_st[kk]);
			

			if((Qo_dp_TZY[0][ll]>=0)&&(Qo_dp_LD_0[ll][kk]>=0))///水量平衡所得流量为正值
			{
				if(
					   (
						 ((x1<=553.8)&&(Qo_dp_LD_0[ll][kk]<=1800))///(下游)泄流限制,可能要调整
					   ||
						 (x1>553.8)
					   )
				   &&
					   (Qo_dp_TZY[0][ll]<=VtoQo_TZY(U_st[ll]))//上库泄流能力
				   &&
					   (Qo_dp_LD_0[ll][kk]<=VtoQo_LD(D_st[kk]))//下库泄流能力
				  )
				{
					ff[ll][kk]=0.6*Qo_dp_TZY[0][ll]+0.4*Qo_dp_LD_0[ll][kk];	
					z=10;
				}
				else
				{
					ff[ll][kk]=AA;
				}			
			}
			else
			{
				ff[ll][kk]=AA;
			}


			z=0;
		}
			z=0;

//////////中间阶段

		float ff_tmp1[100][100][50];
		float ff_tmp2[100][50];
		int path_tmp[100][100][50],path[100][100][50];
		float Qo_tmp;
		float min,max;

		for(i=1;i<amount_flood-1;i++)
		{
			for(l=0;l<U_st_num;l++)
				for(ll=0;ll<U_st_num;ll++)
					for(k=0;k<D_st_num;k++)
					{
						mark=0;
						c=0;
						for(kk=0;kk<D_st_num;kk++)
						{
							Qo_dp_TZY[ll][l]=Qin_TZY[i]-(U_st[l]-U_st[ll])/tt;

							Qin_dp_LD[ll][l]=Qin_TZY[i]*0.4632+Qo_dp_TZY[ll][l];
							
							Qo_dp_LD_0[kk][k]=Qin_dp_LD[ll][l]-(D_st[k]-D_st[kk])/tt;

							x1=VtoH_LD(D_st[k]);

							if(
								(ff[ll][kk]!=AA)
								&&
								((Qo_dp_TZY[ll][l]>0)&&(Qo_dp_LD_0[kk][k]>0))
								&&
								(
								   (//下游泄流限制
									((x1<=553.8)&&(Qo_dp_LD_0[kk][k]<=1800))
									||
									(x1>553.8)
								   )
								   &&//上库泄流能力
								   (
									(Qo_dp_TZY[ll][l]<VtoQo_TZY(U_st[l]))
									||
									(Qo_dp_TZY[ll][l]<VtoQo_TZY(U_st[ll]))
								   )
								   &&//下库泄流能力
								   (
									(Qo_dp_LD_0[kk][k]<VtoQo_LD(D_st[k]))
									||
									(Qo_dp_LD_0[kk][k]<VtoQo_LD(D_st[kk]))
								   )
								)
							  )
							{
								mark++;

								Qo_tmp=0.6*Qo_dp_TZY[ll][l]+0.4*Qo_dp_LD_0[kk][k];

								if(Qo_tmp>=ff[ll][kk])
									max=Qo_tmp;
								else
									max=ff[ll][kk];

								if(mark==1)
								{
									min=max;
									c=kk;
								}
								
								if(
									(mark>=1)
									&&
									(min>=max)
								  )
								{
										min=max;
										c=kk;
								}
							}

						}//kk循环

						if(mark==0)
						{
							ff_tmp1[l][ll][k]=AA;
							path_tmp[l][ll][k]=c;
						}
						else
						{
							ff_tmp1[l][ll][k]=min;
							path_tmp[l][ll][k]=c;
						}	
						
					}//k,ll,l循环



		

				for(l=0;l<U_st_num;l++)
					for(k=0;k<D_st_num;k++)
					{
						x=ff_tmp1[l][0][k];
						a=0;
						for(ll=0;ll<U_st_num;ll++)
						{
							if(x>=ff_tmp1[l][ll][k])
							{
								x=ff_tmp1[l][ll][k];
								a=ll;
								b=path_tmp[l][ll][k];
							}
						}

						path[i+1][l][k]=a*100+b;
						
						if(x>=ff[a][b])
						{
							ff_tmp2[l][k]=x;
						}
						else
						{
							ff_tmp2[l][k]=ff[a][b];
						}
					}//k,l循环

				z=0;
				x3=0;
				for(l=0;l<U_st_num;l++)
					for(k=0;k<D_st_num;k++)
					{
						ff[l][k]=ff_tmp2[l][k];
						if(
							/*((ff[l][k]-3649.71)>1)
							||
							((ff[l][k]-3649.71)<-1)*/
							ff[l][k]==AA
						  )
						{
							x3=-1;
						}
						else
						{
							z=1;
						}

					}//k,l循环

				if(z==0)
				{
					z=12;
					z=11;
					fp=fopen("溢出.txt","w");

					fprintf(fp,"i=%d\n",i);

					goto loop;
				}





		}//i循环

/////////////////最后阶段

/*		float ff_tmp3[100][50];*/
/*		float Qo_dp_LD_00[100][50];*/

		i=amount_flood-1;

		mark=0;
		c=0;
		d=0;
		max=0;
		min=0;

		for(ll=0;ll<U_st_num;ll++)
			for(kk=0;kk<D_st_num;kk++)
			{
				Qo_dp_TZY[ll][0]=Qin_TZY[i]-(U_st[ll]-U_st[0])/tt;

				Qin_dp_LD[ll][0]=0.4623*Qin_TZY[i]+Qo_dp_TZY[ll][0];

				Qo_dp_LD_0[ll][kk]=Qin_dp_LD[ll][0]-(D_st[kk]-D_st[0])/tt;


				if(
					(ff[ll][kk]!=AA)
				  &&
				    ((Qo_dp_TZY[ll][0]>0)&&(Qo_dp_LD_0[ll][kk]>0))
				  &&
				    (Qo_dp_TZY[ll][0]<VtoQo_TZY(U_st[ll]))
				  &&
				    (Qo_dp_LD_0[ll][kk]<VtoQo_LD(D_st[kk]))
				  )
				{
					
					Qo_tmp=0.6*Qo_dp_TZY[ll][0]+0.4*Qo_dp_LD_0[ll][kk];

					mark++;

					if(Qo_tmp>ff[ll][kk])
						max=Qo_tmp;
					else
						max=ff[ll][kk];
					
					if(mark==1)
					{
						min=max;
						c=kk;
						d=ll;
					}
					
					if(
						(mark>1)
					  &&
					    (min>max)
					  )
					{
						min=max;
						c=kk;
						d=ll;
					}
				}
			}//ll,kk循环

			if(mark==0)
			{
				fp=fopen("溢出.txt","w");

				fprintf(fp,"i=%d\n",i);

				goto loop;
			}





			path[amount_flood][0][0]=100*c+d;


		z=0;
/*		for(l=0;l<U_st_num;l++)
			for(k=0;k<D_st_num;k++)
			{
				if(ff[l][k]==AA)
					x3=0;
				else			
				{
					z=1;
					x2=ff[l][k];
				}
			}

*/

////////////////////////////提取轨迹


	int aa,bb;
	float UU[100],DD[100];

	UU[amount_flood]=U_st[0];
	DD[amount_flood]=D_st[0];

	a=path[amount_flood][0][0]/100;
	b=fmod(path[amount_flood][0][0],100);
	for(i=amount_flood-1;i>0;i--)
	{
		aa=path[i][a][b]/100;
		UU[i]=U_st[a];

		bb=fmod(path[i][a][b],100);
		DD[i]=D_st[b];
		a=aa;
		b=bb;
	}

	UU[0]=U_st[0];
	DD[0]=D_st[0];

	z=0;

	
/////////////////结果输出
	fp=fopen("结果.txt","w");

	fprintf(fp,"目标函数为%4.2f\n",min);

	fprintf(fp,"上库	下库\n");
	
	for (i=0;i<=amount_flood;i++)
	{
		fprintf(fp,"%4.2f	%4.2f\n",UU[i],DD[i]);
    }

	fclose(fp);




loop: z=0;









}

void CDpView::readdata_flood_TZY()
{
	int i,j,k;

	for(i=0;i<1000;i++)
	{
		Qin_TZY[i]=-1;
		Qin_LD[i]=-1;
		Qout_TZY[i]=-1;
		Qout_LD[i]=-1;
	}///////////////////////////将未赋值的洪水序列初始化为-1;实际洪水序列的长度由amount_flood决定



	FILE *fp=fopen("桐子营洪水过程线.txt","r");     
	fscanf(fp,"%d",&amount_flood);

	for (i=0;i<amount_flood;i++)
	{
		fscanf(fp,"%f",&Qin_TZY[i]);
    }
	fclose(fp);

	fp=fopen("检验桐子营洪水过程线.txt","w");
	fprintf(fp,"入库流量\n"); 
	
	for (i=0;i<amount_flood;i++)
	{
		fprintf(fp,"%4.2f\n",Qin_TZY[i]);
    }
	fclose(fp);

}

float CDpView::HtoV_TZY(float h)
{
	int i;
	float H[15],V[15];
	float v;
	FILE *fp=fopen("桐子营水位库容曲线.txt","r");              
	for (i=0;i<15;i++)
	{
		fscanf(fp,"%f	%f",&H[i],&V[i]);
    }
	fclose(fp);

	if((h<590)||(h>625))//最小死水位,最大为所给范围上限
		v=-100;//溢出

	for(i=0;i<14;i++)                      //求h水位对应的库容v
		if((h>=H[i])&&(h<H[i+1]))
			v=V[i]+(V[i+1]-V[i])*(h-H[i])/(H[i+1]-H[i]);
	return v;

}

float CDpView::HtoV_LD(float h)
{
	int i;
	float H[34],V[34];
	float v;
	FILE *fp=fopen("龙洞水位库容曲线.txt","r");              
	for (i=0;i<34;i++)
	{
		fscanf(fp,"%f	%f",&H[i],&V[i]);
    }
	fclose(fp);

	if((h<535.5)||(h>557))//最小死水位,最大为所给范围上限
		v=-100;//溢出

	for(i=0;i<33;i++)              
		if((h>=H[i])&&(h<H[i+1]))
			v=V[i]+(V[i+1]-V[i])*(h-H[i])/(H[i+1]-H[i]);
	return v;


}

float CDpView::VtoQo_TZY(float v)
{
	int i;
	float H[15],V[15];
	float Qo;
	float h;
	FILE *fp=fopen("桐子营水位库容曲线.txt","r");              
	for (i=0;i<15;i++)
	{
		fscanf(fp,"%f	%f",&H[i],&V[i]);
    }
	fclose(fp);

	if((v<15038000)||(v>101142000))v=-1000;//溢出:最小为死库容,最大为所给范围上限

	for(i=0;i<33;i++) 
		if((v>=V[i])&&(v<V[i+1]))
			h=H[i]+(H[i+1]-H[i])*(v-V[i])/(V[i+1]-V[i]);//V插出H

	Qo=HtoQo_TZY(h);
	return Qo;




}

float CDpView::VtoQo_LD(float v)
{
	int i;
	float h;
	float H[34],V[34];
	float Qo;
	FILE *fp=fopen("龙洞水位库容曲线.txt","r");              
	for (i=0;i<34;i++)
	{
		fscanf(fp,"%f	%f",&H[i],&V[i]);
    }
	fclose(fp);

	if((v<27230000)||(v>68480000))v=-1000;//溢出:最小为死库容,最大为所给范围上限

	for(i=0;i<33;i++) 
		if((v>=V[i])&&(v<V[i+1]))
			h=H[i]+(H[i+1]-H[i])*(v-V[i])/(V[i+1]-V[i]);//V插出H

	Qo=HtoQo_LD(h);
	return Qo;
}



float CDpView::HtoQo_TZY(float h)
{
	int i;
	float H[18],Qout[18];
	float Qo;
	FILE *fp=fopen("桐子营水位泄流曲线.txt","r");              
	for (i=0;i<18;i++)
	{
		fscanf(fp,"%f	%f",&H[i],&Qout[i]);
    }
	fclose(fp);

	if((h<608)||(h>620))//所给库泄曲线范围
		Qo=-1000;//溢出

	for(i=0;i<17;i++)                      //求h水位对应的泄流能力Qo
		if((h>=H[i])&&(h<H[i+1]))
			Qo=Qout[i]+(Qout[i+1]-Qout[i])*(h-H[i])/(H[i+1]-H[i]);
	return Qo;

}

float CDpView::HtoQo_LD(float h)
{
	int i;
	float H[14],Qout[14];
	float Qo;
	FILE *fp=fopen("龙洞水位泄流曲线.txt","r");              
	for (i=0;i<14;i++)
	{
		fscanf(fp,"%f	%f",&H[i],&Qout[i]);
    }
	fclose(fp);

	if((h<544)||(h>555))//所给库泄曲线范围
		Qo=-1000;//溢出

	for(i=0;i<13;i++)                      //求h水位对应的泄流能力Qo
		if((h>=H[i])&&(h<H[i+1]))
			Qo=Qout[i]+(Qout[i+1]-Qout[i])*(h-H[i])/(H[i+1]-H[i]);
	return Qo;


}

float CDpView::VtoH_TZY(float v)
{
	int i;
	float H[15],V[15];
	float h;
	FILE *fp=fopen("桐子营水位库容曲线.txt","r");              
	for (i=0;i<15;i++)
	{
		fscanf(fp,"%f	%f",&H[i],&V[i]);
    }
	fclose(fp);

	if((v<122000)||(v>101142000))//所给范围
		h=-100;//溢出

	for(i=0;i<14;i++)                      //求h水位对应的库容v
		if((v>=V[i])&&(v<V[i+1]))
			h=H[i]+(H[i+1]-H[i])*(v-V[i])/(V[i+1]-V[i]);
	return h;


}

float CDpView::VtoH_LD(float v)
{
	int i;
	float H[34],V[34];
	float h;
	FILE *fp=fopen("龙洞水位库容曲线.txt","r");              
	for (i=0;i<34;i++)
	{
		fscanf(fp,"%f	%f",&H[i],&V[i]);
    }
	fclose(fp);

	if((v<27230000)||(v>68480000))//所给范围
		h=-100;//溢出

	for(i=0;i<33;i++)              
		if((v>=V[i])&&(v<V[i+1]))
			h=H[i]+(H[i+1]-H[i])*(v-V[i])/(V[i+1]-V[i]);
	return h;

}

⌨️ 快捷键说明

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