输入坐标是什么在RL环境中当使用RL设计师?

1视图(30天)
我已经创建了一个自定义环境,混合动力汽车模拟驾驶。在我定义的属性参数,我使用。在阶跃函数,我使用字符串名称和保存一些文件供以后分析。观察和行为是纯粹的数字和连续的。
当我试着培养一个代理在我的环境中,我得到一个错误,说:“无效的设置:所有输入坐标必须具有相同的类型。类型的输入坐标必须双或单。”
我知道双和单身意味着我知道如何定型,但是我真的不理解输入坐标。他们不管我定义我的环境(如属性,观察,动作…)还是我选择的输入,对于学习速率,停止标准(等等…)我的代理商吗?
我可以验证环境没有任何错误,但我不能训练一个代理,因为错误。
我可以把我的下面环境代码,也许有助于了解我要做的。
我调用的函数内的阶跃函数定义在我的matlab文件夹,因为他们无法找到当我定义在方法部分的脚本。也许RL设计师不能找到他们,错误的原因是什么?
谢谢你的帮助!
classdef环境< rl.env.MATLABEnvironment
%环境:定义定制的模板在MATLAB环境。
% %属性(设置属性的相应属性)
属性
t = 1;
周期= 0 (6,1);
cyclename = 0;
sigma_0 = 0;
last_ess = 0;
P_batt_10 = 0 (10);
结束
属性(常量)
模式= 1;%选择模式与ecm(1)或者直接确定扭矩分裂(2)。
%在构造函数也必须改变!
根据dr1 =负载(“根据dr1”);
dr2 =负载(“dr2”);
%齿轮比率
i_gear = (5.354, 3.243, 2.252, 1.636, 1.211, 1.000, 0.865, 0.717, 0.601);
%最终传动比
i_final = 3.07;
%的质量因素
k_m = (1.32, 1.16, 1.11, 1.08, 1.07, 1.07, 1.07, 1.06, 1.06);
% [W]马克斯电机功率
P_e = 25000;
% [W]马克斯电池供电
P_batt_max = 33000;
%滚动阻力系数
f_roll = 0.011;
%(公斤)车辆质量
m = 1625;
%(公斤)额外的质量
m_a = 0;
% (m / s ^ 2)重力加速度
g = 9.81;
%(公斤/ m ^ 3)空气密度在20°C
rho_air = 1.2;
% (m ^ 2)空气阻力系数乘以面积
cda = 0.54;
% [m]轮半径
r_wheel = 0.32;
% [W]依附的力量
P_att = 800;
%动力传动系统效率
eff_dt = 0.9;
% (J /公斤)燃料热值较低
H_f = 42.5 e + 6;
%(公斤/ J]互惠燃料热值较低
e_ICE = 2.35294 e-8;
%的电池效率
eff_bat = 0.95;
% SOC列表
soc_list = [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0);
%(作为)电池容量
Q_b = 20 * 3600;
%(欧姆)电池的内部电阻
R_int = 0.334/20;
% [V]开路电压的SOC SOC列表
V_oc = (37.78, 45.30, 46.01, 46.56, 46.94, 47.38, 48.00, 48.78, 49.68, 50.66, 51.74);
%参考SOC
SOC_ref = 0.55;
%最小SOC
SOC_min = 0.3;
%最大SOC
SOC_max = 0.8;
% (rad / s)冰速度(0.10472 = 2π/ 60)列表
w_ICE_list = 0.10472 * (1100, 1500, 2000, 2500, 3000, 3500, 4000, 4500, 5000, 5500, 6000, 6300];
% (Nm)冰扭矩列表
t_ICE_list = [0, 30、50、70、90, 110, 130, 150, 170, 190, 210, 230, 250, 270, 290, 310, 330, 350];
%地图w_ICE和t_ICE冰效率
eff_ICE_table = 0.01 * (
0.01 21.18 26.06 28.71 30.80 32.33 33.35 34.16 34.57 34.16 33.22 32.70 32.21 31.96 31.96 31.96 31.96 31.96
0.01 21.18 26.47 29.72 31.84 33.09 34.16 34.86 35.29 35.00 35.00 34.72 34.02 33.22 32.96 32.33 32.21 32.09
0.01 21.18 26.47 29.72 31.73 32.96 34.02 34.86 35.29 35.29 35.29 35.29 35.15 34.72 34.16 33.48 33.22 33.09
0.01 21.18 26.47 29.41 31.61 32.83 34.02 34.86 35.29 35.29 35.29 35.29 35.29 35.00 34.57 34.29 34.02 33.48
0.01 20.17 25.67 28.42 30.91 32.33 33.48 34.29 35.00 35.29 35.29 35.29 35.29 34.86 34.29 33.88 32.58 32.21
0.01 20.17 25.29 28.24 30.36 31.84 32.83 33.75 34.29 34.72 34.86 34.72 34.43 33.88 33.22 32.33 31.37 30.25
0.01 20.17 24.20 27.50 29.41 30.80 31.73 32.70 33.35 33.88 33.88 33.35 32.58 32.58 31.84 30.80 30.04 29.72
0.01 18.82 23.53 26.47 28.52 29.72 30.80 31.61 31.73 31.61 31.26 31.37 31.14 31.26 30.47 30.04 29.72 29.72
0.01 18.82 23.21 25.51 27.32 28.52 29.72 30.25 30.36 30.25 30.04 30.04 29.62 29.51 29.41 29.41 29.41 29.41
0.01 18.82 21.44 24.20 26.22 27.50 28.62 28.62 28.52 28.52 28.52 28.42 28.52 28.71 28.71 28.71 28.71 28.71
0.01 18.82 20.17 23.02 24.62 25.67 26.31 26.64 26.64 25.82 25.51 24.55 24.55 24.55 24.55 24.55 24.55 24.55
0.01 18.82 20.17 22.00 23.33 24.20 24.91 25.29 25.67 24.91 24.20 24.20 24.20 24.20 24.20 - 24.20 24.20 - 24.20);
%(公斤/ s)消费率w_ICE和t_ICE地图
consrate_ICE_table = cell2mat (struct2cell(负载(“consrate_ICE_table”)));
% (rad / s)冰拖速度列表
w_ICE_drag_list = 0.10472 * (0, 1000, 2000, 3000, 4000, 5000, 6000];
% (Nm)冰阻力矩列表
t_ICE_drag_list = (6.3, 6.3, 8.4, 10.7, 13.1, 17.0, 20.7);
% (rad / s)电机速度列表
w_em_list = 0.10472 * (0, 500, 1000, 1500, 2000, 2500, 3000, 3500, 4000, 4500, 5000, 5500, 6000];
% (Nm)电机转矩列表
t_em_list = 25000/40000 * (-260, -230, -200, -170, -140, -110, -80, -50, -20, -11, 5、0、5、10、20、50, 80, 110, 140, 170, 200, 230, 260];
%地图w_em和t_em电机效率
eff_em_table = 0.01 * (
0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 50.0 50.0 50.0 50.0 50.0 50.0 50.0 50.0 50.0 50.0 50.0 50.0
0.01 10.0 25.0 40.0 62.0 73.6 80.0 85.0 85.0 80.0 70.0 50.0 70.0 80.0 85.0 86.0 82.5 78.7 74.6 71.6 68.8 66.4 64.8
70.0 73.2 77.0 80.0 83.5 86.5 89.4 91.5 90.0 85.0 70.0 50.0 70.0 82.0 90.0 91.6 90.0 87.5 85.5 83.1 81.1 78.8 76.4
80.4 82.2 84.5 86.4 88.3 90.3 91.7 93.0 90.0 83.0 70.0 50.0 70.0 82.0 90.0 92.9 92.3 91.2 89.5 87.5 86.3 85.0 84.0
84.5 86.1 87.8 89.5 91.1 92.7 94.0 94.2 92.0 87.0 70.0 50.0 70.0 85.0 91.2 94.0 93.1 92.2 90.9 59.5 88.0 88.0 88.0
89.5 89.5 89.5 91.0 92.4 93.8 94.5 94.7 93.0 89.0 70.0 50.0 70.0 85.0 91.0 93.4 93.1 92.2 91.0 90.0 90.0 90.0 90.0
91.5 91.5 91.5 91.5 92.8 94.1 94.8 95.3 93.0 88.0 70.0 50.0 70.0 84.0 90.5 93.1 92.8 92.1 91.0 91.0 91.0 91.0 91.0
92.8 92.8 92.8 92.8 92.8 94.1 95.0 95.7 92.7 87.0 70.0 50.0 70.0 82.0 90.0 92.7 92.4 91.8 91.8 91.8 91.8 91.8 91.8
92.6 92.6 92.6 92.6 92.6 93.8 94.7 95.3 92.0 85.0 70.0 50.0 70.0 81.0 89.0 92.2 92.0 91.0 91.0 91.0 91.0 91.0 91.0
93.2 93.2 93.2 93.2 93.2 93.2 94.3 94.7 92.0 85.0 70.0 50.0 70.0 80.0 87.5 91.6 91.0 91.0 91.0 91.0 91.0 91.0 91.0
93.0 93.0 93.0 93.0 93.0 93.0 94.0 94.4 90.4 82.0 70.0 50.0 70.0 80.0 86.5 91.0 90.5 90.5 90.5 90.5 90.5 90.5 90.5
93.5 93.5 93.5 93.5 93.5 93.5 93.5 93.8 90.0 82.0 70.0 50.0 70.0 78.0 85.6 90.3 90.0 90.0 90.0 90.0 90.0 90.0 90.0
92.8 92.8 92.8 92.8 92.8 92.8 92.8 93.0 90.0 80.0 70.0 50.0 70.0 75.0 85.0 88.0 88.0 88.0 88.0 88.0 88.0 88.0 88.0
];
结束
属性
%初始化系统状态(v,α,齿轮,soc,σ,t_ICE)”
1)状态= 0(7日
结束
属性(访问=保护)
%初始化内部标记来表示事件终止
结束= false
结束
% %的必要方法
方法
% Contructor环境的方法创建一个实例
%改变类名和相应的构造函数的名字
函数这个环境= ()
模式= 1;%选择模式与ecm (ecm)或直接确定扭矩分裂(“torquesplit”)
开关模式
情况下1
%初始化设置观察
7 ObservationInfo = rlNumericSpec ([1]);
ObservationInfo。Name =“车辆状态”;
ObservationInfo。描述=“v,α,齿轮,soc,σ,t_ICE”;
%初始化动作设置
2 ActionInfo = rlNumericSpec ([1],“LowerLimit”0,“UpperLimit”1);
ActionInfo。Name =“车辆行动”;
ActionInfo。描述=“λ,σ”;
情况下2
%初始化设置观察
7 ObservationInfo = rlNumericSpec ([1]);
ObservationInfo。Name =“车辆状态”;
ObservationInfo。描述=“v,α,齿轮,soc,σ,t_ICE”;
%初始化动作设置
2 ActionInfo = rlNumericSpec ([1],“LowerLimit”0,“UpperLimit”1);
ActionInfo。Name =“车辆行动”;
ActionInfo。描述=“冰扭矩,σ”;
结束
%以下行实现RL env的内置函数
这= this@rl.env.MATLABEnvironment (ObservationInfo ActionInfo);
%初始化属性值和pre-compute必要的值
% updateActionInfo(这个);
结束
%应用系统动力学和模拟环境
%一步行动。
函数(观察、奖励、结束,LoggedSignals) =一步(这个动作)
LoggedSignals = [];
v = this.State (1);
一个= this.State (2);
α= this.State (3);
齿轮= this.State (4);
soc = this.State (5);
lastsigma = this.State (6);
lastt_ICE = this.State (7);
开关this.mode
情况下1
%计算行驶阻力
[F_w, w_wheel w_crank t_crank] = getresistance (v,α,齿轮);
% ecm
λ=行动(1);%等效系数
σ=圆(Action (2));%冰开/关
[t_em_opt, fuel_opt w_ICE、t_ICE sigmapenalty] = ecm (t_crank w_crank,λ,σ,soc);
%计算新的SOC
[volt, P_em P_bat、I_b newsoc] = getnewsoc (soc, t_em_opt w_crank);
%保存变量
ecmsresults.v (this.t) = v;
ecmsresults.a (this.t) = a;
ecmsresults.alpha (this.t) =α;
ecmsresults.gear (this.t) =齿轮;
ecmsresults.soc (this.t) = soc;
ecmsresults.F_w (this.t) = F_w;
ecmsresults.w_crank (this.t) = w_crank;
ecmsresults.t_crank (this.t) = t_crank;
ecmsresults.t_em_opt (this.t) = t_em_opt;
ecmsresults.w_ICE (this.t) = w_ICE;
ecmsresults.t_ICE (this.t) = t_ICE;
ecmsresults.fuel_opt (this.t) = fuel_opt;
ecmsresults.volt (this.t) =伏特;
ecmsresults.P_em (this.t) = P_em;
ecmsresults.P_bat (this.t) = P_bat;
ecmsresults.I_b (this.t) = I_b;
ecmsresults.lambda (this.t) =λ;
ecmsresults.sigma (this.t) =σ;
文件名=“博士”+。cyclename +“.ecmsresults.mat”;
保存(文件名,“ecmsresults”)
%计算奖励
delta_ess =σ- lastsigma;
如果delta_ess = = 0
这一点。last_ess =。last_ess + 1;
elseifabs (delta_ess) = = 1
这一点。last_ess = 0;
结束
k = 10:1:2%将旧电池功率值1步
this.P_batt_10 (k) = this.P_batt_10 (k - 1);
结束
this.P_batt_10 (1) = P_bat;%保存电池阵列的价值
奖励= getrewardecms(σ,sigmapenalty、w_ICE t_ICE, delta_ess,。last_ess、soc this.P_batt_10);
如果这一点。t <长度(this.cycle.v)
new_t =。t + 1;
这一点。t = new_t;
这一点。结束= false;
elseif这一点。t = =长度(this.cycle.v)
这一点。结束= true;
结束
v = this.cycle.v (this.t);
一个= this.cycle.a (this.t);
α= this.cycle.alpha (this.t);
齿轮= this.cycle.gear (this.t);
观察= [v;一个;α;齿轮;newsoc;σ;t_ICE];
这一点。状态=观察;
情况下2
%计算行驶阻力
[F_w, w_wheel w_crank t_crank] = getresistance (v,α,齿轮);
% (Nm)马克斯电机转矩(供电模式)
T_e_maxp = min(环境。P_e / 40000 * 260, Environment.P_e / w_crank);
% (Nm)马克斯电机转矩(生成模式)
T_e_maxg = min(环境。P_e / 50000 * 260, 1.25 * Environment.P_e / w_crank);
% (Nm)冰阻力矩
t_ICE_drag = interp1 (Environment.w_ICE_drag_list Environment.t_ICE_drag_list w_crank,“线性”,“extrap”);
σ=圆(Action (2));%冰开/关
sigmapenalty = 0;
如果t_crank > T_e_maxp & &(σ)= = 0%曲柄扭矩高于最大电磁转矩和冰放假不可行EM状态。
σ= 1;
sigmapenalty = 1000;
结束
% (Nm)马克斯冰扭矩
如果σ= = 1
w_ICE = max (w_crank, 0.10472 * 1100);
如果w_ICE < 0.10472 * 1250
t_ICE_max = (lastt_ICE + 350 - 5.41 * (0.10472 * 1250 - w_ice)) / 2;
elseifw_ICE > = 0.10472 * 1250 & & w_ICE < 0.10472 * 4000
t_ICE_max = (lastt_ICE + 350) / 2;
其他的
t_ICE_max = (lastt_ICE + 350 - 0.54 * (w_ice - 0.10472 * 4000)) / 2;
结束
elseifσ= = 0
w_ICE = 0;
t_ICE_max = 0;
结束
% % (Nm)分钟冰扭矩
%如果t_crank < T_e_maxp——t_ICE_drag
% t_ICE_min = 0;
% elseif t_crank < T_e_maxp
% t_ICE_min = 1;
其他的%
% t_ICE_min = t_crank - T_e_maxp;
%结束
t_em = - T_e_maxg +行动(1)* (T_e_maxp + T_e_maxg);% (Nm)电磁转矩(由代理)
%修改发动机转速在分钟。1100 rpm供电
%,w_crank < 1100 rpm,离合器滑
w_ICE =σ*马克斯(0.10472 * 1100,w_crank);
如果σ= = 1%和连接到动力上的冰
如果t_em < t_crank%冰必须传递转矩的不同
t_ICE = min (t_crank - t_em t_ICE_max);% (Nm)冰扭矩限制最大冰扭矩
t_em_opt = t_crank - t_ICE;% (Nm)最佳的电磁转矩
elseift_em > = t_crank & & t_em < = t_crank + t_ICE_drag%冰不传递转矩。阻力矩
t_em_opt = t_crank + t_ICE_drag;% (Nm)优化电磁转矩(更正:t_em t_crank之间不能和t_crank + t_ICE阻力,奖励的小惩罚函数)
t_ICE = 0;% (Nm)冰扭矩。如果消极、机械使用刹车
elseift_em > = t_crank & & t_em > t_crank + t_ICE_drag%冰不传递转矩。阻力矩了。
t_em_opt = t_em;% (Nm)电磁转矩(高于t_crank + t_drag。不受欢迎的,但不是不可行。大惩罚奖励函数)
t_ICE = t_crank - t_em_opt;% (Nm)冰扭矩(负的,参见上面的线。机械刹车和EM同时使用。大惩罚奖励函数)
结束
elseifσ= = 0%的冰和断开动力
如果t_em < = t_crank
t_em_opt = t_crank;% (Nm)优化电磁转矩(更正:必须至少t_crank)
t_ICE = 0;% (Nm)冰扭矩(:制动转矩)
elseift_em > t_crank
t_em_opt = t_em;% (Nm)电磁转矩(高于t_crank。不受欢迎的,但不是不可行。大惩罚奖励函数)
t_ICE = t_crank - t_em_opt;% (Nm)冰扭矩(负的,参见上面的线。机械刹车和EM同时使用。大惩罚奖励函数)
结束
结束
%计算目前的燃料消耗
如果σ= = 1 & & t_ICE > 0
fuel_opt =环境。e_ICE * w_ICE * t_ICE / interp2(环境。t_ICE_list,环境。w_ICE_list,环境。eff_ICE_table、t_ICE w_ICE);
其他的
fuel_opt = 0;
结束
%计算新的SOC
[volt, P_em P_bat、I_b newsoc] = getnewsoc (soc, t_em_opt w_crank);
%保存变量
torquesplitresults.v (this.t) = v;
torquesplitresults.a (this.t) = a;
torquesplitresults.alpha (this.t) =α;
torquesplitresults.gear (this.t) =齿轮;
torquesplitresults.soc (this.t) = soc;
torquesplitresults.sigma (this.t) =σ;
torquesplitresults.t_ICE (this.t) = t_ICE;
torquesplitresults.F_w (this.t) = F_w;
torquesplitresults.w_crank (this.t) = w_crank;
torquesplitresults.t_crank (this.t) = t_crank;
torquesplitresults.t_em_opt (this.t) = t_em_opt;
torquesplitresults.w_ICE (this.t) = w_ICE;
torquesplitresults.fuel_opt (this.t) = fuel_opt;
torquesplitresults.volt (this.t) =伏特;
torquesplitresults.P_em (this.t) = P_em;
torquesplitresults.P_bat (this.t) = P_bat;
torquesplitresults.I_b (this.t) = I_b;
文件名=“博士”+。cyclename +“.torquesplitresults.mat”;
保存(文件名,“torquesplitresults”)
%计算奖励
delta_ess =σ- lastsigma;
如果delta_ess = = 0
这一点。last_ess =。last_ess + 1;
elseifabs (delta_ess) = = 1
这一点。last_ess = 0;
结束
k = 10:1:2%将旧电池功率值1步
this.P_batt_10 (k) = this.P_batt_10 (k - 1);
结束
this.P_batt_10 (1) = P_bat;%保存电池阵列的价值
奖励= getrewardts(σ,sigmapenalty、w_ICE t_ICE, t_em, t_em_opt, delta_ess,。last_ess、soc this.P_batt_10);
如果这一点。t <长度(this.cycle.v)
new_t =。t + 1;
这一点。t = new_t;
这一点。结束= false;
elseif这一点。t = =长度(this.cycle.v)
这一点。结束= true;
结束
v = this.cycle.v (this.t);
一个= this.cycle.a (this.t);
α= this.cycle.alpha (this.t);
齿轮= this.cycle.gear (this.t);
观察= [v;一个;α;齿轮;newsoc;σ;t_ICE];
这一点。状态=观察;
结束
结束
%重置环境初始状态和输出初步观察
函数[InitialObservation t周期,cyclename] =重置(这)
这一点。t = 1;
n =国防部(圆(1200000 *兰德(1)),12);
开关n
情况下1
这一点。周期= this.dr1.dr1.dr1_1;
这一点。cyclename = 101;
情况下2
这一点。周期= this.dr1.dr1.dr1_3;
这一点。cyclename = 103;
情况下3
这一点。周期= this.dr1.dr1.dr1_4;
这一点。cyclename = 104;
情况下4
这一点。周期= this.dr1.dr1.dr1_5;
这一点。cyclename = 105;
情况下5
这一点。周期= this.dr1.dr1.dr1_6;
这一点。cyclename = 106;
情况下6
这一点。周期= this.dr1.dr1.dr1_7;
这一点。cyclename = 107;
情况下7
这一点。周期= this.dr1.dr1.dr1_8;
这一点。cyclename = 108;
情况下8
这一点。周期= this.dr1.dr1.dr1_9;
这一点。cyclename = 109;
情况下9
这一点。周期= this.dr1.dr1.dr1_11;
这一点。cyclename = 111;
情况下10
这一点。周期= this.dr1.dr1.dr1_12;
这一点。cyclename = 112;
情况下11
这一点。周期= this.dr1.dr1.dr1_13;
这一点。cyclename = 113;
情况下12
这一点。周期= this.dr1.dr1.dr1_14;
这一点。cyclename = 114;
结束
v = (this.cycle.v (1));
= (this.cycle.a (1));
α= (this.cycle.alpha (1));
齿轮= (this.cycle.gear (1));
soc = (this.SOC_ref);%随机SOC在0.3和0.8之间在每个周期的开始
σ= 0;%从冰了
t_ICE = 0;%从冰了
这一点。P_batt_10 = (0 (10));
InitialObservation = [v;一个;α;齿轮;soc;σ;t_ICE];
这一点。状态= InitialObservation;
这一点。t = 1;
%(可选)使用notifyEnvUpdated信号
%的环境已经更新(例如更新可视化)
% notifyEnvUpdated(这个);
结束
结束
% %可选方法(设置相应方法的属性)
方法(访问=公共)
结束
方法(访问=保护)
%(可选)更新可视化每次更新的环境
% (notifyEnvUpdated)
%函数envUpdatedCallback(这)
%结束
结束
结束

答案(0)