|
|
@@ -13,9 +13,11 @@ UF 超滤 DQN 决策主入口(Inference / Online Assist)
|
|
|
"""
|
|
|
|
|
|
from pathlib import Path
|
|
|
+from dataclasses import replace
|
|
|
+
|
|
|
|
|
|
# ============================================================
|
|
|
-# 1. 导入模块
|
|
|
+# 导入模块
|
|
|
# ============================================================
|
|
|
CURRENT_DIR = Path(__file__).resolve().parent
|
|
|
|
|
|
@@ -73,22 +75,6 @@ def check_state_bounds(current_state, state_bounds, unit_name):
|
|
|
"error_feature": f"{unit_name}Per"
|
|
|
}
|
|
|
|
|
|
- q_UF_min = state_bounds.q_UF_min
|
|
|
- q_UF_max = state_bounds.q_UF_max
|
|
|
- if not (q_UF_min <= current_state.q_UF <= q_UF_max):
|
|
|
- return {
|
|
|
- "error_time": error_time,
|
|
|
- "error_feature": f"{unit_name}Per"
|
|
|
- }
|
|
|
-
|
|
|
- temp_min = state_bounds.temp_min
|
|
|
- temp_max = state_bounds.temp_max
|
|
|
- if not (temp_min <= current_state.temp <= temp_max):
|
|
|
- return {
|
|
|
- "error_time": error_time,
|
|
|
- "error_feature": f"{unit_name}Per"
|
|
|
- }
|
|
|
-
|
|
|
return None
|
|
|
|
|
|
|
|
|
@@ -258,8 +244,8 @@ def run_dqn_decide(
|
|
|
model_path=model_path,
|
|
|
seed=0,
|
|
|
)
|
|
|
- # 模型决策(不推进真实环境)
|
|
|
|
|
|
+ # 模型决策
|
|
|
decision = decider.decide(current_state)
|
|
|
action_id = decision["action_id"]
|
|
|
model_L_s = decision["L_s"]
|
|
|
@@ -273,16 +259,19 @@ def run_dqn_decide(
|
|
|
# ==============================
|
|
|
if __name__ == "__main__":
|
|
|
|
|
|
- MODEL_PATH = UF_RL_ROOT / "config_and_model" / "anzhen" / "48h_dqn_model.zip"
|
|
|
- ENV_CONFIG_PATH = UF_RL_ROOT / "config_and_model" / "anzhen" / "env_config.yaml"
|
|
|
+ # ========== 模型及配置路径指定 ==========
|
|
|
+ IS_TIMES = False # 外部指定变量,表示CEB间隔为时间控制/次数控制,T表示48次bw一次CEB,F表示48h一次CEB
|
|
|
+ MODEL_PATH = UF_RL_ROOT / "config_and_model" / "anzhen" / "48h_dqn_model.zip" # 需根据IS_TIMES变量值指定模型为48h_dqn_model.zip/48times_dqn_model.zip
|
|
|
+ ENV_CONFIG_PATH = UF_RL_ROOT / "config_and_model" / "anzhen" / "env_config.yaml" # 环境配置路径
|
|
|
+
|
|
|
+ # ========== 外部调用输入 ==========
|
|
|
+ # 轻量版,仅输入当前周期起始状态变量
|
|
|
units_to_run = ["UF1"] # 新增输入:本次调用的机组对象名
|
|
|
TMP0 = 0.07 # 原始 TMP0
|
|
|
q_UF = 300 # 进水流量
|
|
|
temp = 20.0 #进水温度
|
|
|
- IS_TIMES = False # 新增指定变量,表示CEB间隔为时间控制/次数控制,T表示48次bw一次CEB,F表示48h一次CEB
|
|
|
-
|
|
|
- current_state = UFState(TMP=TMP0, q_UF=q_UF, temp=temp)
|
|
|
|
|
|
+ # ========== 模型及配置加载 ==========
|
|
|
config_loader = EnvConfigLoader(ENV_CONFIG_PATH)
|
|
|
config_loader.validate_config()
|
|
|
config_loader.print_config_summary()
|
|
|
@@ -293,15 +282,24 @@ if __name__ == "__main__":
|
|
|
reward_params, # UFRewardParams
|
|
|
state_bounds # UFStateBounds
|
|
|
) = create_env_params_from_yaml(ENV_CONFIG_PATH)
|
|
|
-
|
|
|
physics = build_physics(IS_TIMES, phys_params,state_bounds)
|
|
|
|
|
|
- # ========== 异常检查(仅检查,不中断,后续归一化时将异常状态强制归一化至上下限) ==========
|
|
|
+ # ========== 调用模型生成模型指令 ==========
|
|
|
+ # 基于外部输入构建当前状态
|
|
|
+ current_state = replace(
|
|
|
+ uf_state_default,
|
|
|
+ TMP=TMP0,
|
|
|
+ q_UF=q_UF,
|
|
|
+ temp=temp
|
|
|
+ )
|
|
|
+
|
|
|
+ # 状态异常检查(仅检查,不中断,出现异常时后续归一化中将异常状态强制归一化至上下限)
|
|
|
for unit_name in units_to_run:
|
|
|
error_result = check_state_bounds(current_state, state_bounds, unit_name)
|
|
|
if error_result:
|
|
|
print(f"错误发生时间: {error_result['error_time']};错误特征量:{error_result['error_feature']}")
|
|
|
|
|
|
+ # 模型输出指令
|
|
|
action_id, model_L_s, model_t_bw_s = run_dqn_decide(
|
|
|
model_path=MODEL_PATH,
|
|
|
physics=physics,
|
|
|
@@ -311,6 +309,7 @@ if __name__ == "__main__":
|
|
|
current_state=current_state,
|
|
|
) # 环境实例化,模型加载等功能放在UFDQNDecider类中
|
|
|
|
|
|
+ # ========== 生成工厂下发指令 ==========
|
|
|
current_L_s = 3800
|
|
|
current_t_bw_s = 40
|
|
|
model_prev_L_s = 4040
|
|
|
@@ -318,6 +317,7 @@ if __name__ == "__main__":
|
|
|
L_s, t_bw_s = generate_plc_instructions(action_spec, current_L_s, current_t_bw_s, model_prev_L_s, model_prev_t_bw_s, model_L_s,
|
|
|
model_t_bw_s) # 获取模型下发指令
|
|
|
|
|
|
+ # ========== 生成指令模拟执行结果 ==========
|
|
|
max_tmp_during_filtration = 0.050176 # 新增工厂数据接口:周期最高/最低跨膜压差,无工厂数据接入时传入None,calc_uf_cycle_metrics()自动获取模拟周期中的跨膜压差最值
|
|
|
min_tmp_during_filtration = 0.012496
|
|
|
execution_result = calc_uf_cycle_metrics(current_state, max_tmp_during_filtration, min_tmp_during_filtration, L_s, t_bw_s)
|