Fantomeworking/DQN-Water-temperature-regulation
Folders and files
| Name | Name | Last commit date | ||
|---|---|---|---|---|
Repository files navigation
目标:在一个指定容器注满水的过程中保持温度恒定在一个位置上,且尽量缩短注满时间
全局水容量单位:升
全局质量单位:kg
全局温度单位:摄氏度
循环次数:150升上限 or 限定循环次数
热水:输入上限:每次1L;初始值:1/3升
冷水:输入上限:每次1.5L;初始值:1/3升
容器内水温自然下降:每次0.2°
计算一次所用时间不定,模型中假设:单位次数时间为10秒,最大通过流量0.15L/s,每次改变流量1/36L
计算传感器:初始热水温度,冷水温度
偏差修正:未实装
需要传感器:容器水量传感器;容器水温传感器;冷、热水流量传感器;
密度公式:
rou = -3.84e-06 * t ** 2 - 4.791e-05 * t + 1#t表示温度,单位摄氏度
水混合后温度公式:
T=(M_1*t1 + M_2*t2) / (M_1 + M_2)#M:表示质量,单位千克、t表示温度,单位摄氏度
水体混合先有冷热水混合,再用混合后的水与容器内水温混合
r值计算: r1=np.sqrt(((self.T_now-42))**2) #r越接近42度越低
r2=np.sqrt(Water_out) #溢出水量越少r越小
r3=np.sqrt(((self.L_now/10-15))**2) #水量未满前越少r越大
r4=4/L #水流量越大越好
(程序中只选了r1+r2+r4)
网络:
dqn1:net.out*2
net(
(fc1): Linear(in_features=6, out_features=10, bias=True)
(out): Linear(in_features=10, out_features=4, bias=True)
)
dqn2:net*2
net(
(fc1): Linear(in_features=4, out_features=10, bias=True)
(out): Linear(in_features=10, out_features=2, bias=True)
)
输入,6个状态:热、冷水流量、温度 and 容器内水温、水量
输出,因为冷热水的增减可以同时工作,相互独立,所以输出动作2*3个:加、减热水和不变 or 加、减冷水和不变
加速器:Adam
损失函数:MSELoss
(但是我写不来双输出的神经网络,文件里写了两种运行方案)
dqn1:同一个网络,同一种输入,计算两个输出。
缺点:因为同一种输入,两个输出经常会相同起来,导致前期温度突然上升过高时,下降曲线过长,
具体原因有可能与水流量决定的R值权重较大有关。单看效果,emmm~~还不错。
优点:没有特定设立供水量不变的动作,因为加减同一种量的水可能同时出现,可以出现水量不变的情况
dqn2:同一种网络,分两个输入,计算两个输出。
优点:相当于设定了两个网络,独立训练独立输出,同时互相影响
缺点:两个网络的内存占用会稍大一点
结果表达方式:
为更好的呈现结果,结果的可视化,稍有不同分入dqn1和dqn2中,看你的喜欢了
图一:最优训练结果温度变化曲线
低温时期:[0-41)度,蓝色
适合时期:[41-43]度,绿色
高温时期:[43-)度,红色
图二:最优训练结果温R值变化曲线,越小越好
图三:训练次数内训练结果曲线,越小对应的训练结果越好
图四:最优训练结果的冷热水流量变化曲线,红色:热水;蓝色:冷水
选取一个最优的训练结果:
由41-43度判断,在41-43度区间内,点数量最多,也就是时间最多的为最优解。
综合的结果判断:
Dqn模型判断:由R来看,结果模型难以出现一个学习的情况往往是在一个水平线上徘徊,偶尔出现一个好的情况,可以说是很糟糕了。
由温度曲线来看,优秀的结果还是有的,水温一开始高速上升到42附近,然后没有止住势头继续上升,在回落,稳定。