User: Selecting previously unselected package cuda-repo-wsl-ubuntu-12-6-local.
(Reading database ... 47245 files and directories currently installed.)
Preparing to unpack cuda-repo-wsl-ubuntu-12-6-local_12.6.2-1_amd64.deb ...
Unpacking cuda-repo-wsl-ubuntu-12-6-local (12.6.2-1) ...
dpkg-deb (subprocess): cannot copy archive member from 'cuda-repo-wsl-ubuntu-12-6-local_12.6.2-1_amd64.deb' to decompressor pipe: unexpected end of file or stream
dpkg-deb (subprocess): decompressing archive 'cuda-repo-wsl-ubuntu-12-6-local_12.6.2-1_amd64.deb' (size=155123194) member 'data.tar': lzma error: unexpected end of input
dpkg-deb: error: <decompress> subprocess returned error exit status 2
dpkg: error processing archive cuda-repo-wsl-ubuntu-12-6-local_12.6.2-1_amd64.deb (--install):
 cannot copy extracted data for './var/cuda-repo-wsl-ubuntu-12-6-local/cuda-nsight-12-6_12.6.77-1_amd64.deb' to '/var/cuda-repo-wsl-ubuntu-12-6-local/cuda-nsight-12-6_12.6.77-1_amd64.deb.dpkg-new': unexpected end of file or stream
Errors were encountered while processing: 
Assistant: The error messages indicate a problem with the installation of the `cuda-repo-wsl-ubuntu-12-6-local` package, specifically that the `.deb` file is corrupted or incomplete. This is evidenced by the messages "unexpected end of file or stream" and errors from the `dpkg-deb` subprocess.

Here are some steps you can take to resolve the issue:

1. **Re-download the Package**: The `.deb` file may have been downloaded incompletely. Try downloading the package again from a reliable source.

2. **Check Disk Space**: Ensure there is sufficient disk space on your system. A lack of space could interrupt the download or decompression process. You can check disk usage with:
   ```bash
   df -h
   ```

3. **Check File Integrity**: If available, check the checksum or hash of the downloaded file against a known good hash provided by the source to ensure the file is complete and not corrupted.

4. **Clear Package Cache**: Sometimes cache issues can cause problems. Try clearing any related caches. For example:
   ```bash
   sudo apt-get clean
   ```

