此示例说明了如何学习使用加强学习(RL)的用于分配系统的最佳泵调度策略。
下图显示了配水系统。
在这里:
是从蓄水池中供给水箱的水量。
是流出罐以满足使用需求的水量。
强化学习代理的目标是调度运行的泵的数量,以最小化系统的能源使用并满足使用需求( ).储罐系统的动力学由以下方程式控制。
在这里, 和 . 24小时内的需求是时间的函数,如下所示:
在哪里 是预期的需求和需求 表示从均匀随机分布中采样的需求不确定性。
供应量由运行的泵数量决定, 根据下面的映射。
为了简化问题,将功耗定义为运行的泵数量, .
以下功能是此环境的奖励。为避免溢出或清空罐,如果水高度接近最大或最小水平,则增加额外的成本, 或 分别地
要根据所考虑的天数生成和分析需水量概况,请使用generateWaterDemand
此示例结束时定义的功能。
num_days = 4;%天数[需水量,T_max]=发电需水量(num_天);
查看需求配置文件。
情节(WaterDemand)
打开配电系统Simulink模型。金宝app
mdl =“watertankscheduling”;开放式系统(mdl)
除了钢筋学习代理之外,在控制法MATLAB功能块中定义了一个简单的基线控制器。该控制器根据水位激活一定数量的泵。
指定初始水高。
h0=3;%M.
指定模型参数。
SampleTime = 0.2;H_max = 7;%Max Tank Height(M)a_tank = 40;%水箱面积(m^2)
要为Simulink模型创建一个环境接口,首先定义动作和观察规范,金宝appactInfo
和obsInfo
分别地代理操作是所选泵数。代理观察是水高,测量为连续时间信号。
Actinfo = rlfinitesetspec([0,1,2,3]);Obsinfo = rlnumericspec([1,1]);
创建环境接口。
env = rl金宝appSimulinkEnv (mdl mdl +“/ RL代理”,obsInfo,actInfo);
指定一个自定义的重置函数(在本例的最后定义),它将随机化初始水位和需水量。这样做可以让代理在不同的初始水位和每一集的水需求函数上接受训练。
env.ResetFcn=@(in)localResetFcn(in);
DQN代理使用批评家Q值函数表示,在给定观察和行动的情况下,近似长期奖励。要创建批评家,首先创建一个深度神经网络。有关创建深度神经网络值函数表示的更多信息,请参见创建策略和价值功能表示.
%修复随机发生器种子的再现性。RNG(0);
为评论家创建一个深度神经网络。对于本例,使用非递归神经网络。要使用递归神经网络,请设置USELSTM
来真正的
.
useLSTM=false;如果useLSTM layers = [sequenceInputLayer(obsInfo.Dimension(1)),“姓名”,“国家”,“正常化”,“没有”)完全连接层(32,“姓名”,“fc_1”)雷卢耶(“姓名”,“relu_body1”) lstmLayer (32,“姓名”,“lstm”)完全连接层(32,“姓名”,“fc_3”)雷卢耶(“姓名”,“relu_body3”) fullyConnectedLayer(元素个数(actInfo.Elements),“姓名”,“输出”)];其他的图层= [featureInputlayer(ObsInfo.dimension(1),“姓名”,“国家”,“正常化”,“没有”)完全连接层(32,“姓名”,“fc_1”)雷卢耶(“姓名”,“relu_body1”)完全连接层(32,“姓名”,“fc_2”)雷卢耶(“姓名”,“relu_body2”)完全连接层(32,“姓名”,“fc_3”)雷卢耶(“姓名”,“relu_body3”) fullyConnectedLayer(元素个数(actInfo.Elements),“姓名”,“输出”)];终止
指定创建批读表示的选项。
criticOpts=rlRepresentationOptions(“LearnRate”, 0.001,“梯度阈值”,1);
使用定义的深度神经网络和选项创建批评批评。
评论家= rlQValueRepresentation (layerGraph(层),obsInfo, actInfo,...“观察”, {“国家”},批判者);
要创建代理,请先指定代理选项。如果您使用的是LSTM网络,请将序列长度设置为20.
.
选择= rlDQNAgentOptions ('采样时间',采样时间);如果useLSTM opt.SequenceLength = 20;其他的opt.SequenceLength = 1;终止opt.discountfactor = 0.995;opt.periencebufferlength = 1e6;opt.epsilongredyexpliation.epsilondecay = 1e-5;opt.epsilongredyexpliation.epsilonmin = .02;
使用定义的选项和批评家表示创建代理。
代理=rlDQNAgent(批评家,opt);
要培训代理,首先指定培训选项。对于此示例,请使用以下选项。
进行1000集的训练,每集持续时间为CEIL(T_MAX / TS)
时间步长。
在“插曲管理器”对话框中显示培训进度(设置情节
选项)
指定使用RL培训选项
对象。
培训选项=RL培训选项(...'maxepisodes', 1000,...'maxstepperepisode'装天花板(T_max / SampleTime),...“详细”假的,...“情节”,“训练进步”,...“停止培训标准”,“EpisodeCount”,...“停止训练值”, 1000,...“ScoreAveragingWindowLength”,100);
虽然在本例中不需要这样做,但您可以在培训过程中保存代理。例如,以下选项将保存每个奖励值大于或等于的代理-42
.
如有必要,使用SaveAgentCriteria保存代理培训。SaveAgentCriteria='eposodereward';trainOpts.SaveAgentValue=-42;
使用该代理商培训火车
函数。训练这个代理是一个计算密集型的过程,需要几个小时才能完成。为了节省运行此示例的时间,请通过设置加载预先训练过的代理溺爱
来错误的
.要亲自培训特工,请设置溺爱
来真正的
.
doTraining = false;如果溺爱培训代理商。Trainstats =火车(代理,env,训练);其他的%加载示例的预训练代理。负载('金宝appsimulinkwaterdistributiondqn.mat',“代理”)终止
下图显示了培训进度。
为了验证培训的代理的性能,在水箱环境中模拟它。有关代理模拟的更多信息,请参阅RlsimulationOptions.
和模拟
.
为了模拟代理性能,通过拨动手动开关块连接RL代理块。
设置参数(mdl+“/手动开关”,“西南”,'0');
设置每个模拟的最大步骤数和模拟的数量。对于本例,运行30个模拟。环境复位函数设置了不同的初始高度,每次模拟的需水量也不同。
NumSimulations = 30;simOptions = rlSimulationOptions ('maxsteps'T_max / SampleTime...“NumSimulations”, NumSimulations);
要在相同条件下将代理与基线控制器进行比较,请重置环境重置功能中使用的初始随机种子。
env.resetfcn(“重置种子”);
模拟反对环境的代理。
experienceDQN = sim (env,代理,simOptions);
要将DQN代理与基线控制器进行比较,必须使用相同的模拟选项和初始的重置函数随机种子来模拟基线控制器。
启用基线控制器。
设置参数(mdl+“/手动开关”,“西南”,'1');
要在相同条件下将代理与基线控制器进行比较,请重置环境重置功能中使用的随机种子。
env.resetfcn(“重置种子”);
根据环境模拟基线控制器。
体验基线=sim(环境、代理、simOptions);
初始化代理和基线控制器的累积奖励结果向量。
resultVectorDQN=0(数值模拟,1);resultVectorBaseline=0(数值模拟,1);
计算代理和基线控制器的累积奖励。
对于CT = 1:NUMSIMULATIANTY RESULTVECTORDQN(CT)= SUM(经验丰富的QN(CT).REWARD);结果vectorbaseline(ct)= sum(经验绑定(CT).Reward);终止
绘制累积奖励。
情节([resultVectorDQN resultVectorBaseline),'o')set(gca,“xtick”1: NumSimulations)包含(“模拟数字”) ylabel ('累积奖励')传说(“DQN”,“基线”,“位置”,“东北外”)
代理人获得的累积报酬始终在-40左右。这个值远远大于基线控制器获得的平均奖励。因此,DQN代理在节能方面始终优于基线控制器。
需水量函数
作用[WaterDemand,T_max] = generateWaterDemand(num_days) t = 0:(num_days*24)-1;%的人力资源T_max = t(结束);Demand_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 /人力资源需求=repmat(需求平均值,1,天数);需求=需求(:);%增加需求一个= -25;% m ^ 3 /人力资源b=25;% m ^ 3 /人力资源/ /要求噪声= a + (b-a).*rand(numel(Demand),1);WaterDemand = timeseries(Demand + Demand_noise,t);WaterDemand。Name =“水需求”;终止
重置功能
作用= localResetFcn(中)%使用持续的随机种子值来评估代理和基线%控制器在相同条件下。持久的随机如果isempty(randomSeed) randomSeed = 0;终止如果比较字符串(在“重置种子”) randomSeed = 0;回来终止randomSeed = randomSeed + 1;rng (randomSeed)%随机化水需求。num_days=4;H_max=7;[需水量,~]=发电需水量(num_days);分配('根据','waterdemand',需水量)%随机初始高度。h0=3*randn;虽然H0 <= 0 ||H0> = = H_MAX H0 = 3 * RANDN;终止黑色=“水箱调度/水箱系统/初始水位”;in=参数(in,blk,“价值”,num2str(h0));终止