env_params.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. """
  2. env_params.py
  3. 超滤(UF)强化学习环境的参数定义文件。
  4. 本文件集中定义 UF 强化学习环境中使用的所有【参数类(Parameter Schemas)】。
  5. 这些类仅用于描述系统配置、状态语义和约束边界,不包含任何数值计算、
  6. 物理模型、奖励逻辑或 Gym 接口实现。
  7. ========================
  8. 参数类总览
  9. ========================
  10. 1. UFState
  11. ------------------------
  12. 【环境动态状态】
  13. - 描述超滤系统在某一时刻的运行状态
  14. - 这些变量会在 env.step() 中随动作不断演化
  15. - 构成强化学习算法可观测的 observation
  16. - 生命周期:每个 step 更新一次
  17. 包含内容:
  18. - 实时运行工况(流量、温度、TMP)
  19. - 膜污染状态参数(短期污染、长期污染)
  20. - CEB 去除能力等可随 episode 演化的量
  21. 使用方:
  22. - 强化学习环境(step / reset)
  23. - 膜阻力物理模型(作为 forward 的 state 输入)
  24. - reward 计算逻辑
  25. 2. UFPhysicsParams
  26. ------------------------
  27. 【物理与工艺固定参数】
  28. - 描述超滤系统的客观工艺与设备配置
  29. - 在整个 episode 甚至整个训练生命周期中保持不变
  30. - 典型为“物理常数 / 工艺设定值”
  31. 设计约束:
  32. - 使用 frozen dataclass,防止运行时被意外修改
  33. 包含内容:
  34. - 物理反洗效率时间尺度
  35. - 反洗流量
  36. - CEB 间隔与用水量
  37. - 膜组件面积等硬件参数
  38. 使用方:
  39. - 膜阻力模型(上升 / 下降)
  40. - 回收率、能耗等物理量计算
  41. - 环境内部的物理约束判断
  42. 3. UFActionSpec
  43. ------------------------
  44. 【动作空间定义】
  45. - 描述智能体“可以选什么动作”,而不是“如何执行动作”
  46. - 仅定义动作的物理含义、取值范围和离散粒度
  47. - 不负责构造 Gym action_space
  48. 包含内容:
  49. - 过滤时长(L)范围与步长
  50. - 物理反洗时长(t_bw)范围与步长
  51. 使用方:
  52. - 环境初始化时构建离散动作空间
  53. - 不同算法(DQN / Dueling / PPO)共用同一动作语义
  54. 4. UFRewardSpec
  55. ------------------------
  56. 【奖励函数与安全约束参数】
  57. - 集中管理 reward 计算所需的权重、阈值与约束
  58. - 同时用于 episode 终止(terminated)判断
  59. - 不包含 reward 的计算公式本身
  60. 包含内容:
  61. - TMP 硬 / 软安全上限
  62. - 回收率与污染惩罚的敏感度系数
  63. - 回收率合理区间与参考污染比例
  64. 使用方:
  65. - reward 函数
  66. - 环境终止条件判断
  67. 5. UFStateBounds
  68. ------------------------
  69. 【状态初始化约束】
  70. - 仅用于 reset() 阶段的随机初始化
  71. - 不参与 step() 中的状态演化
  72. - 用于保证初始状态物理合理、覆盖足够多工况
  73. 包含内容:
  74. - TMP、流量、温度的初始化范围
  75. - 污染模型参数的合理区间
  76. - CEB 去除能力的上下限
  77. 使用方:
  78. - env.reset()
  79. - 用于构造多样化初始工况,增强策略鲁棒性
  80. ========================
  81. 设计原则(请勿破坏)
  82. ========================
  83. 1. 本文件只描述“参数是什么”,不描述“参数如何使用”
  84. 2. 禁止在本文件中出现:
  85. - torch / numpy 数值计算
  86. - Gym / Gymnasium space 定义
  87. - step / forward / reward 等逻辑
  88. 3. 若需要新增参数,请优先判断其生命周期:
  89. - 是否随 step 变化 → UFState
  90. - 是否全局不变 → UFPhysicsParams / Spec 类
  91. 4. 若发现需要在此文件中写计算代码,说明模块边界已经被破坏,应重构调用方
  92. """
  93. from dataclasses import dataclass, field
  94. from typing import Dict
  95. """
  96. 【说明:拆分 UFParams】
  97. 原 UFParams 类同时承担了多种不同职责,包括:
  98. 1. 环境状态(会在 step 中动态变化)
  99. 2. reset 时的初始状态约束
  100. 3. 超滤系统的物理 / 工艺固定参数
  101. 4. 强化学习动作空间定义
  102. 5. 奖励函数与安全约束参数
  103. 在强化学习工程中,这种参数结构会带来以下问题:
  104. - 状态与参数混杂,容易在 step() 中被误修改
  105. - reset 初始化逻辑与运行逻辑强耦合,难以调试
  106. - 奖励函数修改会影响环境动力学,增加不可控风险
  107. - 不利于算法切换(DQN / Dueling Q / PPO)
  108. 因此,现将 UFParams 拆分为多个“职责单一”的参数类,
  109. 每个类只负责一类明确的功能,从而实现:
  110. - 语义清晰
  111. - 边界明确
  112. - 易于维护
  113. - 算法无关(一个环境,多种算法共用)
  114. 【注意】
  115. 本次拆分不改变任何物理意义、数值含义与默认参数,仅做结构重组。
  116. """
  117. # ==================== 超滤系统参数配置类 ====================
  118. @dataclass
  119. class UFState:
  120. """
  121. 【环境动态状态】
  122. 描述超滤系统在当前时刻的运行状态。
  123. 这些变量会在 step() 中随动作不断演化,并构成强化学习的 observation。
  124. """
  125. # ========== 膜动态运行参数 ==========
  126. # 这些参数描述超滤膜的实时运行状态,在环境模拟中会动态变化
  127. q_UF: float = 360.0
  128. # 过滤进水流量(m³/h)
  129. # 说明:影响膜通量,进而影响污染速率
  130. # 典型范围:250-400 m³/h
  131. TMP: float = 0.03
  132. # 跨膜压差(MPa,兆帕)
  133. # 说明:反映膜阻力状态,TMP 越高表示膜污染越严重
  134. # 正常范围:0.01-0.035 MPa,超过 0.08 MPa 需停机检修
  135. temp: float = 25.0
  136. # 水温(摄氏度)
  137. # 说明:影响水的粘度,进而影响跨膜压差
  138. # 典型范围:10-40℃,25℃为标准温度
  139. R: float = 200.0
  140. # 膜阻力(缩放至1e2)
  141. # 说明:实际上的膜阻力应该根据q_UF/TMP0/temp动态计算,此处仅为构造状态类占位使用
  142. # ========== 膜阻力模型参数 ==========
  143. # 这些参数描述膜污染的物理化学特性,基于历史数据拟合得到
  144. nuK: float = 6.92e+01
  145. # 过滤阶段膜阻力增长系数(缩放后单位)
  146. # 说明:反映水质污染特性,nuK 越大表示水质越差、膜污染越快
  147. # 物理意义:单位膜通量、单位时间的阻力增长速率
  148. slope: float = 3.44e-01
  149. # 全周期不可逆污染增长斜率
  150. # 说明:描述长期不可逆污染的累积速率(幂律模型的系数)
  151. power: float = 1.032
  152. # 全周期不可逆污染增长幂次
  153. # 说明:描述长期污染的非线性特性(幂律模型的指数)
  154. # power > 1 表示污染加速累积,power < 1 表示污染增速放缓
  155. ceb_removal: float = 150
  156. # 化学增强反洗(CEB)可去除的膜阻力(缩放后单位)
  157. # 说明:CEB 比物理反洗更彻底,可去除部分不可逆污染
  158. @dataclass(frozen=True)
  159. class UFPhysicsParams:
  160. """
  161. 【物理与工艺固定参数】
  162. 描述超滤系统的客观工艺条件,在整个 episode 中保持不变。
  163. """
  164. global_TMP_hard_limit: float = 0.08
  165. # TMP 硬上限(MPa)
  166. # 说明:超过此值将导致episode失败,需立即停机
  167. global_TMP_soft_limit: float = 0.06
  168. # TMP 软上限 (MPa)
  169. # 说明:此上限用于指导奖励函数中膜阻力允许上升值,越接近该上限,系统对膜阻力上升控制的更严格
  170. # ========== 反洗参数(固定配置) ==========
  171. tau_bw_s: float = 20.0
  172. # 物理反洗时长影响的时间尺度(秒)
  173. # 说明:反洗效率的特征时间,当反洗时长 = tau 时,达到约 63% 效率
  174. gamma_t: float = 1.0
  175. # 物理反洗时长作用指数(保留参数,当前未使用)
  176. q_bw_m3ph: float = 1000.0
  177. # 物理反洗流量(m³/h)
  178. # 说明:反洗流量通常为正常过滤流量的 2-3 倍
  179. # ========== CEB 化学反洗参数 ==========
  180. T_ceb_interval_h: float = 48.0
  181. # CEB 间隔时间(小时)
  182. # 说明:每运行约 60 小时执行一次化学增强反洗 TODO: PARAM 当前采用保守测试参数48h
  183. v_ceb_m3: float = 20.0
  184. # CEB 用水体积(m³)
  185. t_ceb_s: float = 40 * 60.0
  186. # CEB 时长(秒,这里为 40 分钟)
  187. # ========== 新增:膜面积 ==========
  188. # 膜有效面积(锡山水厂配置:128组膜,每组40m²)
  189. A = 128 * 40.0 # [m²]
  190. # 吨水电耗查找表
  191. energy_lookup: Dict[int, float] = field(default_factory=lambda: {
  192. 3600: 0.1034, 3660: 0.1031, 3720: 0.1029, 3780: 0.1026,
  193. 3840: 0.1023, 3900: 0.1021, 3960: 0.1019, 4020: 0.1017,
  194. 4080: 0.1015, 4140: 0.1012, 4200: 0.1011, 4260: 0.1008,
  195. 4320: 0.1007, 4380: 0.1005, 4440: 0.1003, 4500: 0.1001,
  196. 4560: 0.0999, 4620: 0.0998, 4680: 0.0996, 4740: 0.0995,
  197. 4800: 0.0993,
  198. })
  199. @dataclass(frozen=True)
  200. class UFActionSpec:
  201. """
  202. 【动作空间定义】
  203. 描述智能体可选的过滤-反洗策略组合。
  204. """
  205. # ========== 强化学习动作空间搜索范围 ==========
  206. # 定义智能体可选择的动作范围(离散化)
  207. L_min_s: float = 3800.0 # 过滤时长下限(秒,约 63 分钟)
  208. L_max_s: float = 4800.0 # 过滤时长上限,当前为 4800s 80分钟
  209. t_bw_min_s: float = 40.0 # 物理反洗时长下限(秒)
  210. t_bw_max_s: float = 60.0 # 物理反洗时长上限(秒)
  211. # ========== 动作离散化网格 ==========
  212. L_step_s: float = 60.0 # 过滤时长步长(秒)
  213. t_bw_step_s: float = 5.0 # 物理反洗时长步长(秒)
  214. @dataclass(frozen=True)
  215. class UFRewardParams:
  216. """
  217. 【奖励函数与安全约束参数】用于 reward 计算和 episode 终止判断。
  218. """
  219. # ------------------ TMP 限值 ------------------
  220. global_TMP_hard_limit: float = 0.08
  221. # TMP 硬上限(MPa)
  222. # 说明:超过此值将导致 episode 失败,需立即停机
  223. global_TMP_soft_limit: float = 0.06
  224. # TMP 软上限 (MPa)
  225. # 说明:此上限用于指导奖励函数中膜阻力允许上升值,
  226. # 越接近该上限,系统对膜阻力上升控制的更严格
  227. # ------------------ 回收率奖励参数 ------------------
  228. k_rec: float = 5.0
  229. # 回收率敏感度系数(控制回收率奖励的陡峭程度)
  230. rec_low: float = 0.92
  231. rec_high: float = 0.99
  232. # 回收率正常范围,用于归一化奖励
  233. # ------------------ 残余污染奖励参数 ------------------
  234. k_res: float = 10.0
  235. # 残余污染敏感度系数(控制污染惩罚的陡峭程度)
  236. rr0: float = 0.08
  237. # 残余污染比例参考值(原设计参考点)
  238. # 在新设计中,每步允许上升比例由 1/max_episode_steps 决定,可覆盖原值
  239. # ------------------ 吨水电耗奖励参数 ------------------
  240. k_energy: float = 5.0
  241. # 吨水电耗敏感度系数(控制电耗奖励/惩罚陡峭程度)
  242. energy_low: float = 0.0993
  243. energy_high: float = 0.1034
  244. energy_ref: float = 0.1011
  245. # 电耗参考值
  246. # energy_low: 低耗电,奖励较高
  247. # energy_high: 高耗电,奖励为负
  248. # energy_ref: 平衡点,对应奖励为 0
  249. @dataclass(frozen=True)
  250. class UFStateBounds:
  251. """
  252. 【状态初始化约束】
  253. 仅用于 reset() 时随机初始化环境状态,
  254. 不参与 step() 中的状态演化。
  255. """
  256. # --- 流量约束 ---
  257. q_UF_max: float = 380.0 # 进水流量上限(m³/h)
  258. q_UF_min: float = 210.0 # 进水流量下限(m³/h)
  259. # --- 温度约束 ---
  260. temp_max: float = 32.0 # 温度上限(℃)
  261. temp_min: float = 16.0 # 温度下限(℃)
  262. # --- 初始TMP约束 ---
  263. TMP0_max: float = 0.045 # 初始TMP上限(MPa)
  264. TMP0_min: float = 0.01 # 初始TMP下限(MPa)
  265. # --- TMP上限约束 ---
  266. global_TMP_hard_limit: float = 0.08
  267. # --- 短期污染模型参数约束 ---
  268. nuK_max: float = 2.6e+02 # 阻力增长系数上限
  269. nuK_min: float = 4e+01 # 阻力增长系数下限
  270. # --- 长期污染模型参数约束 ---
  271. slope_max: float = 27 # 不可逆污染斜率上限
  272. slope_min: float = 0.03 # 不可逆污染斜率下限
  273. power_max: float = 2.2 # 不可逆污染幂次上限
  274. power_min: float = 0.4 # 不可逆污染幂次下限
  275. # --- CEB去除能力约束 ---
  276. ceb_removal_max: float = 250 # CEB去除阻力上限(缩放后)
  277. ceb_removal_min: float = 40 # CEB去除阻力下限(缩放后)