5. **Retry Installation**: Once you've re-downloaded the file, attempt the installation again with:
   ```bash
   sudo dpkg -i cuda-repo-wsl-ubuntu-12-6-local_12.6.2-1 [aborted]
User: 中文回答
Assistant: 错误信息表明在安装 `cuda-repo-wsl-ubuntu-12-6-local` 包时出现了问题，特别是 `.deb` 文件可能已损坏或不完整。这可以从 "unexpected end of file or stream" 和 `dpkg-deb` 子进程的错误提示中看出。

您可以尝试以下步骤来解决此问题：

1. **重新下载软件包**：`.deb` 文件可能未完整下载。请从可靠来源重新下载该软件包。

2. **检查磁盘空间**：确保系统有足够的磁盘空间。磁盘空间不足可能会中断下载或解压过程。可以通过以下命令检查磁盘使用情况：
   ```bash
   df -h
   ```

3. **检查文件完整性**：如果可用，检查下载文件的校验和或哈希值，并与来源提供的已知良好的哈希值进行比较，以确保文件完整且未损坏。

4. **清除包缓存**：有时缓存问题会导致问题。尝试清除相关缓存，例如：
   ```bash
   sudo apt-get clean
   ```

5. **重新尝试安装**：一旦重新下载文件，可以再次尝试安装：
   ```bash
   sudo dpkg -i cuda-repo-wsl-ubuntu-12-6-local_12.6.2-1_amd64.deb
   ```

如果问题仍然存在，请确保所下载文件的来源可靠，或者考虑查找相关支持和社区帮助以获取更多指导。
User: wget https://developer.download.nvidia.com/compute/cuda/12.6.2/local_installers/cuda-repo-wsl-ubuntu-12-6-local_12.6.2-1_amd64.deb 如何删除卸载这个
Assistant: 要删除卸载通过 `dpkg` 安装的 `.deb` 软件包，您可以使用以下步骤：

1. **确认软件包名称**：首先需要确认安装的软件包名称。在这种情况下，由于您安装的是 `cuda-repo-wsl-ubuntu-12-6-local`，所以软件包名称应该就是这个。

2. **卸载软件包**：使用 `dpkg` 的卸载命令来移除软件包。执行以下命令：
   ```bash
   sudo dpkg -r cuda-repo-wsl-ubuntu-12-6-local
   ```

   如果需要同时移除配置文件，可以使用：
   ```bash
   sudo dpkg --purge cuda-repo-wsl-ubuntu-12-6-local
   ```

3. **检查删除是否成功**：您可以通过以下命令来确认这个软件包是否已成功移除：
   ```bash
   dpkg -l | grep cuda-repo-wsl-ubuntu-12-6-local
   ```

如果软件包已经成功移除，那么这个命令应该不会有任何输出。如果仍有问题或者输出表明软件包未完全卸载，您可能需要检查系统日志寻找更多信息来解决问题。

请确保在操作前备份重要数据，并且注意运行命令行工具时的权限。
User: ^怎么打出来
Assistant: 要输入字符“^”，即上标（caret）符号，通常可以通过以下方式：

1. **计算机键盘**：
   - 大多数键盘上可以通过同时按下`Shift`键和数字键`6`来输入“^”符号。

2. **输入法**：
   - 在某些中文输入法中，可能需要切换到“英文”模式才能直接输入符号。

3. **特殊字符输入**：
   - 如果使用的是特定输入法（例如智能ABC、五笔等），你可能需要切换输入法到一个允许直接输入符号的模式。
   - 在 Windows 中，可以通过符号对话框来输入特殊字符：按 `Win + R`，输入 `charmap` 然后按回车，打开字符映射表，从中选择符号。
   
4. **在Unix/Linux MacOS终端中**：
   - 直接按`Shift`与`6`。
   
如果你在特定环境中找不到或无法输入“^”符号，可能需要查找该环境下的特殊符号输入方法。
User: 使用gpu加速
```python
import os
import time 
import gymnasium as gym
import numpy as np
from stable_baselines3 import PPO
from stable_baselines3.common.env_util import make_vec_env
import openmc

import matplotlib.pyplot as plt


# 设置中文字体linux无中文字体
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False 
 
#设置横截数据库路径
openmc.config['cross_sections'] = '/home/unknowxxs/python/data/cross_sections.xml'

