本例展示了如何使用强化学习(RL)学习配水系统的最优泵调度策略。
下图显示了配水系统。
这里:
是从水库供应到水箱的水量。
是指水箱流出的水量,以满足使用需求。
加强学习代理的目的是安排运行到既有最小化系统的能量使用的泵数,并满足使用需求( )。坦克系统的Dybnamics由以下等式控制。
这里, 和 。在24小时内的需求是一定时间的函数
在哪里 是预期的需求和 表示需求不确定性,从均匀的随机分布采样。
供应由运行的泵数确定, 根据映射之后。
为了简化问题,功耗被定义为运行的泵数, 。
下面的功能是对这种环境的奖励。为了避免水箱溢出或排空,如果水位接近最高或最低水位,则需要增加额外的费用。 或者 , 分别。
根据考虑的天数生成和水需求曲线,使用生成游艇媒体
在本例末尾定义的函数。
num_days = 4;%天数[waterdemand,t_max] =生成waterdemand(num_days);
查看需求配置文件。
情节(WaterDemand)
打开分发系统Simulink模型。金宝app
mdl =“watertankscheduling”;Open_System(MDL)
除了强化学习代理,一个简单的基线控制器定义在控制律MATLAB函数块。这个控制器根据水位激活一定数量的泵。
指定初始水位高度。
H0 = 3;%M.
指定模型参数。
sampletime = 0.2;h_max = 7;最大油罐高度(m)A_tank = 40;坦克的%面积(m ^ 2)
要为Simulink模型创建环境界面,首先定义操作和观察规范,金宝appActinfo.
和obsinfo.
, 分别。代理操作是所选泵数。代理观察是水高,其作为连续时间信号被呈现。
actInfo = rlFiniteSetSpec ([0, 1, 2, 3]);obsInfo = rlNumericSpec ([1]);
创建环境界面。
ent = rl金宝appsimulinkenv(mdl,mdl +“/ rl代理人”,obsinfo,Actinfo);
指定自定义重置功能,该功能在该示例结束时定义,可随机化初始水高和需水需求。这样做允许代理接受不同初始水位和每一集的水需求功能培训。
env.resetfcn = @(in)localresetfcn(in);
DQN代理使用评论家Q-Value函数表示来估计长期奖励,给定观察和操作。要创造批评家,首先创建一个深度神经网络。有关创建深度神经网络值函数表示的更多信息,请参阅创建策略和值函数表示。
%修复随机发生器种子以进行再现性。rng (0);
为评论家创造一个深度神经网络。对于此示例,使用非反复性神经网络。使用经常性神经Netwrok,设置useLSTM
至真的
。
USELSTM = FALSE;如果USELSTM图层= [sequentInputlayer(ObsInfo.dimension(1),“名称”那“状态”那“正常化”那“没有任何”)全连接列(32,“名称”那“fc_1”)剥离(“名称”那“relu_body1”)LSTMLAYER(32,“名称”那“lstm”)全连接列(32,“名称”那“fc_3”)剥离(“名称”那“relu_body3”)全连接列(Numel(Actinfo.Elements),“名称”那“输出”)];别的layers = [featureInputLayer(obsInfo.Dimension(1),“名称”那“状态”那“正常化”那“没有任何”)全连接列(32,“名称”那“fc_1”)剥离(“名称”那“relu_body1”)全连接列(32,“名称”那“fc_2”)剥离(“名称”那“relu_body2”)全连接列(32,“名称”那“fc_3”)剥离(“名称”那“relu_body3”)全连接列(Numel(Actinfo.Elements),“名称”那“输出”)];结尾
指定创建评论表示的选项。
批评= rlrepresentationOptions('学习',0.001,'gradientthreshold',1);
使用定义的深度神经网络和选项创建评论表示。
评论家= rlqvaluerepresentation(图表图(图层),obsinfo,Actinfo,......'观察',{'状态'},批评);
要创建代理,首先指定代理选项。如果使用LSTM网络,则将序列长度设置为20.
。
opt = rldqnagentoptions(“SampleTime”,采样时间);如果USELSTM opt.sequencelength = 20;别的opt.sequencelength = 1;结尾opt.DiscountFactor = 0.995;opt.ExperienceBufferLength = 1 e6;opt.EpsilonGreedyExploration.EpsilonDecay = 1 e-5;opt.EpsilonGreedyExploration.EpsilonMin = .02点;
使用定义的选项和批评者表示创建代理。
代理= rldqnagent(批评者,选择);
要训练代理,首先指定训练选项。对于本例,使用以下选项。
运行1000个剧集的培训,每一集持续装天花板(T_max / Ts)
时间步骤。
在Episode Manager对话框中显示培训进度(设置绘图
选项)
指定使用培训的选项rltringOptions.
目的。
训练= rltrainingOptions(......“MaxEpisodes”,1000,......“MaxStepsPerEpisode”,ceil(t_max / sampletime),......'verbose',错误的,......'plots'那'培训 - 进步'那......'stoptrinaincriteria'那'episodecount'那......'stoptriningvalue',1000,......'scoreaveragingwindowlength', 100);
虽然您未为此示例执行此操作时,您可以在培训过程中保存代理。例如,以下选项保存每个代理,奖励值大于或等于-42年
。
如果必要的训练,请使用SaveAgentCriteria保存代理.SaveAgentCriteria ='EpisodeReward';训练.saveagentValue = -42;
训练特工使用火车
功能。培训此代理是一个计算密集型进程,需要几个小时才能完成。要在运行此示例的同时节省时间,请通过设置加载预制代理用圆形
至错误的
。训练代理人,套装用圆形
至真的
。
dotraining = false;如果用圆形%训练代理人。trainingStats =火车(代理,env, trainOpts);别的%加载预磨料的代理。加载(“金宝appSimulinkWaterDistributionDQN.mat”那'代理人')结尾
下图显示了培训进度。
为了验证训练后的药剂的性能,可以在水箱环境中进行模拟。有关代理模拟的更多信息,请参见rlSimulationOptions
和SIM
。
要模拟代理性能,请通过切换手动交换机块来连接RL代理块。
set_param(mdl +“/手动开关”那'SW'那'0');
设置每个Simulaiton的最大步数和模拟数量。对于此示例,运行30次模拟。环境复位功能在每个模拟中设置不同的初始水高度,水需求不同。
numsimulations = 30;simoptions = rlsimulation选项(“MaxSteps”,t_max / sampletime,......'numsimulations',麻痹);
要在相同条件下将代理与基线控制器进行比较,请重置环境复位功能中使用的初始随机种子。
env。ResetFcn (“重置种子”);
模拟代理人反对环境。
经验丰富的qn = sim(env,代理,simoptions);
要将DQN代理与基线控制器进行比较,您必须使用相同的模拟选项和复位功能的初始随机种子模拟基线控制器。
启用基线控制器。
set_param(mdl +“/手动开关”那'SW'那'1');
要在相同条件下将代理与基线控制器进行比较,请重置环境复位功能中使用的随机种子。
env。ResetFcn (“重置种子”);
模拟基线控制器免受环境。
MacusingBaseline = SIM(ENV,Agent,SimOptions);
初始化代理和基线控制器的累积奖励结果向量。
结果vectordqn = zeros(Numsimulations,1);结果vectorbaseline = zeros(Numsimulations,1);
计算代理和基线控制器的累计奖励。
为了ct = 1: numsimulation resultVectorDQN(ct) = sum(experienceDQN(ct).Reward);resultVectorBaseline (ct) =总和(experienceBaseline (ct) .Reward);结尾
绘制累积奖励。
绘图([ResultVectordQn结果vectorbaseline],“o”)设置(GCA,'xtick',1:numsimulations)xlabel(“模拟号码”)ylabel(“累积奖励”) 传奇('dqn'那'基线'那'地点'那“东北朝”)
代理商获得的累积奖励始终如一左右-40。该值远大于基线控制器获得的平均奖励。因此,DQN Agent在节能方面始终如一地优于基线控制器。
水需求功能
功能[waterdemand,t_max] =生成海拉德姆和(num_days)t = 0 :( num_days * 24)-1;%小时t_max = t(结束);需求_mean = [28,28,28,45,55,110,280,450,310,170,160,145,130,......150,165,155,170,265,360,240,120,83,45,28]';%m ^ 3 / hr需求= repmat(demand_mean,1,num_days);需求=需求(:);%增加了噪音a = -25;%m ^ 3 / hrB = 25;%m ^ 3 / hrdesight_noise = a +(b-a)。* rand(numel(需求),1);waterdemand = timeereries(需求+需求_noise,t);waterdemand.name =“水需求”;结尾
重置功能
功能在= localresetfcn(in)%使用一个持久性随机种子值来评估代理和基线%控制器在相同的条件下。执着的随机如果isempty(随机)随机= 0;结尾如果Strcmp(在,“重置种子”)随机= 0;返回结尾随机=随机+ 1;RNG(随机)%随机化水需求。num_days = 4;h_max = 7;[waterdemand,〜] =生成waterdemand(num_days);Assivein(“基地”那“WaterDemand”,waterdemand)%随机化初始高度。H0 = 3 * RANDN;尽管h0 <= 0 b0 b0 b0 b0 = 0 b0 b0 b0 b0 = 0;结尾BLK ='Watertankscheding /水箱系统/初始水高';在= setBlockParameter(IN,BLK,'价值',num2str(h0));结尾