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 上无法同时启用 animateparallel
  • Windows 支持未经测试。
  • 本包仅用于研究;不是医疗设备。

社区

欢迎通过 GitHub 问题追踪器提交问题和拉取请求。贡献指南遵循 scikit-learn 模式(fork → branch → PR)。


总结simglucose 提供了一个真实、开源的 T1-D 模拟环境,可直接接入标准 RL 工具链,支持快速开发和基准测试血糖控制算法。

相关

  • 项目
  • 项目
  • 项目
  • 项目
  • 项目