编写程序模拟情绪能量数值,每日消耗值不可超过上限,多余能量全部用于创新探索。
用 Python 模拟情绪能量:当心理健康遇见创新能力
一、实际应用场景描述
先说一个你可能也经历过的情况。
周三下午三点,你坐在工位上,盯着屏幕,光标在文档里闪了十分钟。上午开了两个会,中午被同事拉去吃了顿"团建午餐",下午还有一个评审要参加。你发现自己不是在"累",而是在"空"——一种连想点新点子都觉得奢侈的状态。
这时候如果有人让你"发挥创造力",你会想打人。
这不是意志力问题,是能量分配问题。
心理学和管理学里有个被广泛讨论的观点:人的情绪能量(emotional energy)是一种有限的可再生资源。它每天有一个上限,被各种活动消耗,也会通过睡眠、运动、冥想等途径恢复。当消耗逼近上限时,认知能力、情绪调节能力和创造力会非线性下降。
而"创新能力"恰好是能量预算中最容易被砍掉的一项——因为它不是紧急的,它不催你,它只会在你有余力时才出现。
所以我想做一件事:用 Python 把这套机制量化出来,写成可运行的代码。
二、痛点引入:为什么需要这个工具
常见困境 本质问题
每天都很忙,但什么都没推进 能量全消耗在"响应型"事务上
想搞副业/做创作,总提不起劲 创新活动排在能量链最末端
情绪莫名低落,找不到原因 缺乏对自身能量波动的可观测性
学了时间管理,依然觉得累 时间 ≠ 能量,管理错维度了
核心矛盾:我们管理的是"时间",但消耗的却是"能量"。时间是均匀的,能量不是。
现有工具(番茄钟、待办清单、日历)几乎都在时间维度上做优化,很少有工具帮你回答这个问题:
"我今天还剩多少心理能量,能不能拿出一小时来搞点创造性的事?"
这就是这个程序想回答的问题。
三、核心逻辑讲解
整个系统的逻辑可以用三句话讲完:
1. 每天有一个情绪能量上限,由睡眠质量、运动量、初始情绪决定。
2. 每项活动按权重消耗能量,有的活动(如深度工作)贵,有的(如运动)反而补充。
3. 当日消耗不超过上限,消耗完后强制停止;一天结束时,剩余能量全部自动转入"创新探索池"。
就这么简单。但要把它写成健壮的代码,需要拆成几个模块:
┌─────────────────────────────────────────┐
│ 配置层 (Constants) │
│ 能量上限、活动权重、风险阈值 │
├─────────────────────────────────────────┤
│ 能量引擎 (EnergyEngine) │
│ 调整上限 → 逐项消耗 → 风险判定 │
├─────────────────────────────────────────┤
│ 模拟器 (EnergySimulator) │
│ 批量生成多日数据、导出报告 │
├─────────────────────────────────────────┤
│ 可视化 (plot_weekly_trend) │
│ 绘制能量消耗与创新分配趋势图 │
├─────────────────────────────────────────┤
│ CLI 入口 (main) │
│ 命令行交互、格式化输出 │
└─────────────────────────────────────────┘
关键设计决策:
- 能量上限不是固定的 100 点,而是根据三个因子动态计算。睡得好 + 运动了 + 心情不错 → 上限高;反之则低。这比固定值更贴近真实。
- 活动有权重系数。深度工作全额消耗(×1.0),社交打八折(×0.8),浅层工作六折(×0.6)。运动和冥想是"负消耗"——它们恢复能量。
- 风险分四级:safe → moderate → high → exceeded,对应不同建议。超过 85% 就亮红灯。
- 创新分配是"被动的"。程序不会告诉你"你应该创新",而是诚实告诉你"你今天剩了多少可以创新"。有时候答案是 0,这也是有价值的信息。
四、代码模块化讲解(带注释)
4.1 配置层:常量集中管理
# 活动类型权重(正数=消耗,负数=恢复)
ACTIVITY_WEIGHTS = {
"deep_work": 1.0, # 深度工作:全额消耗
"shallow_work": 0.6, # 浅层工作:六折
"social": 0.8, # 社交:八折
"learning": 0.9, # 学习:九折
"exercise": -0.3, # 运动:恢复能量
"meditation": -0.5, # 冥想:恢复更多
"sleep": -0.6, # 高质量睡眠:最大恢复
}
# 风险阈值
HIGH_RISK_RATIO = 0.85 # 超过85% → 高风险
MEDIUM_RISK_RATIO = 0.60 # 超过60% → 中等
为什么要抽成常量? 因为后续想做实验(比如"如果社交权重降低会怎样"),改一个数字就行,不用翻逻辑代码。这是三年全栈开发养成的习惯:配置和逻辑分离。
4.2 能量引擎:核心计算单元
def adjust_cap_by_factors(self, sleep_quality: float,
exercise_min: int, mood_score: float) -> int:
"""根据三大因子动态调整当日能量上限"""
factor = (sleep_quality * 0.4 # 睡眠占40%权重
+ mood_score * 0.3 # 情绪占30%
+ min(exercise_min / 60, 1.0) * 10 * 0.3) # 运动占30%
self.daily_cap = int(60 + factor * 7) # 映射到 60~130 区间
self.remaining = self.daily_cap
return self.daily_cap
这个公式不是"科学真理",而是一个可解释的模型。 60 是底线(病了也得有基本功能),130 是天花板(再怎么状态好也不能无限)。权重比例可以讨论、可以调,这正是量化思维的好处——所有假设都摆在台面上。
def consume(self, activity_type: str, duration_min: int,
intensity: float = 1.0) -> dict:
"""执行一次能量消耗操作"""
weight = ACTIVITY_WEIGHTS[activity_type]
raw_cost = duration_min * 0.5 * weight * intensity
if weight < 0:
# 恢复类活动:remaining 增加(但不超过上限)
self.remaining = min(self.daily_cap, self.remaining - raw_cost)
else:
# 消耗类活动:不能超过剩余值
actual_cost = min(self.remaining, raw_cost)
self.remaining -= actual_cost
self.consumed += actual_cost
注意这里的一个细节:
"min(self.remaining, raw_cost)"。这是"每日消耗不可超过上限"的硬约束。你不能透支明天的能力来应付今天——至少在这个模型里不行。
4.3 创新分配:一天的收尾
def allocate_innovation(self) -> float:
"""将剩余能量全部分配至创新探索池"""
if self.remaining >= INNOVATION_MIN_THRESHOLD: # 至少5点才分配
allocated = self.remaining
else:
allocated = 0.0
self.remaining = 0.0 # 清零,明天重置
return round(allocated, 2)
为什么要设 5 点的门槛? 因为少于 5 点能量做创造性工作,效率极低,不如休息。这也是从实际经验中来的——疲劳状态下的"创新"往往是在制造垃圾。
4.4 模拟器:批量生成数据
def simulate_week(self, start_date: str = "2025-01-06") -> list[DayRecord]:
"""模拟一周数据,因子随机波动"""
for i in range(7):
sleep_q = round(random.uniform(4.0, 9.5), 1) # 睡眠随机
exercise = random.choice([0, 20, 30, 45, 60]) # 运动随机
mood = round(random.uniform(3.0, 9.0), 1) # 情绪随机
self.engine.adjust_cap_by_factors(sleep_q, exercise, mood)
# ...生成活动并模拟
模拟器的价值在于:你可以跑 1000 次模拟,统计"平均每周有多少能量能用于创新",从而反推自己需要怎样的生活习惯才能支撑创造力。
4.5 运行效果
实际运行
"python run_demo.py" 后,你会看到类似输出:
📅 2025-01-08 能量报告
┌──────────────────────────────────────────┐
│ 能量上限 : 98 点 │
│ 已消耗 : 57.0 点 ████████████░░░░░░│
│ 创新分配 : 41.0 点 💡 │
│ 风险等级 : safe │
│ 建议 : 能量状态健康,维持当前节奏。 │
└──────────────────────────────────────────┘
这一天状态很好:睡眠充足、运动了、情绪平稳,能量上限 98 点,只消耗了 57 点,剩下 41 点全部可以拿去做创造性的事。
而另一天可能是这样的:
📅 2025-01-09 能量报告
│ 能量上限 : 91 点 │
│ 已消耗 : 91.0 点 ██████████████████│
│ 创新分配 : 0.0 点 💡 │
│ 风险等级 : exceeded │
│ 建议 : 能量已透支!需启动应急恢复机制 │
这天没有创新余量,这不是你的错,是信号。 明天该多睡会儿,或者推掉一个不必要的会。
五、README 文件与使用说明
项目附带了完整的 README.md,包含:
- 项目简介:用一段话讲清楚是什么、解决什么问题
- 项目结构:五个文件的职责说明
- 环境要求:Python 3.10+,matplotlib 可选
- 快速开始:
"python run_demo.py" 三步出结果
- 核心 API 速览:五个方法调用示例
- 设计原则表:可量化、可观测、可扩展、无副作用
- 免责声明:明确标注"教学演示工具,不构成医学建议"
使用方式极简:
# 1. 克隆或下载项目
# 2. 安装可选依赖(用于绘图)
pip install matplotlib
# 3. 运行
python run_demo.py
# 4. 查看生成的文件
# energy_report.json ← 结构化数据
# trend.png ← 可视化趋势图
如果你想在自己的项目里嵌入这个引擎:
from emotion_energy_system import EnergyEngine
engine = EnergyEngine()
engine.adjust_cap_by_factors(sleep_quality=8.0, exercise_min=40, mood_score=7.5)
engine.consume("deep_work", 90, intensity=1.0)
engine.consume("social", 30, intensity=0.8)
print(f"剩余能量: {engine.remaining}")
print(f"创新分配: {engine.allocate_innovation()}")
print(f"风险等级: {engine.get_risk_level()}")
就这么几行,不需要任何前端、不需要数据库、不需要注册登录。
六、核心知识点卡片
下面是本文涉及的跨学科知识点,每张卡片包含来源领域和一句话要点:
📘 卡片 1:情绪能量有限性假设
- 领域:积极心理学 / 组织行为学
- 来源:Fredrickson 的"积极情绪扩展建构理论";Baumeister 的"自我控制资源模型"
- 要点:人的心理资源像肌肉一样会疲劳,需要恢复周期
📘 卡片 2:创新能力的能量依赖
- 领域:创造力研究 / 认知科学
- 来源:Amabile 的"创造力 componential model"
- 要点:创造力需要认知余量(cognitive slack),能量耗尽时只会产出"安全但平庸"的方案
📘 卡片 3:加权消耗模型
- 领域:软件工程 / 系统设计
- 要点:用权重系数区分活动类型,比"每项活动等同消耗"更贴近现实
📘 卡片 4:资源池模式(Resource Pool Pattern)
- 领域:软件设计模式
- 要点:EnergyEngine 本质是一个资源池,有上限、有分配、有回收、有溢出处理
📘 卡片 5:可观测性(Observability)
- 领域:SRE / 系统工程
- 要点:不可观测的系统无法优化。把能量变成数字,才能做趋势分析和决策
📘 卡片 6:风险分级与熔断机制
- 领域:金融风控 / 系统安全
- 要点:85% 阈值触发预警,100% 触发熔断——和电路保护器原理一样
七、去营销化声明
这里必须说几句"去营销化"的话:
1. 这个程序不会让你"逆袭"或"开挂"。 它只是一个镜子,照出你能量分配的真实情况。
2. 公式里的权重和阈值是我根据课程内容和常识设定的,不是科学定论。 你可以、也应该根据自己的体感去调整。
3. 它没有采集你的任何真实数据。 所有输入都是手动的或随机模拟的。如果你愿意用它记录真实生活,数据存在本地 JSON 里,不上传任何服务器。
4. 它不是心理健康诊断工具。 如果你真的在经历情绪困扰,请寻求专业帮助,而不是调参。
5. 代码是 MIT 协议的,随便改、随便用、随便商用。 我不留版权声明、不放公众号二维码、不要求你转发。
八、总结
写这个工具的初衷很简单:我想搞清楚自己为什么有些天能写代码写到忘我,有些天连邮件都不想回。
答案不是"自律"或"不自律",而是能量。
代码本身不复杂——一个 Engine 类、一个 Simulator 类、几百行代码。但它的价值在于建模思维:
当你把模糊的感受变成可计算的数值,你就能对它做实验、画图表、找规律、做决策。
三个最实用的收获:
1. 运动不是"浪费时间",是"能量投资"。 模型里运动的 ROI 是最高的——30 分钟运动换来的是整个下午更高的能量上限。
2. 社交是有成本的。 不是叫你自闭,而是要有意识地安排"社交密集型日子"之后的恢复期。
3. 创新不是挤出来的,是余出来的。 如果你今天没有余量,别硬逼自己"要有创造力"。先恢复,再创造。
最后,代码已经全部开源在项目中,README 有完整说明。你可以直接
"python run_demo.py" 跑起来,也可以把 EnergyEngine 嵌到你自己的日记工具、TODO 应用或 Telegram Bot 里。
工具是冷的,但认识自己是温暖的。
利用AI解决实际问题,如果你觉得这个工具好用,欢迎关注长安牧笛!