摘要:冲突是目标、信念或计划的不相容。本节给冲突分型(目标、信念、计划三层;真冲突与表面冲突),讲检测的三个时机与代价,排出化解梯子的五级(回避、协商、调解、仲裁、强制),并用代码实现计划重叠检测与"先协商后仲裁"的两级处理器。
两妇人在所罗门王面前争一个婴孩,都说孩子是自己的。王的裁决出了名地狠辣:"拿剑来,劈成两半。"真母亲立刻弃权——真相在极端裁决面前自己走了出来。这个古老判例藏着本节的两个主角:冲突的化解不只靠说服,还可以靠设计得当的裁决程序;而裁决者手里的信息,往往比争吵的言辞更接近真相。上一节处理的是排队就能解决的资源竞争,这一节开庭审更难的案子:两家要的根本不是同一件东西,冲突该怎么查、怎么判、怎么执行。
冲突按不相容的层面分三型。目标冲突:镇民想要的终态互斥——两户都要同一块宅基地,最硬的冲突。信念冲突:对世界状态的认识不一致——一户认定界碑在老槐树,另一户认定在溪沟;世界只有一个,至少有一方错了,也可能都错。计划冲突:目标不撞、路线相撞——都往东运货,都要过那座独木桥,改时间表就能解。
再切一刀:真冲突与表面冲突。表面冲突源于信息不全或误会——两家其实都要"安静",却因为不知道对方的诉求而在灌溉时段上对峙;把真实诉求摆出来,双赢方案自己浮现。庭审第一件事永远是验明:这是真冲突,还是没问清楚?
冲突检测有三个档期。设计时排除:建模阶段就让不相容不可能发生——互斥的权限分给不同角色、约束写进 DCOP(第 4 章)。最便宜,只对可预见的冲突有效。运行时前置检测:行动提交前查一遍"这一步会跟谁的既定计划打架"——计划重叠检测、资源占用表核对。拦得早,代价是每步都要查,两两对比的开销随镇民数平方涨。事后检测:不变量被破坏了才发现(两车已经剐蹭)——最便宜也最晚,损失已经落地。工程上常分层铺:设计时排掉已知模式,运行时盯高危动作,事后靠审计兜底。
冲突化解有一条经典梯子,从软到硬:回避(这单不值得争,退出)→协商(第 3 章的讨价还价,双方自治达成协议)→调解(中立第三方撮合,出主意不作主)→仲裁(第三方裁决,结论有约束力)→强制(权威直接执行,如警方冻结资源)。梯子每上一级,速度与确定性上升,双方满意度与关系质量下降。选型看四个变量:时间压力(火烧眉毛直接仲裁)、利益大小(三瓜俩枣回避算了)、关系久期(长期伙伴优先协商调解)、执行机制(裁决能执行吗,还是要靠保证金与声誉撑腰)。
仲裁协议的设计要点有四:仲裁人怎么选(轮值制防常任偏袒、随机制防预谋拉拢、声誉高的第三方制增加公信);裁决依据是什么(明文优先级规则、历史判例、等待时长、抽签兜底——规则要事先公示,不然输家不服);怎么保证执行(保证金事前扣押、声誉事后记账,下一节的信用档案);怎么防止滥诉(起诉收费、败诉承担双方仲裁成本)。
检测的核心是"预判相撞"。每个镇民提交行动计划(动作、时段、占用资源),协调者两两比对,找出同一资源的时段交集。
from itertools import combinations class Plan: def __init__(self, owner, action, start, end, resource): self.owner, self.action = owner, action self.start, self.end, self.resource = start, end, resource def overlap(p, q): """两计划是否在同一资源上时段相交。""" return (p.resource == q.resource and p.start < q.end and q.start < p.end) def detect(plans): """两两比对,返回冲突对。""" return [(p, q) for p, q in combinations(plans, 2) if overlap(p, q)] day_plans = [ Plan("北仓", "装货", 8, 11, "叉车A"), Plan("东铺", "卸货", 10, 12, "叉车A"), # 与北仓 10-11 重叠 Plan("西场", "盘点", 9, 13, "叉车B"), Plan("南店", "理货", 11, 14, "叉车A"), # 与东铺 11-12 重叠 ] for p, q in detect(day_plans): print(f"冲突: {p.owner}({p.action}) 与 {q.owner}({q.action})" f" 抢 {p.resource},重叠 {max(p.start,q.start)}-" f"{min(p.end,q.end)} 时")
输出会点出叉车 A 上的两处撞期。两两比对的复杂度随计划数平方增长,计划一多就得先按资源分组再组内比对——把平方压到"每组内的平方",是检测系统的常规优化。
冲突对找出来后走梯子:先给双方一轮协商机会(互相让步,让到区间闭合就和解),谈不拢交仲裁人按公示规则裁决(这里用"等待久者优先,同则抽签")。
import random class Party: def __init__(self, name, opening, reserve, waited): self.name, self.offer, self.reserve, self.waited = \ name, opening, reserve, waited def negotiate_once(buyer, seller): """快速协商协议:先亮开价,再亮底线;买方底线不低于卖方底线即区间闭合。""" if buyer.reserve >= seller.reserve: # 成交区间 [卖方底线, 买方底线] deal = (buyer.reserve + seller.reserve) / 2 buyer.offer = seller.offer = deal return True return False def arbitrate(p, q, seed=7): """仲裁规则:使用资源等待更久者胜,同则抽签。""" random.seed(seed) winner = random.choice([p, q]) if p.waited == q.waited \ else (p if p.waited > q.waited else q) loser = q if winner is p else p return f"{winner.name} 胜(等待 {winner.waited} 天),{loser.name} 获补偿额度" def resolve(buyer, seller): if negotiate_once(buyer, seller): return f"协商和解:{buyer.name} 与 {seller.name} 在 {buyer.offer:.1f} 成交" return "协商破裂,转仲裁:" + arbitrate(buyer, seller) # 案件一:底线区间重叠 -> 协商层和解 a, b = Party("东铺", 10, 16, 2), Party("北仓", 18, 15, 5) print(resolve(a, b)) # 案件二:底线无交集 -> 上仲裁庭 c, d = Party("西场", 10, 12, 1), Party("南店", 20, 16, 6) print(resolve(c, d))
两级结构的分工一目了然:能和解的案子不上庭(快速协议一轮亮底、区间闭合取中点成交;要拉锯的请回第 3.2 节看多轮让步版),谈不拢的按公示规则裁决,输赢都有说法。把仲裁规则换成"声誉高者优先"或"社会价值大的计划优先",就得到不同的司法风格——规则即价值观,写代码前先想清楚小镇要鼓励什么。
⚠️ 常见坑:仲裁人权力没有约束。仲裁者若能被贿赂(被收买的镇民给的"评分"灌高),梯子反而变成合法抢劫的工具。防线是仲裁人随机指派加裁决理由公示,以及下一节的声誉记录——仲裁人自己的公正性也在档案里。
💡 关键直觉:检测与化解的开销应该与冲突的期望损失挂钩。高频小额冲突上仲裁是浪费(回避或简单规则即可),低频巨额冲突才值得全套程序正义。把法庭当成昂贵资源来调度,跟把算力当昂贵资源来调度是同一种工程直觉。
镇公所的新流程跑了起来:计划表提前一天报备,撞期的当事人先被安排对谈,谈不拢的案子由轮值仲裁人按墙上的规则判。第一月末统计:大多数冲突在协商层就化解了,仲裁层只接了零星几件硬骨头。但法官们很快发现新问题——怎么知道某个证人在说谎、某个常客是不是惯犯?下一节建信用档案:让历史行为说话。