动态规划进行单库优化调度计算C++程序代码.docx
《动态规划进行单库优化调度计算C++程序代码.docx》由会员分享,可在线阅读,更多相关《动态规划进行单库优化调度计算C++程序代码.docx(30页珍藏版)》请在冰点文库上搜索。
动态规划进行单库优化调度计算C++程序代码
//类的定义
#ifndefSRDP_H
#defineSRDP_H
classSRDP
{
private:
//1.阶段变量stagevariable
longm_StageNum;//阶段数存储量
doublem_Delta_t;//时间间隔T=2626560s
doublem_DeltaHour;//一个月的小时数:
h
//2.决策变量decisionvariable
//double**m_OptDeciVar_q;
//3.状态变量statevariable
long*m_StateNum;//库容离散点数
//double**m_StateV;//库容离散
//4.指标函数targetfunction
double**m_TarFun;//阶段指标函数
//5.目标函数objectfunction
doublem_ObjFun;//目标函数
//最优轨迹记录数组
long**m_OptArray;
//原始资料记录数组
double*m_RunoffArray;//长系列径流
double*m_EvapArray;//蒸发量
//时间(年月)记录数组
long*m_YearArray;
long*m_MonthArray;
//计算结果
double*m_OptVolumnArray;//最优轨迹对应库容数据数组序列
double*m_OptNArray;//最优轨迹对应出力数据数组序列
double*m_OptAbandonQ;//最优轨迹对应的弃水量序列
double*m_OptUpWaterLevelArray;//最优轨迹对应的水库上游水位序列
double*m_OptDownWaterLevelArray;//最优轨迹对应的水库下游水位序列
double*m_OptVarialbe_q;//最优轨迹对应的发电流量序列
double*m_OptMeanWaterHeadArray;//最优轨迹对应的平均发电水头
double*m_OptNmaxArray;//最优轨迹对应的预想出力
double*m_OptDamageDepth;//最优轨迹中低于保证出力时的破坏深度
doublem_OptReliability;//最优轨迹对应的保证率
doublem_OptGenerationProduction;//发电量
doublem_OptAnnualMaxPower;
//ParametersofHydropowerStation
//
doublem_DeadWaterLevel;//死水位m
doublem_DeadVolumn;//死库容.03亿m3
doublem_NormalWaterLevel;//正常蓄水位835m
doublem_FloodLimitLevel;//汛期防洪限制水位m
doublem_FloodVmax;//汛期最大库容.03亿m3
doublem_NFloodVmax;//非汛期最大库容.37亿m3
intm_UnitsNum;//机组台数
doublem_InstallCapacity;//装机容量*2MW
doublem_FirmCapacity_N;//保证出力.2MW
//预想出力
doublem_PotentialWaterLevel1;
doublem_PotentialCapacity_N1;
doublem_PotentialWaterLevel2;
doublem_PotentialCapacity_N2;
doublem_DesignAnnualGeneration;//设计年发电量.99×kW•eV);//上游水位计算
doubleDownWaterLevelCalculation(doubleq);//下游水位计算
voidReverseSearchCalculation();//反向寻优计算
voidTerminalOptionalResultCalculation();//最终结果计算
};
#endif
//类的实现
//SRDP.cpp:
implementationoftheSRDPclass.
//
//////////////////////////////////////////////////////////////////////
#include"stdafx.h"
#include"SRDP.h"
#include
#include"assert.h"
#include"fstream"
#include"iomanip"
#include"iostream"
#include
usingnamespacestd;
//////////////////////////////////////////////////////////////////////
//Construction/Destruction
//////////////////////////////////////////////////////////////////////
SRDP:
:
SRDP()
{
//原始资料
this->m_RunoffArray=NULL;//长系列径流数据
this->m_EvapArray=NULL;//蒸发数据
////动态规划模型数据
//this->m_StageNum=100;//阶段数
//this->m_Delta_t=2626560;//时间间隔
//this->m_DeltaHour=730;//一个月的小时数
this->m_StateNum=NULL;//状态数
this->m_TarFun=NULL;//阶段指标
//this->m_ObjFun=0.00;//目标函数
this->m_YearArray=NULL;//时间(年)数组
this->m_MonthArray=NULL;//时间(月)数组
this->m_OptArray=NULL;//最优轨迹记录
this->m_OptNmaxArray=NULL;//最优轨迹对应的预想出力
this->m_OptDamageDepth=NULL;//最优轨迹中低于保证出力时的破坏深度
}
SRDP:
:
~SRDP()
{
//原始初始资料数据析构
delete[]this->m_RunoffArray;
delete[]this->m_EvapArray;
//中间变量析构
delete[]this->m_StateNum;
delete[]this->m_YearArray;
delete[]this->m_MonthArray;
//计算结果数组析构
delete[]this->m_OptVolumnArray;
delete[]this->m_OptNArray;
delete[]this->m_OptAbandonQ;
delete[]this->m_OptUpWaterLevelArray;//最优轨迹对应的水库上游水位序列
delete[]this->m_OptDownWaterLevelArray;//最优轨迹对应的水库上游水位序列
delete[]this->m_OptVarialbe_q;//最优轨迹对应的发电流量序列
delete[]this->m_OptMeanWaterHeadArray;
delete[]this->m_OptNmaxArray;//最优轨迹对应的预想出力
delete[]this->m_OptDamageDepth;//最优轨迹中低于保证出力时的破坏深度
for(inti=0;i<=this->m_StageNum;i++)
{
//delete[]this->m_OptDeciVar_q[i];
//delete[]this->m_StateV[i];
delete[]this->m_OptArray[i];
delete[]this->m_TarFun[i];
}
//delete[]this->m_OptDeciVar_q;
//delete[]this->m_StateV;
delete[]this->m_OptArray;
delete[]this->m_TarFun;
}
/////////////////////////////////////////////////////////////////////////////////////////////////
//数据初始化内存分配
/////////////////////////////////////////////////////////////////////////////////////////////////
voidSRDP:
:
InitionalizingSRDP(char*DataFile1,char*DataFile2,char*DataFile3)
{
this->m_StageNum=516;
this->m_BeginMonth=6;
this->m_BeginYear=1957;
this->m_OptGenerationProduction=0.00;
this->m_OptAnnualMaxPower=0.00;
this->m_DeltaHour=730;
//---------------------------获取时间序列--------------------------------//
this->m_YearArray=newlong[this->m_StageNum+1];
this->m_MonthArray=newlong[this->m_StageNum+1];
this->m_StateNum=newlong[this->m_StageNum+1];
for(inti=0;i<=this->m_StageNum;i++)
{
this->m_YearArray[i]=0;
this->m_MonthArray[i]=0;
this->m_StateNum[i]=10;
}
this->m_YearArray[0]=this->m_BeginYear;//水文年起始年份
this->m_MonthArray[0]=this->m_BeginMonth;//水文年起始月份
for(inti=1;i<=this->m_StageNum;i++)
{
if((this->m_MonthArray[i-1]+1)<=12)
{
this->m_MonthArray[i]=this->m_MonthArray[i-1]+1;
this->m_YearArray[i]=this->m_YearArray[i-1];
}
elseif((this->m_MonthArray[i-1]+1)>12)
{
this->m_MonthArray[i]=this->m_MonthArray[i-1]-11;
this->m_YearArray[i]=this->m_YearArray[i-1]+1;
}
//cout<m_YearArray[i]<<"-"<m_MonthArray[i]<}
//---------------------获取状态离散点数---------------------------------//
for(inti=0;i<=this->m_StageNum;i++)
{
if(this->m_MonthArray[i]>=6&&this->m_MonthArray[i]<=10)
this->m_StateNum[i]=1;
else
this->m_StateNum[i]=51;
//cout<m_YearArray[i]<<"\/"<m_MonthArray[i]<<"\t"<m_StateNum[i]<}
//----------动态分配内存并初始化径流资料、蒸发数据、状态数据等----------//
//一维数组
this->m_RunoffArray=newdouble[this->m_StageNum+1];
this->m_EvapArray=newdouble[this->m_StageNum+1];
//
this->m_OptVolumnArray=newdouble[this->m_StageNum+1];
this->m_OptNArray=newdouble[this->m_StageNum+1];
this->m_OptAbandonQ=newdouble[this->m_StageNum+1];
this->m_OptUpWaterLevelArray=newdouble[this->m_StageNum+1];//最优轨迹对应的水库上游水位序列
this->m_OptDownWaterLevelArray=newdouble[this->m_StageNum+1];//最优轨迹对应的水库上游水位序列
this->m_OptVarialbe_q=newdouble[this->m_StageNum+1];//最优轨迹对应的发电流量序列
this->m_OptMeanWaterHeadArray=newdouble[this->m_StageNum+1];
this->m_OptNmaxArray=newdouble[this->m_StageNum+1];//最优轨迹对应的预想出力
this->m_OptDamageDepth=newdouble[this->m_StageNum+1];//最优轨迹中低于保证出力时的破坏深度
//二维数组
//this->m_OptDeciVar_q=newdouble*[this->m_StageNum+1];
//this->m_StateV=newdouble*[this->m_StageNum+1];
this->m_OptArray=newlong*[this->m_StageNum+1];
this->m_TarFun=newdouble*[this->m_StageNum+1];
for(inti=0;i<=this->m_StageNum;i++)
{
//this->m_OptDeciVar_q[i]=newdouble[this->m_StateNum[i]];
//this->m_StateV[i]=newdouble[this->m_StateNum[i]];
this->m_OptArray[i]=newlong[this->m_StateNum[i]];
this->m_TarFun[i]=newdouble[this->m_StateNum[i]];
}
for(inti=0;i<=this->m_StageNum;i++)
{
this->m_RunoffArray[i]=0.00;
this->m_EvapArray[i]=0.00;
this->m_OptVolumnArray[i]=0.00;
this->m_OptNArray[i]=0.00;
this->m_OptAbandonQ[i]=0.00;
this->m_OptUpWaterLevelArray[i]=0.00;
this->m_OptDownWaterLevelArray[i]=0.00;
this->m_OptVarialbe_q[i]=0.00;
this->m_OptMeanWaterHeadArray[i]=-1;
this->m_OptNmaxArray[i]=-1;//最优轨迹对应的预想出力
this->m_OptDamageDepth[i]=0;//最优轨迹中低于保证出力时的破坏深度
for(longj=0;jm_StateNum[i];j++)
{
//this->m_OptDeciVar_q[i][j]=0.00;
//this->m_StateV[i][j]=0.00;
this->m_OptArray[i][j]=0;
this->m_TarFun[i][j]=-1e+6;
}
}
//----------------//InputSystemParametetersfromfile//---------------//
//
ifstreammyFileIn1,myFileIn2,myFileIn3;
myFileIn1.open(DataFile1);//系统特性参数文件
if(!
myFileIn1)
{
cout<<"CannotOpenSystemParametersFile"<exit(0);
}
else
{
while(myFileIn1.good())
{
myFileIn1>>this->m_DeadWaterLevel>>this->m_DeadVolumn>>this->m_NormalWaterLevel
>>this->m_FloodLimitLevel>>this->m_FloodVmax>>this->m_NFloodVmax
>>this->m_UnitsNum>>this->m_InstallCapacity>>this->m_FirmCapacity_N
>>this->m_PotentialWaterLevel1>>this->m_PotentialCapacity_N1
>>this->m_PotentialWaterLevel2>>this->m_PotentialCapacity_N2
>>this->m_DesignAnnualGeneration>>this->m_CC>>this->m_LHC
>>this->m_LHmax>>this->m_Delta_t;
}
myFileIn1.close();
}
/*cout<<"系统特性参数"<cout<<"|=======================================================|"<cout<<"|时段长度|Delta_T="<m_Delta_t<<"s"<cout<<"|死水位|DeadWaterLevel="<m_DeadWaterLevel<<"m"<cout<<"|死库容|DeadVolumn="<m_DeadVolumn<<"亿立方米"<cout<<"|正常蓄水位|NormalWaterLevel="<m_NormalWaterLevel<<"m"<cout<<"|汛期防洪限制水位|FloodLimitLevel="<m_FloodLimitLevel<<"m"<cout<<"|汛期最大库容|FloodPeriodVmax="<m_FloodVmax<<"亿立方米"<cout<<"|非汛期最大库容|NonFloodPeriodVmax="<m_NFloodVmax<<"亿立方米"<cout<<"|系统装机容量|InstallCapacity="<m_UnitsNum<<"x"<m_InstallCapacity/2<<"MW"<cout<<"|系统保证出力|FirmCapacity="<m_FirmCapacity_N<<"MW"<cout<<"|水电站预想出力|";
cout<<"|水头|"<m_PotentialWaterLevel1<<"m|"<m_PotentialWaterLevel2<<"m|"<cout<<"||"<<"|出力|"<m_PotentialCapacity_N1<<"MW|"<cout<<"|设计年发电量|DesignAnnualGeneration="<m_DesignAnnualGeneration<<"kW.h"<cout<<"|水电站出力系数|OutputCoefficient="<m_CC<cout<<"|水头损失系数|HeadLossCoefficient="<m_LHC<cout<<"|最大水头损失|HeadLossMax="<m_LHmax<cout<<"|径流系列起始年月|BeginTime="<m_BeginYear<<"-0"<m_BeginMonth<cout<<"|=========================================================|"<//-------------------------------//Inputrunoffdatafromfile//---------------------------//
//
//从文件中读取长系列径流数据
myFileIn2.open(DataFile2);//径流文件
if(!
myFileIn2)
{
cou