check_initial_state.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. # check_initial_state.py
  2. """
  3. 检查初始状态是否为“必死状态”(conservatively dead):
  4. 1) 实例化 base_params(优先使用 rl_dqn_env 中提供的 base_params 或 UFParams)
  5. 2) 实例化环境类 UFSuperCycleEnv(base_params)
  6. 3) 调用 env.generate_initial_state() 生成 env.current_params(不调用 reset())
  7. 4) 用最保守策略 (L_s=3600s, t_bw_s=60s) 连续模拟 max_steps 次,
  8. 若任意一次 is_dead_cycle(info) 返回 False 则判定为必死(返回 True),否则返回 False。
  9. """
  10. from typing import Any
  11. import copy
  12. import traceback
  13. # 从 rl_dqn_env 导入必需项
  14. try:
  15. from DQN_env import (
  16. simulate_one_supercycle,
  17. is_dead_cycle,
  18. UFSuperCycleEnv,
  19. UFParams, # 如果模块里有 UFParams 类就导入
  20. base_params # 如果模块直接提供 base_params 实例也尝试导入
  21. )
  22. except Exception:
  23. # 有可能某些名字不存在 —— 我们会稍后用回退方案处理
  24. # 先导入模块并再尝试访问属性,确保错误信息更友好
  25. import importlib
  26. rl = importlib.import_module("rl_dqn_env")
  27. simulate_one_supercycle = getattr(rl, "simulate_one_supercycle", None)
  28. is_dead_cycle = getattr(rl, "is_dead_cycle", None)
  29. UFSuperCycleEnv = getattr(rl, "UFSuperCycleEnv", None)
  30. UFParams = getattr(rl, "UFParams", None)
  31. base_params = getattr(rl, "base_params", None)
  32. # 检查导入完整性
  33. _missing = []
  34. if simulate_one_supercycle is None:
  35. _missing.append("simulate_one_supercycle")
  36. if is_dead_cycle is None:
  37. _missing.append("is_dead_cycle")
  38. if UFSuperCycleEnv is None:
  39. _missing.append("UFSuperCycleEnv")
  40. if _missing:
  41. raise ImportError(f"无法从 rl_dqn_env 导入以下必要项: {', '.join(_missing)}")
  42. def is_dead_initial_state_env(env: UFSuperCycleEnv, max_steps: int = 15,
  43. L_s: int = 4200, t_bw_s: int = 50,
  44. verbose: bool = True) -> bool:
  45. """
  46. 使用 env.current_params 作为初始状态判断是否为必死状态(保守策略)。
  47. 参数:
  48. env: 已实例化的 UFSuperCycleEnv(必须包含 generate_initial_state() 与 current_params)
  49. max_steps: 模拟步数(默认 15)
  50. L_s: 过滤时长(s),保守值 3600
  51. t_bw_s: 物理反洗时长(s),保守值 60
  52. verbose: 是否打印每步结果
  53. 返回:
  54. True 表示必死(conservatively dead)
  55. False 表示可行
  56. """
  57. # 1) 确保 env 有 current_params,并且 generate_initial_state 可用
  58. if not hasattr(env, "generate_initial_state"):
  59. raise AttributeError("env 缺少 generate_initial_state() 方法。")
  60. # 生成初始状态(不会调用 reset)
  61. env.generate_initial_state()
  62. if not hasattr(env, "current_params"):
  63. raise AttributeError("env.generate_initial_state() 未设置 env.current_params。")
  64. curr_p = copy.deepcopy(env.current_params)
  65. for step in range(1, max_steps + 1):
  66. try:
  67. info, next_params = simulate_one_supercycle(curr_p, L_s, t_bw_s)
  68. except Exception as e:
  69. # 如果 simulate 出错,把异常视为“失败”(保守处理)
  70. if verbose:
  71. print(f"[Step {step}] simulate_one_supercycle 抛出异常,视为失败。异常信息:{e}")
  72. traceback.print_exc()
  73. return True
  74. success = is_dead_cycle(info) # True 表示成功循环
  75. if verbose:
  76. print(f"[Step {step}] 循环结果:{'成功' if success else '失败'}")
  77. # 如果 info 中有关键诊断字段,打印简要信息
  78. try:
  79. print(f" TMP0: {info.get('TMP0')},max_TMP: {info.get('max_TMP_during_filtration')}, recovery: {info.get('recovery')}, "
  80. f"R0: {info.get('R0')}, R_after_ceb: {info.get('R_after_ceb')}")
  81. except Exception:
  82. pass
  83. if not success:
  84. if verbose:
  85. print(f"在第 {step} 步检测到失败,判定为必死初始状态(conservatively dead)。")
  86. return True
  87. # 否则继续,用 next_params 作为下一步起始参数
  88. curr_p = next_params
  89. if verbose:
  90. print(f"{max_steps} 步均成功,初始状态判定为可行(non-dead)。")
  91. return False
  92. if __name__ == "__main__":
  93. print("=== check_initial_state.py: 使用 env.generate_initial_state() 检查初始状态是否为必死 ===")
  94. try:
  95. # 1) 构造 base_params
  96. if base_params is not None:
  97. bp = base_params
  98. print("使用 rl_dqn_env 中提供的 base_params。")
  99. elif UFParams is not None:
  100. bp = UFParams() # 使用默认构造
  101. print("使用 UFParams() 构造 base_params 的实例。")
  102. else:
  103. raise ImportError("无法构造 base_params:rl_dqn_env 中既无 base_params 也无 UFParams。")
  104. # 2) 实例化环境类(将 base_params 传入构造器)
  105. env = UFSuperCycleEnv(bp)
  106. print("已实例化 UFSuperCycleEnv 环境。")
  107. # 3) 调用 env.generate_initial_state() 并检查 env.current_params 是否为必死
  108. dead = is_dead_initial_state_env(env, max_steps=getattr(env, "max_episode_steps", 15),
  109. L_s=6000, t_bw_s=40, verbose=True)
  110. print("\n=== 判定结果 ===")
  111. if dead:
  112. print("当前生成的初始状态为【必死状态】(conservatively dead)。")
  113. else:
  114. print("当前生成的初始状态为【可行状态】(non-dead)。")
  115. except Exception as e:
  116. print("脚本执行出现错误:", e)
  117. traceback.print_exc()