class NuclearReactorEnv(gym.Env):
    def __init__(self):
        super().__init__()
        self.action_space = gym.spaces.Discrete(11)  # 控制棒位置，0-10
        
        # 观察空间：温度、功率、k_eff、控制棒位置、燃料燃耗
        self.observation_space = gym.spaces.Box(
            low=np.array([500, 0, 0.5, 0, 0]),
            high=np.array([1500, 3000, 1.5, 1, 100]),
            dtype=np.float32
        )
        
        self.max_steps = 1000
        self.current_step = 0
        self._setup_model()
        
    def _setup_model(self):
        # 设置材料
        # UO2燃料
        self.fuel = openmc.Material(name='fuel')
        self.fuel.add_nuclide('U235', 0.05)
        self.fuel.add_nuclide('U238', 0.95)
        self.fuel.add_nuclide('O16', 2.0)
        self.fuel.set_density('g/cm3', 10.0)
        self.fuel.temperature = 900 # K

        # 水冷却剂
        self.water = openmc.Material(name='water')
        self.water.add_nuclide('H1', 2)
        self.water.add_nuclide('O16', 1)
        self.water.set_density('g/cm3', 1.0)
        self.water.temperature = 900 # K

        # 控制棒 (B4C)
        self.control_rod = openmc.Material(name='control_rod')
        self.control_rod.add_nuclide('B10', 0.8)
        self.control_rod.add_nuclide('B11', 0.2)
        self.control_rod.add_nuclide('C12', 1.0)
        self.control_rod.set_density('g/cm3', 2.52)

        # 创建材料集合
        self.materials = openmc.Materials([self.fuel, self.water, self.control_rod])
        self.materials.export_to_xml()  # 生成 materials.xml

        # 创建几何体
        # 简化的圆柱形反应堆堆芯
        cylinder = openmc.ZCylinder(r=100, boundary_type='reflective')  # 增加了边界条件
        fuel_region = -cylinder
        
        fuel_cell = openmc.Cell(fill=self.fuel, region=fuel_region)
        outside_cell = openmc.Cell(region=+cylinder, fill=self.water)  # 创建外部包围物

        # 创建universe和geometry
        root_universe = openmc.Universe(cells=[fuel_cell, outside_cell])
        self.geometry = openmc.Geometry(root_universe)
        self.geometry.export_to_xml()  # 生成 geometry.xml

        # 设置模拟参数并生成 XML
        self.settings = openmc.Settings()
        self.settings.batches = 100
        self.settings.inactive = 10
        self.settings.particles = 1000
        self.settings.temperature = {'method': 'interpolation'}
        self.settings.export_to_xml()  # 生成 settings.xml
    
    def init_visualization(self):
        """初始化可视化图表"""
        plt.ion()  # 开启交互模式
        self.fig, self.axs = plt.subplots(2, 2, figsize=(15, 10))
        self.fig.suptitle('核反应堆运行状态监测', fontsize=16)
        
        # 初始化数据存储
        self.history = {
            'temperature': [],
            'power': [],
            'k_eff': [],
            'burnup': [],
            'control_rod': [],
            'steps': []
        }
        
        # 配置子图
        self.lines = {}
        
        # 温度和功率图
        self.axs[0, 0].set_title('温度和功率变化')
        self.axs[0, 0].set_xlabel('步数')
        self.lines['temp'], = self.axs[0, 0].plot([], [], 'r-', label='温度 (K)')
        self.lines['power'], = self.axs[0, 0].plot([], [], 'b-', label='功率 (MW)')
        self.axs[0, 0].legend()
        
        # k_eff图
        self.axs[0, 1].set_title('k_eff变化')
        self.axs[0, 1].set_xlabel('步数')
        self.lines['k_eff'], = self.axs[0, 1].plot([], [], 'g-', label='k_eff')
        self.axs[0, 1].axhline(y=1.0, color='r', linestyle='--', label='临界值')
        self.axs[0, 1].legend()
        
        # 控制棒位置图
        self.axs[1, 0].set_title('控制棒位置')
        self.axs[1, 0].set_xlabel('步数')
        self.lines['control'], = self.axs[1, 0].plot([], [], 'k-', label='控制棒位置')
        self.axs[1, 0].legend()
        
        # 燃耗图
        self.axs[1, 1].set_title('燃料燃耗')
        self.axs[1, 1].set_xlabel('步数')
        self.lines['burnup'], = self.axs[1, 1].plot([], [], 'm-', label='燃耗 (MWd/kgU)')
        self.axs[1, 1].legend()
        
        plt.tight_layout()

    def update_visualization(self):
        """更新可视化图表"""
        # 更新历史数据
        self.history['temperature'].append(self.temperature)
        self.history['power'].append(self.power)
        self.history['k_eff'].append(self.k_eff)
        self.history['burnup'].append(self.burnup)
        self.history['control_rod'].append(self.control_rod_pos)
        self.history['steps'].append(self.current_step)
        
        # 更新图表
        steps = self.history['steps']
        
        # 更新温度和功率
        self.lines['temp'].set_data(steps, self.history['temperature'])
        self.lines['power'].set_data(steps, self.history['power'])
        self.axs[0, 0].relim()
        self.axs[0, 0].autoscale_view()
        
        # 更新k_eff
        self.lines['k_eff'].set_data(steps, self.history['k_eff'])
        self.axs[0, 1].relim()
        self.axs[0, 1].autoscale_view()
        
        # 更新控制棒位置
        self.lines['control'].set_data(steps, self.history['control_rod'])
        self.axs[1, 0].relim()
        self.axs[1, 0].autoscale_view()
        
        # 更新燃耗
        self.lines['burnup'].set_data(steps, self.history['burnup'])
        self.axs[1, 1].relim()
        self.axs[1, 1].autoscale_view()
        
        plt.draw()
        plt.pause(0.01)

    def reset(self, seed=None):
        super().reset(seed=seed)
        self.current_step = 0
        self.temperature = 600  # K
        self.power = 1000      # MW
        self.k_eff = 1.0
        '''当 k_eff = 1，表示每一代中子产生的中子数量与上一代相等'''
        self.burnup = 0        # MWd/kgU
        self.control_rod_pos = 0.5
        
        # 初始化可视化
        self.init_visualization()
        
        return self._get_observation(), {}
    
    def _get_observation(self):
        return np.array([
            self.temperature,
            self.power,
            self.k_eff,
            self.control_rod_pos,
            self.burnup
        ], dtype=np.float32)
    
    def step(self, action):
        self.current_step += 1
        
        # 更新控制棒位置
        self.control_rod_pos = action / 10.0
        
        # 运行OpenMC模拟
        try:
            # 更新材料温度
            self.fuel.temperature = self.temperature
            
            # 运行临界计算
            openmc.run()
         
            # 获取k_eff
            with openmc.StatePoint("/home/unknowxxs/python/statepoint.100.h5") as sp:
                self.k_eff = sp.keff.nominal_value
                
            # 更新系统状态
            self._update_state()
            
            # 更新可视化
            self.update_visualization()
            
            # 计算奖励
            reward = self._calculate_reward()
            
            # 检查是否结束
            done = self.current_step >= self.max_steps or self._is_unsafe()
            
        except Exception as e:
            print(f"模拟过程出错: {e}")
            reward = -1000
            done = True
        
        return self._get_observation(), reward, done, False, {}
    
    def _update_state(self):
        # 基于k_eff更新功率
        power_factor = (self.k_eff - 1.0) * 5000
        self.power = np.clip(self.power + power_factor, 0, 3000)
        
        # 更新温度
        delta_temp = (self.power - 1000) * 0.1
        # 将温度调整到最接近的 100 的整数倍
        new_temperature =self.temperature + delta_temp   # round(self.temperature + delta_temp/ 100.0) * 100
        self.temperature = np.clip(new_temperature, 500, 1500)
        
        # 更新燃耗
        self.burnup += self.power * 0.001
        
    def _calculate_reward(self):
        reward = 0
        
        # 奖励稳定的运行状态
        reward -= abs(self.power - 1000) * 0.01  # 目标功率1000MW
        reward -= abs(self.k_eff - 1.0) * 100    # 目标k_eff=1
        reward -= abs(self.temperature - 900) * 0.1  # 目标温度900K
        
        # 惩罚不安全状态
        if self._is_unsafe():
            reward -= 1000
            
        return reward
    
    def _is_unsafe(self):
        return (self.temperature > 1400 or 
                self.power > 2500 or 
                self.k_eff > 1.2)

