春节串门这件事,最累的往往不是人情世故,是路线。

你以为自己只是“去看看亲戚”,实际上你在做一个隐形的优化问题:

  • 亲戚分布在不同地点
  • 每家都有一个“最佳到访时间”(太早扰人、太晚尴尬)
  • 你有体力和情绪的上限
  • 还要躲开堵车、饭点、娃睡觉

这像什么?像路径规划。

而且是那种典型的:约束一堆、目标不止一个、还随时可能临时改动的路径规划。


1)先定目标函数:你到底要“最短路”,还是“最少社交消耗”?

算法里最怕的就是目标没写清楚。

你说“想找最优路径”,但最优到底指什么?最短距离?最少时间?最少过路费?

串门也是。

有的人追求“全覆盖”:一圈都得走到;有的人追求“成本最低”:尽量少跑、少折腾;还有的人追求“风险最小”:避开某些会把话题带偏的场景。

我现在会先给自己定一个很现实的目标:

在不翻车的前提下,完成最重要的那几家,其余的能合并就合并。

一旦目标这么写,后面很多纠结会自动消失。


2)把问题拆小:先做粗规划,再做局部最优

复杂路径规划通常不会一上来就全局搜索。

你先做一个粗粒度的方案:大致的区域顺序、哪天去哪片;然后再在当天根据路况、饭点、临时变化做细调。

串门同理。

我用的“粗规划”方法很土,但好用:

  • 按地理位置分组(同一片区放一天)
  • 按关系强度排序(必须到的先锁死)
  • 按时间窗口排除(只白天在家的、只晚上方便的)

粗规划做完,你至少不会出现那种经典翻车:上午跑城东,下午跑城西,晚上又折回城东。


3)剪枝:有些分支一看就不值得走

搜索问题里,剪枝几乎是救命的。

你不剪枝,就会陷入无穷的“也许可以”。

串门里最常见的“也许可以”是:

  • “既然都到这了,要不要顺便再去一下 X 家?”
  • “那边还有个亲戚,好久没见了,过去打个招呼?”

这类分支通常带着两个隐藏成本:

  1. 时间成本被低估:路上 20 分钟,停车 15 分钟,上楼 10 分钟,寒暄 30 分钟,你以为一小时,实际两小时没了。
  2. 情绪成本不计费:你以为只是坐一下,结果对方开始拉你进家庭群、讲八卦、问近况、顺手安排下一次。

我现在的剪枝条件很明确:

  • 如果这家不是“必须到”,并且会打乱饭点/娃作息,剪掉
  • 如果这家去了就很难控制时间(容易拖长),剪掉
  • 如果这家一去就大概率触发高强度社交(你自己懂的),剪掉

剪枝听起来冷酷,但它其实是在保护你的主线路径。


4)早停:别把“最优解”当成执念

很多优化算法会设早停:当改进幅度已经很小,就不再继续迭代,直接收工。

因为继续跑下去,成本越来越高,收益越来越低。

串门里也该有早停。

最典型的场景是:你已经走完核心亲戚,剩下的是一些“去也行、不去也行”的点。

这时候如果你继续硬跑,往往会出现一种很糟糕的结局:

  • 你确实“覆盖”了
  • 但你状态崩了
  • 后面两天你只想躺着

这就像你为了把 loss 再压低 0.001,结果过拟合、训练爆炸、还浪费了整晚算力。

我的早停条件也很简单:

当天如果出现两次“我开始烦了”,就收工。

烦不是道德问题,它是指标。


5)现实世界的动态约束:你得允许“重规划”

路径规划在真实世界里通常不是一次性算完的:路况会变、有人临时不在家、孩子突然要睡觉。

这时候正确做法不是硬把原计划跑完,而是重规划。

我现在会留出一段“缓冲”当作重规划空间:

  • 每天最多安排 2~3 个点
  • 中间留一个可伸缩的空档
  • 允许临时改成“线上问候 + 改天补上”

你越允许自己调整,越不容易在关键节点崩盘。


结语:串门也可以是一套可复用的算法

把串门当路径规划之后,我最大的变化不是“跑得更高效”,而是心态更稳。

你知道自己在优化什么,也知道哪些分支要剪掉,更知道什么时候该早停。

串门不需要跑出全局最优解。

跑出一个你能承受、也不亏待重要关系的“可行解”,就已经很好了。