编写程序模拟情绪能量数值,每日消耗值不可超过上限,多余能量全部用于创新探索。

用 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解决实际问题,如果你觉得这个工具好用,欢迎关注长安牧笛!