def train_agent():

    #创建环境更好的方法
    env = make_vec_env(NuclearReactorEnv, n_envs=4)
    
    model = PPO(
        "MlpPolicy",
        env,
        verbose=1,
        learning_rate=0.0003,
        n_steps=2048,
        batch_size=64,
        n_epochs=10
    )
    
    model.learn(total_timesteps=1000)
    model.save("ppo_nuclear_reactor")
    
    return model

def evaluate_agent(model, num_episodes=5):
    env = NuclearReactorEnv()
    
    for episode in range(num_episodes):
        obs, _ = env.reset()
        episode_reward = 0
        done = False
        
        while not done:
            action, _ = model.predict(obs)
            obs, reward, done, _, _ = env.step(action)
            episode_reward += reward
            
            # 打印当前状态
            print(f"步骤 {env.current_step}:")
            print(f"温度: {env.temperature:.1f}K")
            print(f"功率: {env.power:.1f}MW")
            print(f"k_eff: {env.k_eff:.3f}")
            print(f"控制棒位置: {env.control_rod_pos:.2f}")
            print(f"燃耗: {env.burnup:.2f}MWd/kgU")
            print("------------------------")
        
        plt.savefig(f'episode_{episode+1}_results.png')
        print(f"Episode {episode + 1}: 总奖励 = {episode_reward:.2f}\n")
    
    plt.close('all')

model = train_agent()
print("\n评估核反应堆控制性能：")
evaluate_agent(model)

