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