
春节串门这件事,最累的往往不是人情世故,是路线。
你以为自己只是“去看看亲戚”,实际上你在做一个隐形的优化问题:
- 亲戚分布在不同地点
- 每家都有一个“最佳到访时间”(太早扰人、太晚尴尬)
- 你有体力和情绪的上限
- 还要躲开堵车、饭点、娃睡觉
这像什么?像路径规划。
而且是那种典型的:约束一堆、目标不止一个、还随时可能临时改动的路径规划。
1)先定目标函数:你到底要“最短路”,还是“最少社交消耗”?
算法里最怕的就是目标没写清楚。
你说“想找最优路径”,但最优到底指什么?最短距离?最少时间?最少过路费?
串门也是。
有的人追求“全覆盖”:一圈都得走到;有的人追求“成本最低”:尽量少跑、少折腾;还有的人追求“风险最小”:避开某些会把话题带偏的场景。
我现在会先给自己定一个很现实的目标:
在不翻车的前提下,完成最重要的那几家,其余的能合并就合并。
一旦目标这么写,后面很多纠结会自动消失。
2)把问题拆小:先做粗规划,再做局部最优
复杂路径规划通常不会一上来就全局搜索。
你先做一个粗粒度的方案:大致的区域顺序、哪天去哪片;然后再在当天根据路况、饭点、临时变化做细调。
串门同理。
我用的“粗规划”方法很土,但好用:
- 按地理位置分组(同一片区放一天)
- 按关系强度排序(必须到的先锁死)
- 按时间窗口排除(只白天在家的、只晚上方便的)
粗规划做完,你至少不会出现那种经典翻车:上午跑城东,下午跑城西,晚上又折回城东。
3)剪枝:有些分支一看就不值得走
搜索问题里,剪枝几乎是救命的。
你不剪枝,就会陷入无穷的“也许可以”。
串门里最常见的“也许可以”是:
- “既然都到这了,要不要顺便再去一下 X 家?”
- “那边还有个亲戚,好久没见了,过去打个招呼?”
这类分支通常带着两个隐藏成本:
- 时间成本被低估:路上 20 分钟,停车 15 分钟,上楼 10 分钟,寒暄 30 分钟,你以为一小时,实际两小时没了。
- 情绪成本不计费:你以为只是坐一下,结果对方开始拉你进家庭群、讲八卦、问近况、顺手安排下一次。
我现在的剪枝条件很明确:
- 如果这家不是“必须到”,并且会打乱饭点/娃作息,剪掉
- 如果这家去了就很难控制时间(容易拖长),剪掉
- 如果这家一去就大概率触发高强度社交(你自己懂的),剪掉
剪枝听起来冷酷,但它其实是在保护你的主线路径。
4)早停:别把“最优解”当成执念
很多优化算法会设早停:当改进幅度已经很小,就不再继续迭代,直接收工。
因为继续跑下去,成本越来越高,收益越来越低。
串门里也该有早停。
最典型的场景是:你已经走完核心亲戚,剩下的是一些“去也行、不去也行”的点。
这时候如果你继续硬跑,往往会出现一种很糟糕的结局:
- 你确实“覆盖”了
- 但你状态崩了
- 后面两天你只想躺着
这就像你为了把 loss 再压低 0.001,结果过拟合、训练爆炸、还浪费了整晚算力。
我的早停条件也很简单:
当天如果出现两次“我开始烦了”,就收工。
烦不是道德问题,它是指标。
5)现实世界的动态约束:你得允许“重规划”
路径规划在真实世界里通常不是一次性算完的:路况会变、有人临时不在家、孩子突然要睡觉。
这时候正确做法不是硬把原计划跑完,而是重规划。
我现在会留出一段“缓冲”当作重规划空间:
- 每天最多安排 2~3 个点
- 中间留一个可伸缩的空档
- 允许临时改成“线上问候 + 改天补上”
你越允许自己调整,越不容易在关键节点崩盘。
结语:串门也可以是一套可复用的算法
把串门当路径规划之后,我最大的变化不是“跑得更高效”,而是心态更稳。
你知道自己在优化什么,也知道哪些分支要剪掉,更知道什么时候该早停。
串门不需要跑出全局最优解。
跑出一个你能承受、也不亏待重要关系的“可行解”,就已经很好了。