```
Assistant: 在Python中使用GPU加速主要涉及使用支持GPU运算的库，比如CUDA、CuPy、PyTorch、TensorFlow等。然而，您提供的代码片段使用的库（如OpenMC、Stable Baselines3和Matplotlib）目前没有直接内置的GPU加速功能，或者需要特定设置来使用GPU。因此，以下是一些提高代码效率和使用GPU的潜在方法：

1. **模拟器（OpenMC）加速**：
   - OpenMC自身不直接支持GPU加速。如果您需要更快的模拟，可能需要考虑其并行化选项，或者使用其它支持GPU的中子运输模拟器。

2. **优化机器学习模型训练（Stable Baselines3）**：
   - 将神经网络模型训练放在GPU上可以显著提高速度。Stable Baselines3在内部基于PyTorch，确保PyTorch已安装并配置CUDA以利用GPU加速。
   - 确保您的PyTorch安装支持CUDA。您可能需要通过Anaconda或pip安装支持CUDA的版本：
     ```bash
     conda install pytorch torchvision torchaudio cudatoolkit=10.2 -c pytorch
     ```
   - 在实例化模型时，可以指定设备：
     ```python
     model = PPO(
         "MlpPolicy",
         env,
         verbose=1,
         learning_rate=0.0003,
         n_steps=2048,
         batch_size=64,
         n_epochs=10,
         device='cuda'  # 使用CUDA
     )
     ```

3. **优化NumPy计算**：
   - 使用CuPy替代NumPy进行GPU加速运算（如果数值计算是瓶颈）。CuPy的API与NumPy兼容，可以轻松替换。
   - 配置CuPy：
     ```bash
     pip install cupy-cudaXX  # XX为您的CUDA版本，例如cupy-cuda101
     ```

4. **数据预处理和绘图**：
   - Matplotlib通常是单线程的，且主要在CPU上运行，无法直接利用GPU加速。但对于大量的数据可视化，可以尝试先运行计算后异步绘图以提高效率。

5. **进一步提升性能**：
   - 使用Numba或Cython对计算密集型的自定义函数进行JIT编译，可以提升性能。

记住，确保您的设备已正确配置CUDA及相关的GPU驱动。查验CUDA安装是否成功，可以运行以下命令测试：
```bash
nvcc --version
```

最后，任何性能优化都应首先以分析和衡量为基础，找出代码中具体的瓶颈部分，针对性地使用上述方法进行优化。
User:   new_temperature =  round(self.temperature + delta_temp/ 100.0) * 100加入这行代码后报错[LAPTOP-K8OGDHAS:17857] shmem: mmap: an error occurred while determining whether or not /tmp/ompi.LAPTOP-K8OGDHAS.1000/jf.0/3348365312/shared_mem_cuda_pool.LAPTOP-K8OGDHAS could be created.
[LAPTOP-K8OGDHAS:17857] create_and_attach: unable to create shared memory BTL coordinating structure :: size 134217728 
                                %%%%%%%%%%%%%%%
```python
import os
import time 
import gymnasium as gym
import numpy as np
from stable_baselines3 import PPO
from stable_baselines3.common.env_util import make_vec_env
import openmc

import matplotlib.pyplot as plt


# 设置中文字体linux无中文字体
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False 
 
#设置横截数据库路径
openmc.config['cross_sections'] = '/home/unknowxxs/python/data/cross_sections.xml'

