基于食物成分的消化速率与饱腹感规划系统
一、实际应用场景描述
场景背景:
某健康管理公司正在开发个性化饮食规划平台,帮助减肥人群和健身爱好者科学安排三餐。用户希望根据个人代谢情况和目标体重,获得精准的食物选择和进食时间安排。
业务需求:
1. 录入日常食物的营养成分数据
2. 计算不同食物的消化速率(Glycemic Response & Gastric Emptying Rate)
3. 预测饱腹感持续时间(Satiety Duration)
4. 根据目标热量缺口,智能推荐三餐搭配
5. 生成个性化饮食时间表
目标用户画像:
– 减脂期人群:需要控制总热量,延长饱腹感
– 增肌期人群:需要合理分配蛋白质,优化消化吸收
– 血糖管理人群:需要低GI食物,稳定血糖波动
二、引入痛点
痛点 传统解决方案 本方案优势
食物选择凭经验 查表+主观判断 数据驱动的科学计算
饱腹感预测不准 固定时间间隔 基于成分动态计算
热量控制粗糙 简单加减法 考虑食物热效应(TEF)
缺乏个性化 一刀切建议 结合个人代谢参数
执行难度大 复杂食谱 简单易用的规划工具
核心痛点: 传统饮食规划无法将食物微观成分与人体消化生理过程精确关联,导致"吃多少、何时吃"的决策缺乏科学依据。
三、核心逻辑讲解
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 输入食物成分 │────▶│ 计算消化速率 │────▶│ 预测饱腹感时长 │
│ 个人代谢参数 │ │ (胃排空模型) │ │ (饱腹感指数) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ 计算净热量摄入 │ │ 生成用餐时间表 │
│ (考虑TEF) │ │ (优化饱腹窗口) │
└─────────────────┘ └─────────────────┘
│ │
└──────────────┬──────────┘
▼
┌─────────────────┐
│ 输出三餐规划 │
│ 体重控制建议 │
└─────────────────┘
关键算法模型:
1. 消化速率模型(基于分子化学工程)
消化速率常数(k_d) = α × (碳水化合物%/100) / (脂肪%×β + 纤维%×γ)
理论基础:
– 碳水化合物水解速率取决于糖苷键类型和分子量分布
– 脂肪通过形成胶束延缓胃排空(Micelle Formation动力学)
– 膳食纤维增加食糜粘度,阻碍酶扩散(Mass Transfer阻力)
2. 饱腹感指数模型
饱腹感评分(Satiety Index) = w₁×蛋白质% + w₂×纤维% – w₃×血糖负荷(GL)
生理学基础:
– 蛋白质刺激CCK分泌最强(十二指肠I细胞)
– 纤维增加胃内容物体积,激活机械感受器
– GL反映葡萄糖释放速率对胰岛素峰值的影响
3. 胃排空时间预测
胃排空半衰期(t₁/₂) = τ × ln(2) / k_d
其中τ为个体特征常数(受年龄、性别、运动影响)
四、代码模块化实现
项目结构
diet_planning_system/
├── main.py # 主程序入口
├── nutrition_core.py # 营养计算核心引擎
├── digestion_models.py # 消化动力学模型
├── satiety_calculator.py # 饱腹感计算器
├── meal_planner.py # 三餐规划器
├── data_models.py # 数据模型定义
├── food_database.py # 食物数据库
├── config.py # 配置文件
├── utils.py # 工具函数
├── README.md # 项目说明
└── requirements.txt # 依赖清单
1. config.py – 配置文件
"""
饮食规划系统配置文件
包含消化动力学参数、饱腹感权重、代谢常数等
"""
from dataclasses import dataclass
from typing import Dict, Tuple
@dataclass
class DigestionConfig:
"""消化动力学配置"""
# 消化速率系数 (基于分子化学工程研究)
CARB_HYDROLYSIS_RATE: float = 0.85 # 碳水化合物水解速率常数
FAT_EMULSIFICATION_K: float = 0.32 # 脂肪乳化速率常数
FIBER_DIFFUSION_K: float = 0.15 # 纤维扩散阻力系数
# 胃排空基础参数
GASTRIC_EMPTYING_TAU: float = 45.0 # 基础胃排空时间常数(分钟)
INTESTINAL_TRANSIT_BASE: float = 180.0 # 小肠传输基础时间(分钟)
# 个体差异因子
AGE_FACTOR_SLOPE: float = -0.15 # 年龄对消化的影响斜率
GENDER_FACTOR_MALE: float = 1.12 # 男性修正因子
EXERCISE_FACTOR_ACTIVE: float = 1.25 # 活跃人群修正因子
@dataclass
class SatietyConfig:
"""饱腹感计算配置"""
# 饱腹感贡献权重 (基于Satiety Index研究)
PROTEIN_WEIGHT: float = 0.35 # 蛋白质饱腹感权重
FIBER_WEIGHT: float = 0.40 # 膳食纤维权重
GL_PENALTY_WEIGHT: float = 0.25 # 血糖负荷惩罚权重
# 宏量营养素热效应 (TEF)
TEF_PROTEIN: float = 0.20 # 蛋白质热效应 20%
TEF_CARB: float = 0.05 # 碳水化合物热效应 5%
TEF_FAT: float = 0.02 # 脂肪热效应 2%
# 饱腹感持续时间系数
SATIETY_DURATION_BASE: float = 120.0 # 基础饱腹时长(分钟)
SATIETY_DECAY_RATE: float = 0.008 # 饱腹感衰减率
@dataclass
class MetabolicConfig:
"""代谢参数配置"""
# 基础代谢率估算系数 (Mifflin-St Jeor Equation)
BMR_MALE_CONSTANT: float = 88.362
BMR_FEMALE_CONSTANT: float = 447.593
BMR_WEIGHT_COEFF: float = 13.397
BMR_HEIGHT_COEFF: float = 4.799
BMR_AGE_COEFF: float = 5.677
# 活动水平乘数
ACTIVITY_SEDENTARY: float = 1.2 # 久坐
ACTIVITY_LIGHT: float = 1.375 # 轻度活动
ACTIVITY_MODERATE: float = 1.55 # 中度活动
ACTIVITY_ACTIVE: float = 1.725 # 高度活动
ACTIVITY_VERY_ACTIVE: float = 1.9 # 极高活动
# 目标热量缺口 (安全减重范围)
MIN_CALORIE_DEFICIT: int = 300 # 最小缺口 kcal/day
MAX_CALORIE_DEFICIT: int = 750 # 最大缺口 kcal/day
RECOMMENDED_DEFICIT: int = 500 # 推荐缺口 kcal/day
# 全局配置实例
DEFAULT_DIGESTION_CONFIG = DigestionConfig()
DEFAULT_SATIETY_CONFIG = SatietyConfig()
DEFAULT_METABOLIC_CONFIG = MetabolicConfig()
# 常见食物数据库 (每100g可食用部分)
FOOD_DATABASE_TEMPLATE = {
"燕麦片": {
"calories": 389, "protein": 16.9, "carb": 66.3, "fat": 6.9,
"fiber": 10.6, "gi": 55, "water": 8.0, "category": "谷物"
},
"鸡胸肉": {
"calories": 165, "protein": 31.0, "carb": 0.0, "fat": 3.6,
"fiber": 0.0, "gi": 0, "water": 65.0, "category": "肉类"
},
"糙米": {
"calories": 348, "protein": 7.9, "carb": 73.7, "fat": 2.9,
"fiber": 3.5, "gi": 68, "water": 12.0, "category": "谷物"
},
"西兰花": {
"calories": 34, "protein": 2.8, "carb": 6.6, "fat": 0.4,
"fiber": 2.6, "gi": 15, "water": 89.3, "category": "蔬菜"
},
"希腊酸奶": {
"calories": 59, "protein": 10.0, "carb": 3.6, "fat": 0.4,
"fiber": 0.0, "gi": 14, "water": 85.0, "category": "乳制品"
},
"牛油果": {
"calories": 160, "protein": 2.0, "carb": 8.5, "fat": 14.7,
"fiber": 6.7, "gi": 15, "water": 73.2, "category": "水果"
},
"鸡蛋": {
"calories": 155, "protein": 13.0, "carb": 1.1, "fat": 11.0,
"fiber": 0.0, "gi": 48, "water": 74.6, "category": "蛋类"
},
"红薯": {
"calories": 86, "protein": 1.6, "carb": 20.1, "fat": 0.1,
"fiber": 3.0, "gi": 54, "water": 77.3, "category": "薯类"
},
"三文鱼": {
"calories": 208, "protein": 20.4, "carb": 0.0, "fat": 13.4,
"fiber": 0.0, "gi": 0, "water": 61.0, "category": "鱼类"
},
"杏仁": {
"calories": 579, "protein": 21.2, "carb": 21.6, "fat": 49.9,
"fiber": 12.5, "gi": 15, "water": 4.7, "category": "坚果"
}
}
2. data_models.py – 数据模型
"""
数据模型定义模块
使用Python dataclass实现类型安全的营养数据模型
"""
from dataclasses import dataclass, field
from typing import Dict, List, Optional
from datetime import datetime
from enum import Enum
class Gender(Enum):
"""性别枚举"""
MALE = "male"
FEMALE = "female"
class ActivityLevel(Enum):
"""活动水平枚举"""
SEDENTARY = "sedentary" # 久坐
LIGHT = "light" # 轻度活动
MODERATE = "moderate" # 中度活动
ACTIVE = "active" # 高度活动
VERY_ACTIVE = "very_active" # 极高活动
class MealType(Enum):
"""餐次类型枚举"""
BREAKFAST = "breakfast"
LUNCH = "lunch"
DINNER = "dinner"
SNACK = "snack"
@dataclass
class FoodItem:
"""
食物项目数据类
属性说明:
– name: 食物名称
– calories: 热量 (kcal/100g)
– protein: 蛋白质含量 (%)
– carb: 碳水化合物含量 (%)
– fat: 脂肪含量 (%)
– fiber: 膳食纤维含量 (%)
– gi: 升糖指数
– water: 水分含量 (%)
– category: 食物类别
"""
name: str
calories: float
protein: float
carb: float
fat: float
fiber: float
gi: int
water: float
category: str
def __post_init__(self):
"""初始化后验证数据有效性"""
total_macro = self.protein + self.carb + self.fat
if total_macro > 100:
raise ValueError(f"宏量营养素总和不能超过100%,当前: {total_macro}%")
if not 0 <= self.gi <= 100:
raise ValueError(f"GI值必须在0-100之间,当前: {self.gi}")
if not 0 <= self.water <= 100:
raise ValueError(f"水分含量必须在0-100之间,当前: {self.water}")
@dataclass
class UserProfile:
"""
用户档案数据类
包含个人基本信息与代谢参数
"""
user_id: str = field(default_factory=lambda: f"user_{datetime.now().strftime('%Y%m%d_%H%M%S')}")
name: str = ""
age: int = 25
gender: Gender = Gender.MALE
height_cm: float = 170.0
weight_kg: float = 70.0
activity_level: ActivityLevel = ActivityLevel.MODERATE
target_weight_kg: Optional[float] = None
dietary_restrictions: List[str] = field(default_factory=list)
@property
def bmr(self) -> float:
"""
计算基础代谢率 (Mifflin-St Jeor Equation)
Returns:
BMR值 (kcal/day)
"""
if self.gender == Gender.MALE:
bmr = (DEFAULT_METABOLIC_CONFIG.BMR_MALE_CONSTANT +
DEFAULT_METABOLIC_CONFIG.BMR_WEIGHT_COEFF * self.weight_kg +
DEFAULT_METABOLIC_CONFIG.BMR_HEIGHT_COEFF * self.height_cm –
DEFAULT_METABOLIC_CONFIG.BMR_AGE_COEFF * self.age)
else:
bmr = (DEFAULT_METABOLIC_CONFIG.BMR_FEMALE_CONSTANT +
DEFAULT_METABOLIC_CONFIG.BMR_WEIGHT_COEFF * self.weight_kg +
DEFAULT_METABOLIC_CONFIG.BMR_HEIGHT_COEFF * self.height_cm –
DEFAULT_METABOLIC_CONFIG.BMR_AGE_COEFF * self.age)
return round(bmr, 2)
@property
def tdee(self) -> float:
"""
计算每日总能量消耗 (Total Daily Energy Expenditure)
Returns:
TDEE值 (kcal/day)
"""
activity_multipliers = {
ActivityLevel.SEDENTARY: DEFAULT_METABOLIC_CONFIG.ACTIVITY_SEDENTARY,
ActivityLevel.LIGHT: DEFAULT_METABOLIC_CONFIG.ACTIVITY_LIGHT,
ActivityLevel.MODERATE: DEFAULT_METABOLIC_CONFIG.ACTIVITY_MODERATE,
ActivityLevel.ACTIVE: DEFAULT_METABOLIC_CONFIG.ACTIVITY_ACTIVE,
ActivityLevel.VERY_ACTIVE: DEFAULT_METABOLIC_CONFIG.ACTIVITY_VERY_ACTIVE
}
return round(self.bmr * activity_multipliers[self.activity_level], 2)
@property
def recommended_calorie_intake(self) -> float:
"""
计算推荐每日热量摄入
Returns:
推荐热量 (kcal/day)
"""
if self.target_weight_kg and self.target_weight_kg < self.weight_kg:
# 减重模式:创造热量缺口
deficit = DEFAULT_METABOLIC_CONFIG.RECOMMENDED_DEFICIT
return max(self.tdee – deficit, self.bmr)
return self.tdee
@dataclass
class DigestionResult:
"""
消化分析结果数据类
"""
food_item: FoodItem
digestion_rate_constant: float # 消化速率常数 k_d (min⁻¹)
gastric_emptying_halflife: float # 胃排空半衰期 (分钟)
glycemic_response_curve: List[Tuple[float, float]] # 血糖响应曲线
estimated_absorption_time: float # 预计完全吸收时间 (分钟)
tef_contribution: float # 食物热效应贡献 (kcal)
@dataclass
class SatietyResult:
"""
饱腹感分析结果数据类
"""
food_item: FoodItem
satiety_index: float # 饱腹感指数 (0-100)
predicted_duration_minutes: float # 预测饱腹时长 (分钟)
fullness_onset_minutes: float # 饱腹感开始时间 (分钟)
hunger_return_risk: str # 饥饿回归风险等级
@dataclass
class MealPlan:
"""
餐次规划数据类
"""
meal_type: MealType
planned_foods: List[FoodItem]
total_calories: float
total_protein_g: float
total_carb_g: float
total_fat_g: float
average_satiety_duration: float
recommended_eating_time: str
digestion_completion_time: str
3. digestion_models.py – 消化动力学模型
"""
消化动力学模型模块
基于分子化学工程和生理学研究实现食物消化模拟
"""
import math
from typing import List, Tuple
from dataclasses import dataclass
from data_models import FoodItem, DigestionResult
from config import DEFAULT_DIGESTION_CONFIG, DEFAULT_SATIETY_CONFIG
class DigestionSimulator:
"""
消化模拟器类
基于分子化学工程原理模拟食物在人体内的消化过程:
1. 口腔阶段:淀粉初步水解
2. 胃阶段:蛋白质变性,脂肪乳化
3. 小肠阶段:酶促反应,营养吸收
4. 大肠阶段:纤维发酵
核心理论:
– Michaelis-Menten酶动力学
– 胶体化学乳化理论
– 传质扩散模型
"""
def __init__(self, config: DEFAULT_DIGESTION_CONFIG = None):
"""
初始化消化模拟器
Args:
config: 消化动力学配置
"""
self.config = config or DEFAULT_DIGESTION_CONFIG
def calculate_digestion_rate(self, food: FoodItem, user_profile=None) -> float:
"""
计算食物消化速率常数 k_d
数学模型:
k_d = α × (Carb%/100) / (Fat%×β + Fiber%×γ)
理论基础:
1. 碳水化合物水解速率与糖苷键密度成正比
2. 脂肪通过形成胶束(Micelle)延缓胃排空
3. 膳食纤维增加食糜粘度,阻碍酶扩散
Args:
food: 食物项目
user_profile: 用户档案(用于个体化修正)
Returns:
消化速率常数 k_d (min⁻¹)
"""
carb_ratio = food.carb / 100.0
fat_factor = food.fat * self.config.FAT_EMULSIFICATION_K
fiber_factor = food.fiber * self.config.FIBER_DIFFUSION_K
# 基础消化速率
k_d = self.config.CARB_HYDROLYSIS_RATE * carb_ratio / (fat_factor + fiber_factor + 0.001)
# 个体化修正
if user_profile:
# 年龄修正:消化功能随年龄下降
age_factor = 1.0 + self.config.AGE_FACTOR_SLOPE * (user_profile.age – 25)
k_d *= max(age_factor, 0.7)
# 性别修正:男性胃酸分泌通常更强
if user_profile.gender == Gender.MALE:
k_d *= self.config.GENDER_FACTOR_MALE
# 运动修正:活跃人群消化酶活性更高
if user_profile.activity_level in [ActivityLevel.ACTIVE, ActivityLevel.VERY_ACTIVE]:
k_d *= self.config.EXERCISE_FACTOR_ACTIVE
return round(max(k_d, 0.01), 4) # 确保最小值
def predict_gastric_emptying(self, food: FoodItem, user_profile=None) -> float:
"""
预测胃排空半衰期
数学模型:
t₁/₂ = τ × ln(2) / k_d
生理学基础:
– 液体排空最快(约15-30分钟)
– 碳水化合物次之(约1-2小时)
– 蛋白质较慢(约2-4小时)
– 脂肪最慢(约4-6小时)
Args:
food: 食物项目
user_profile: 用户档案
Returns:
胃排空半衰期 (分钟)
"""
k_d = self.calculate_digestion_rate(food, user_profile)
tau = self.config.GASTRIC_EMPTYING_TAU
# 食物形态修正
if food.category in ["液体", "饮品"]:
tau *= 0.4
elif food.category in ["水果", "蔬菜"]:
tau *= 0.7
elif food.category in ["肉类", "鱼类"]:
tau *= 1.5
elif food.category in ["坚果", "种子"]:
tau *= 1.8
half_life = tau * math.log(2) / k_d
return round(half_life, 2)
def simulate_glycemic_response(self, food: FoodItem) -> List[Tuple[float, float]]:
"""
模拟血糖响应曲线
数学模型:
G(t) = GI × C_max × exp(-t/τ) × (1 – exp(-k_a × t))
参数说明:
– GI: 升糖指数
– C_max: 峰值血糖浓度系数
– τ: 衰减时间常数
– k_a: 吸收速率常数
Args:
food: 食物项目
Returns:
血糖响应曲线数据点 [(时间min, 血糖相对值), …]
"""
gi_normalized = food.gi / 100.0
carb_concentration = food.carb / 100.0
# 曲线参数
c_max = gi_normalized * carb_concentration * 1.2
tau = 45.0 # 衰减时间常数 (分钟)
k_a = self.calculate_digestion_rate(food) * 1.5 # 吸收速率
curve_points = []
time_points = [0, 15, 30, 45, 60, 90, 120, 150, 180]
for t in time_points:
# 血糖响应方程
absorption_term = 1 – math.exp(-k_a * t)
decay_term = math.exp(-t / tau)
glucose_response = gi_normalized * c_max * decay_term * absorption_term
curve_points.append((t, round(glucose_response, 3)))
return curve_points
def estimate_absorption_time(self, food: FoodItem, user_profile=None) -> float:
"""
估计营养完全吸收时间
综合胃排空和小肠传输时间
Args:
food: 食物项目
user_profile: 用户档案
Returns:
完全吸收时间 (分钟)
"""
gastric_t_half = self.predict_gastric_emptying(food, user_profile)
# 小肠传输时间(与食物类型相关)
if food.fiber > 5.0:
intestinal_time = self.config.INTESTINAL_TRANSIT_BASE * 1.3
else:
intestinal_time = self.config.INTESTINAL_TRANSIT_BASE
# 总吸收时间 = 4 × 胃排空半衰期 + 小肠传输
total_time = 4 * gastric_t_half + intestinal_time
return round(total_time, 2)
def calculate_tef(self, food: FoodItem) -> float:
"""
计算食物热效应 (Thermic Effect of Food)
不同宏量营养素的TEF:
– 蛋白质: 20-30% (平均20%)
– 碳水化合物: 5-10% (平均5%)
– 脂肪: 0-3% (平均2%)
Args:
food: 食物项目
Returns:
TEF贡献热量 (kcal)
"""
protein_tef = food.protein / 100 * food.calories * DEFAULT_SATIETY_CONFIG.TEF_PROTEIN
carb_tef = food.carb / 100 * food.calories * DEFAULT_SATIETY_CONFIG.TEF_CARB
fat_tef = food.fat / 100 * food.calories * DEFAULT_SATIETY_CONFIG.TEF_FAT
return round(protein_tef + carb_tef + fat_tef, 2)
def analyze_food_digestion(self, food: FoodItem, user_profile=None) -> DigestionResult:
"""
执行完整的食物消化分析
Args:
food: 食物项目
user_profile: 用户档案
Returns:
DigestionResult: 完整消化分析结果
"""
k_d = self.calculate_digestion_rate(food, user_profile)
gastric_halflife = self.predict_gastric_emptying(food, user_profile)
glycemic_curve = self.simulate_glycemic_response(food)
absorption_time = self.estimate_absorption_time(food, user_profile)
tef = self.calculate_tef(food)
return DigestionResult(
food_item=food,
digestion_rate_constant=k_d,
gastric_emptying_halflife=gastric_halflife,
glycemic_response_curve=glycemic_curve,
estimated_absorption_time=absorption_time,
tef_contribution=tef
)
class MolecularMechanismExplainer:
"""
分子机制解释器
将数学模型的化学工程原理转化为易懂的解释
"""
@staticmethod
def explain_digestion_rate(food: FoodItem) -> str:
"""
解释特定食物的消化速率机制
Args:
food: 食物项目
Returns:
机制解释文本
"""
explanations = []
# 碳水化合物影响
if food.carb > 50:
explanations.append(
f"• 高碳水化合物含量({food.carb}%)提供大量可水解糖苷键,"
f"促进淀粉酶作用,加快消化速率"
)
# 脂肪影响
if food.fat > 10:
explanations.append(
f"• 脂肪含量({food.fat}%)较高,需经胆汁盐乳化形成胶束(Micelle),"
f"显著延缓胃排空和酶解过程"
)
# 纤维影响
if food.fiber > 5:
explanations.append(
f"• 膳食纤维({food.fiber}%)增加食糜粘度,"
f"阻碍酶分子扩散,降低有效碰撞频率"
)
# 蛋白质影响
if food.protein > 20:
explanations.append(
f"• 高蛋白含量({food.protein}%)需经胃蛋白酶和胰蛋白酶逐步水解,"
f"形成肽链和氨基酸,消化时间相对较长"
)
if not explanations:
explanations.append("• 该食物成分均衡,消化过程相对平稳")
return "\\n".join(explanations)
@staticmethod
def explain_satiety_mechanism(food: FoodItem) -> str:
"""
解释饱腹感产生机制
Args:
food: 食物项目
Returns:
机制解释文本
"""
mechanisms = []
# 胃扩张机制
water_content = food.water
if water_content > 80:
mechanisms.append(
f"• 高水分含量({water_content}%)迅速填充胃部容积,"
f"激活机械感受器(stretch receptors),触发迷走神经饱腹信号"
)
# 激素调节机制
if food.protein > 15:
mechanisms.append(
f"• 充足蛋白质({food.protein}%)强烈刺激十二指肠CCK(Cholecystokinin)分泌,"
f"抑制胃排空并促进胰腺酶释放"
)
# 血糖稳态机制
if food.gi < 35:
mechanisms.append(
f"• 低血糖指数(GI={food.gi})意味着葡萄糖缓慢释放,"
f"避免胰岛素峰值导致的血糖骤降和饥饿感反弹"
)
# 纤维发酵机制
if food.fiber > 8:
mechanisms.append(
f"• 丰富膳食纤维({food.fiber}%)在结肠发酵产生短链脂肪酸(SCFA),"
f"调节食欲相关激素(如GLP-1、PYY)分泌"
)
return "\\n".join(mechanisms)
4. satiety_calculator.py – 饱腹感计算器
"""
饱腹感计算器模
利用AI解决实际问题,如果你觉得这个工具好用,欢迎关注长安牧笛!

