jxx123/simglucose
A Type-1 Diabetes simulator implemented in Python for Reinforcement Learning purpose
simglucose – 用于强化学习研究的1型糖尿病模拟器
是什么 – simglucose 是一个 Python 包,复现了 FDA 批准的 UVa/Padova T1-D 糖尿病模拟器(2008 版本)。它提供了一个虚拟患者环境,可由任何控制算法(经典 PID、模型预测控制或学习代理)驱动,并打包为与 OpenAI Gym(及 Gymnasium)API 兼容的环境,使其“具备强化学习就绪”特性。
为何重要 – 训练或评估用于血糖控制的 RL 代理通常成本高昂且风险较高。simglucose 提供了 30 个预定义的虚拟患者(10 名青少年、10 名成人、10 名儿童),具有现实的生理参数,使研究人员能够快速、可复现地测试胰岛素输送策略。
主要特性(如 README 所述)
- Gym 兼容环境 – 实现标准的
observation, reward, done, info步骤签名。兼容gym和更新的gymnasium库。 - 可自定义奖励 – 默认奖励为临床风险指数的降低;用户可提供基于过去一小时血糖值的任意函数。
- 并行模拟 – 可通过
pathos多进程库同时模拟多个患者(可选,可禁用)。 - 场景生成 – 内置随机场景生成器和
CustomScenario类,用于用户自定义餐食时间/大小序列。 - 控制器框架 – 提供最小的基线-追加控制器和一个简单基类(
Controller),用户可扩展以插入自己的算法(PID、MPC、RL 等)。 - 可视化 – 运行后可自动绘制葡萄糖轨迹、CVGA(控制变异性网格分析)、区域统计和风险指数摘要。
- 命令行 UI – 交互式 CLI(
simulate())可引导用户无需编写代码即可完成场景设置。 - 支持 rllab – 可选集成
rllab强化学习库,用于 DDPG 等高级算法。
安装
# 推荐 – 从 PyPI 安装
pip install simglucose
# 获取最新代码或本地开发
git clone https://github.com/jxx123/simglucose.git
cd simglucose
pip install -e . # 可编辑安装
需要 Python ≥ 3.9(3.7/3.8 已不再支持)
快速入门示例(Gym)
import gym
from gym.envs.registration import register
from simglucose.simulation.scenario import CustomScenario
from datetime import datetime
# 定义一个简单的餐食场景
scenario = CustomScenario(start_time=datetime(2018,1,1), scenario=[(1,20)])
register(
id='simglucose-adolescent2-v0',
entry_point='simglucose.envs:T1DSimEnv',
kwargs={'patient_name': 'adolescent#002', 'custom_scenario': scenario}
)
env = gym.make('simglucose-adolescent2-v0')
obs = env.reset()
for t in range(100):
env.render(mode='human')
action = env.action_space.sample() # 随机基础胰岛素
obs, reward, done, info = env.step(action)
if done:
break
相同环境可与任何期望 Gym 接口的 RL 库一起使用。
使用自定义控制器
from simglucose.simulation.user_interface import simulate
from simglucose.controller.base import Controller, Action
class MyController(Controller):
def __init__(self, init_state):
self.state = init_state
def policy(self, observation, reward, done, **info):
# 非常简单的策略 – 不注射胰岛素
return Action(basal=0, bolus=0)
def reset(self):
self.state = 0
simulate(controller=MyController(0))
将 MyController 替换为学习策略、PID 等,模拟器将为其提供观测并收集奖励。
高级批量模拟
README 中展示了如何构建 SimObj 对象,单独使用 sim() 运行,或使用 batch_sim(parallel=True) 并行运行多个实例。这对于超参数扫描或在全患者队列中比较多个控制器非常有用。
文档与资源
- 患者参数表 –
definitions_of_vpatient_parameters.md列出了每个虚拟患者的生理常数。 - 风险指数 – 默认奖励使用《糖尿病技术与治疗》(2008)中的临床风险指标。
- 示例 – 仓库包含
examples/目录下的可运行脚本,涵盖 Gym、Gymnasium、PID 控制和离线分析。 - 引用 – 若发表成果,请引用:Jinyu Xie. Simglucose v0.2.1 (2018). https://github.com/jxx123/simglucose。
适用人群
- 强化学习研究人员:构建胰岛素输送代理。
- 生物医学工程师:在临床试验前原型化控制算法。
- 教育工作者:在课堂上展示闭环血糖控制。
提及的限制
- 由于 Matplotlib 线程安全性问题,macOS 上无法同时启用
animate和parallel。 - Windows 支持未经测试。
- 本包仅用于研究;不是医疗设备。
社区
欢迎通过 GitHub 问题追踪器提交问题和拉取请求。贡献指南遵循 scikit-learn 模式(fork → branch → PR)。
总结 – simglucose 提供了一个真实、开源的 T1-D 模拟环境,可直接接入标准 RL 工具链,支持快速开发和基准测试血糖控制算法。
相关
- 项目
- 项目
- 项目
- 项目
- 项目