class NuclearReactorEnv(gym.Env):
    def __init__(self):
        super().__init__()
        self.action_space = gym.spaces.Discrete(11)  # 控制棒位置，0-10
        
        # 观察空间：温度、功率、k_eff、控制棒位置、燃料燃耗
        self.observation_space = gym.spaces.Box(
            low=np.array([500, 0, 0.5, 0, 0]),
            high=np.array([1500, 3000, 1.5, 1, 100]),
            dtype=np.float32
        )
        
        self.max_steps = 1000
        self.current_step = 0
        self._setup_model()
        
    def _setup_model(self):
        # 设置材料
        # UO2燃料
        self.fuel = openmc.Material(name='fuel')
        self.fuel.add_nuclide('U235', 0.05)
        self.fuel.add_nuclide('U238', 0.95)
        self.fuel.add_nuclide('O16', 2.0)
        self.fuel.set_density('g/cm3', 10.0)
        self.fuel.temperature = 900 # K

        # 水冷却剂
        self.water = openmc.Material(name='water')
        self.water.add_nuclide('H1', 2)
        self.water.add_nuclide('O16', 1)
        self.water.set_density('g/cm3', 1.0)
        self.water.temperature = 900 # K

        # 控制棒 (B4C)
        self.control_rod = openmc.Material(name='control_rod')
        self.control_rod.add_nuclide('B10', 0.8)
        self.control_rod.add_nuclide('B11', 0.2)
        self.control_rod.add_nuclide('C12', 1.0)
        self.control_rod.set_density('g/cm3', 2.52)

        # 创建材料集合
        self.materials = openmc.Materials([self.fuel, self.water, self.control_rod])
        self.materials.export_to_xml()  # 生成 materials.xml

        # 创建几何体
        # 简化的圆柱形反应堆堆芯
        cylinder = openmc.ZCylinder(r=100, boundary_type='reflective')  # 增加了边界条件
        fuel_region = -cylinder
        
        fuel_cell = openmc.Cell(fill=self.fuel, region=fuel_region)
        outside_cell = openmc.Cell(region=+cylinder, fill=self.water)  # 创建外部包围物

        # 创建universe和geometry
        root_universe = openmc.Universe(cells=[fuel_cell, outside_cell])
        self.geometry = openmc.Geometry(root_universe)
        self.geometry.export_to_xml()  # 生成 geometry.xml

        # 设置模拟参数并生成 XML
        self.settings = openmc.Settings()
        self.settings.batches = 100
        self.settings.inactive = 10
        self.settings.particles = 1000
        self.settings.temperature = {'method': 'interpolation'}
        self.settings.export_to_xml()  # 生成 settings.xml
    
    def init_visualization(self):
        """初始化可视化图表"""
        plt.ion()  # 开启交互模式
        self.fig, self.axs = plt.subplots(2, 2, figsize=(15, 10))
        self.fig.suptitle('核反应堆运行状态监测', fontsize=16)
        
        # 初始化数据存储
        self.history = {
            'temperature': [],
            'power': [],
            'k_eff': [],
            'burnup': [],
            'control_rod': [],
            'steps': []
        }
        
        # 配置子图
        self.lines = {}
        
        # 温度和功率图
        self.axs[0, 0].set_title('温度和功率变化')
        self.axs[0, 0].set_xlabel('步数')
        self.lines['temp'], = self.axs[0, 0].plot([], [], 'r-', label='温度 (K)')
        self.lines['power'], = self.axs[0, 0].plot([], [], 'b-', label='功率 (MW)')
        self.axs[0, 0].legend()
        
        # k_eff图
        self.axs[0, 1].set_title('k_eff变化')
        self.axs[0, 1].set_xlabel('步数')
        self.lines['k_eff'], = self.axs[0, 1].plot([], [], 'g-', label='k_eff')
        self.axs[0, 1].axhline(y=1.0, color='r', linestyle='--', label='临界值')
        self.axs[0, 1].legend()
        
        # 控制棒位置图
        self.axs[1, 0].set_title('控制棒位置')
        self.axs[1, 0].set_xlabel('步数')
        self.lines['control'], = self.axs[1, 0].plot([], [], 'k-', label='控制棒位置')
        self.axs[1, 0].legend()
        
        # 燃耗图
        self.axs[1, 1].set_title('燃料燃耗')
        self.axs[1, 1].set_xlabel('步数')
        self.lines['burnup'], = self.axs[1, 1].plot([], [], 'm-', label='燃耗 (MWd/kgU)')
        self.axs[1, 1].legend()
        
        plt.tight_layout()

    def update_visualization(self):
        """更新可视化图表"""
        # 更新历史数据
        self.history['temperature'].append(self.temperature)
        self.history['power'].append(self.power)
        self.history['k_eff'].append(self.k_eff)
        self.history['burnup'].append(self.burnup)
        self.history['control_rod'].append(self.control_rod_pos)
        self.history['steps'].append(self.current_step)
        
        # 更新图表
        steps = self.history['steps']
        
        # 更新温度和功率
        self.lines['temp'].set_data(steps, self.history['temperature'])
        self.lines['power'].set_data(steps, self.history['power'])
        self.axs[0, 0].relim()
        self.axs[0, 0].autoscale_view()
        
        # 更新k_eff
        self.lines['k_eff'].set_data(steps, self.history['k_eff'])
        self.axs[0, 1].relim()
        self.axs[0, 1].autoscale_view()
        
        # 更新控制棒位置
        self.lines['control'].set_data(steps, self.history['control_rod'])
        self.axs[1, 0].relim()
        self.axs[1, 0].autoscale_view()
        
        # 更新燃耗
        self.lines['burnup'].set_data(steps, self.history['burnup'])
        self.axs[1, 1].relim()
        self.axs[1, 1].autoscale_view()
        
        plt.draw()
        plt.pause(0.01)

    def reset(self, seed=None):
        super().reset(seed=seed)
        self.current_step = 0
        self.temperature = 600  # K
        self.power = 1000      # MW
        self.k_eff = 1.0
        '''当 k_eff = 1，表示每一代中子产生的中子数量与上一代相等'''
        self.burnup = 0        # MWd/kgU
        self.control_rod_pos = 0.5
        
        # 初始化可视化
        self.init_visualization()
        
        return self._get_observation(), {}
    
    def _get_observation(self):
        return np.array([
            self.temperature,
            self.power,
            self.k_eff,
            self.control_rod_pos,
            self.burnup
        ], dtype=np.float32)
    
    def step(self, action):
        self.current_step += 1
        
        # 更新控制棒位置
        self.control_rod_pos = action / 10.0
        
        # 运行OpenMC模拟
        try:
            # 更新材料温度
            self.fuel.temperature = self.temperature
            
            # 运行临界计算
            openmc.run()
         
            # 获取k_eff
            with openmc.StatePoint("/home/unknowxxs/python/statepoint.100.h5") as sp:
                self.k_eff = sp.keff.nominal_value
                
            # 更新系统状态
            self._update_state()
            
            # 更新可视化
            self.update_visualization()
            
            # 计算奖励
            reward = self._calculate_reward()
            
            # 检查是否结束
            done = self.current_step >= self.max_steps or self._is_unsafe()
            
        except Exception as e:
            print(f"模拟过程出错: {e}")
            reward = -1000
            done = True
        
        return self._get_observation(), reward, done, False, {}
    
    def _update_state(self):
        # 基于k_eff更新功率
        power_factor = (self.k_eff - 1.0) * 5000
        self.power = np.clip(self.power + power_factor, 0, 3000)
        
        # 更新温度
        delta_temp = (self.power - 1000) * 0.1
        # 将温度调整到最接近的 100 的整数倍
        new_temperature =self.temperature + delta_temp   # round(self.temperature + delta_temp/ 100.0) * 100
        self.temperature = np.clip(new_temperature, 500, 1500)
        
        # 更新燃耗
        self.burnup += self.power * 0.001
        
    def _calculate_reward(self):
        reward = 0
        
        # 奖励稳定的运行状态
        reward -= abs(self.power - 1000) * 0.01  # 目标功率1000MW
        reward -= abs(self.k_eff - 1.0) * 100    # 目标k_eff=1
        reward -= abs(self.temperature - 900) * 0.1  # 目标温度900K
        
        # 惩罚不安全状态
        if self._is_unsafe():
            reward -= 1000
            
        return reward
    
    def _is_unsafe(self):
        return (self.temperature > 1400 or 
                self.power > 2500 or 
                self.k_eff > 1.2)

