| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- # check_initial_state.py
- """
- 检查初始状态是否为“必死状态”(conservatively dead):
- 1) 实例化 base_params(优先使用 rl_dqn_env 中提供的 base_params 或 UFParams)
- 2) 实例化环境类 UFSuperCycleEnv(base_params)
- 3) 调用 env.generate_initial_state() 生成 env.current_params(不调用 reset())
- 4) 用最保守策略 (L_s=3600s, t_bw_s=60s) 连续模拟 max_steps 次,
- 若任意一次 is_dead_cycle(info) 返回 False 则判定为必死(返回 True),否则返回 False。
- """
- from typing import Any
- import copy
- import traceback
- # 从 rl_dqn_env 导入必需项
- try:
- from uf_env import (
- simulate_one_supercycle,
- is_dead_cycle,
- UFSuperCycleEnv,
- UFParams, # 如果模块里有 UFParams 类就导入
- base_params # 如果模块直接提供 base_params 实例也尝试导入
- )
- except Exception:
- # 有可能某些名字不存在 —— 我们会稍后用回退方案处理
- # 先导入模块并再尝试访问属性,确保错误信息更友好
- import importlib
- rl = importlib.import_module("rl_dqn_env")
- simulate_one_supercycle = getattr(rl, "simulate_one_supercycle", None)
- is_dead_cycle = getattr(rl, "is_dead_cycle", None)
- UFSuperCycleEnv = getattr(rl, "UFSuperCycleEnv", None)
- UFParams = getattr(rl, "UFParams", None)
- base_params = getattr(rl, "base_params", None)
- # 检查导入完整性
- _missing = []
- if simulate_one_supercycle is None:
- _missing.append("simulate_one_supercycle")
- if is_dead_cycle is None:
- _missing.append("is_dead_cycle")
- if UFSuperCycleEnv is None:
- _missing.append("UFSuperCycleEnv")
- if _missing:
- raise ImportError(f"无法从 rl_dqn_env 导入以下必要项: {', '.join(_missing)}")
- def is_dead_initial_state_env(env: UFSuperCycleEnv, max_steps: int = 15,
- L_s: int = 4200, t_bw_s: int = 50,
- verbose: bool = True) -> bool:
- """
- 使用 env.current_params 作为初始状态判断是否为必死状态(保守策略)。
- 参数:
- env: 已实例化的 UFSuperCycleEnv(必须包含 generate_initial_state() 与 current_params)
- max_steps: 模拟步数(默认 15)
- L_s: 过滤时长(s),保守值 3600
- t_bw_s: 物理反洗时长(s),保守值 60
- verbose: 是否打印每步结果
- 返回:
- True 表示必死(conservatively dead)
- False 表示可行
- """
- # 1) 确保 env 有 current_params,并且 generate_initial_state 可用
- if not hasattr(env, "generate_initial_state"):
- raise AttributeError("env 缺少 generate_initial_state() 方法。")
- # 生成初始状态(不会调用 reset)
- env.generate_initial_state()
- if not hasattr(env, "current_params"):
- raise AttributeError("env.generate_initial_state() 未设置 env.current_params。")
- curr_p = copy.deepcopy(env.current_params)
- for step in range(1, max_steps + 1):
- try:
- info, next_params = simulate_one_supercycle(curr_p, L_s, t_bw_s)
- except Exception as e:
- # 如果 simulate 出错,把异常视为“失败”(保守处理)
- if verbose:
- print(f"[Step {step}] simulate_one_supercycle 抛出异常,视为失败。异常信息:{e}")
- traceback.print_exc()
- return True
- success = is_dead_cycle(info) # True 表示成功循环
- if verbose:
- print(f"[Step {step}] 循环结果:{'成功' if success else '失败'}")
- # 如果 info 中有关键诊断字段,打印简要信息
- try:
- print(f" TMP0: {info.get('TMP0')},max_TMP: {info.get('max_TMP_during_filtration')}, recovery: {info.get('recovery')}, "
- f"R0: {info.get('R0')}, R_after_ceb: {info.get('R_after_ceb')}")
- except Exception:
- pass
- if not success:
- if verbose:
- print(f"在第 {step} 步检测到失败,判定为必死初始状态(conservatively dead)。")
- return True
- # 否则继续,用 next_params 作为下一步起始参数
- curr_p = next_params
- if verbose:
- print(f"{max_steps} 步均成功,初始状态判定为可行(non-dead)。")
- return False
- if __name__ == "__main__":
- print("=== check_initial_state.py: 使用 env.generate_initial_state() 检查初始状态是否为必死 ===")
- try:
- # 1) 构造 base_params
- if base_params is not None:
- bp = base_params
- print("使用 rl_dqn_env 中提供的 base_params。")
- elif UFParams is not None:
- bp = UFParams() # 使用默认构造
- print("使用 UFParams() 构造 base_params 的实例。")
- else:
- raise ImportError("无法构造 base_params:rl_dqn_env 中既无 base_params 也无 UFParams。")
- # 2) 实例化环境类(将 base_params 传入构造器)
- env = UFSuperCycleEnv(bp)
- print("已实例化 UFSuperCycleEnv 环境。")
- # 3) 调用 env.generate_initial_state() 并检查 env.current_params 是否为必死
- dead = is_dead_initial_state_env(env, max_steps=getattr(env, "max_episode_steps", 15),
- L_s=6000, t_bw_s=40, verbose=True)
- print("\n=== 判定结果 ===")
- if dead:
- print("当前生成的初始状态为【必死状态】(conservatively dead)。")
- else:
- print("当前生成的初始状态为【可行状态】(non-dead)。")
- except Exception as e:
- print("脚本执行出现错误:", e)
- traceback.print_exc()
|