def train_agent():

    #创建环境更好的方法
    env = make_vec_env(NuclearReactorEnv, n_envs=4)
    
    model = PPO(
        "MlpPolicy",
        env,
        verbose=1,
        learning_rate=0.0003,
        n_steps=2048,
        batch_size=64,
        n_epochs=10
    )
    
    model.learn(total_timesteps=1000)
    model.save("ppo_nuclear_reactor")
    
    return model

def evaluate_agent(model, num_episodes=5):
    env = NuclearReactorEnv()
    
    for episode in range(num_episodes):
        obs, _ = env.reset()
        episode_reward = 0
        done = False
        
        while not done:
            action, _ = model.predict(obs)
            obs, reward, done, _, _ = env.step(action)
            episode_reward += reward
            
            # 打印当前状态
            print(f"步骤 {env.current_step}:")
            print(f"温度: {env.temperature:.1f}K")
            print(f"功率: {env.power:.1f}MW")
            print(f"k_eff: {env.k_eff:.3f}")
            print(f"控制棒位置: {env.control_rod_pos:.2f}")
            print(f"燃耗: {env.burnup:.2f}MWd/kgU")
            print("------------------------")
        
        plt.savefig(f'episode_{episode+1}_results.png')
        print(f"Episode {episode + 1}: 总奖励 = {episode_reward:.2f}\n")
    
    plt.close('all')

model = train_agent()
print("\n评估核反应堆控制性能：")
evaluate_agent(model)

```
Assistant: