3.2 协商与契约:讨价还价的协议化


3.2 协商与契约:讨价还价的协议化

摘要:协商是自利镇民就利益冲突达成可接受分配的过程。本节给出协商的形式框架(议题、协议、策略、保留价),过一遍让步、争胜、问题解决三大策略族,完整推演合同网协议的四阶段消息流与工程变体,并用代码实现多轮报价协商与简化合同网。

清晨的鱼摊前,买方压价、卖方抬价、三五个回合后击掌成交——这场戏每天都在小镇上演,它是本节的主角:协商。上一节镇民学会了规范的说话格式,这一节学说话的艺术:怎么在利益不一致时谈成生意。协商是多智能体系统的公民技能,从任务转包到频谱分配,从供应链组队到负载均衡,凡有两个自利者要合作的地方都有它。它也是第 6 章博弈会馆的前哨:谈判桌就是一个博弈。

协商的形式骨架

把讨价还价翻译成形式语言,需要四个零件。

议题集:谈什么。单价、交货期、质保期都是议题;单议题谈判是一维拉锯,多议题谈判才有"各取所需"的空间——你重价格我重交期,双赢才可能。

协议:合法的消息序列。谁先报价、何时还价、何时成交或退出,都由协议规定(FIPA 的交互协议就是现成的剧本)。协议管住的是"回合制",不保证结局。

策略:每一回合怎么出价。策略是镇民的私事——这正是协商研究与优化研究的分水岭:优化求解"最优分配",协商求解"没有全局信息与强制者时,自利个体如何自己走到某个分配"。

保留价与个体理性:每个镇民心里有条底线(接受价之外的备选收益,行话叫 BATNA——最佳替代方案)。任何低于底线的协议都不会被理性签署;谈判破裂时的转身离开,靠的就是 BATNA 撑腰。协商的解必须满足个体理性,否则签了也白签。

评价一个协商结果,常用两把尺子:帕累托效率(没有别的分配能让某方更好而不伤他方)与公平性(纳什积等分配准则,第 6 章细说)。遗憾在于,分布式、自利、信息私有的环境下同时达到两把尺子的顶格,多半是奢望——工程协商都在"够好"与"谈得成"之间找平衡。

三大策略族

让步型策略:双方按各自节奏向对方靠拢,单调让步协议是代表——每轮要么让一步,要么维持;僵持到规定轮数时,让步幅度小的一方付"破裂罚款"。简单、可收敛,但双方都慢让就会磨到天荒地老。

争胜型策略:把协商当竞争,尽量少让、试探对方底线。硬式开局、锚定效应(先出极端价拉偏参照系)都是此类。单用它容易双输——两个硬骨头把生意谈崩。

问题解决型策略:把蛋糕做大而不是抢蛋糕。多议题下探索偏好互补(我让交期你让价格),甚至引入论据式协商——不只报价,还说服("我下周一要开工,晚交一天损失巨大")。信息交换多、通信开销大,但帕累托表现最好。

工程选型的朴素法则:单议题用让步型,多议题用问题解决型,一次性博弈对陌生人用争胜型开局再快速切换让步。

合同网协议:把承包市场标准化

单对单协商解决不了"一个发包方、一群承包方"的分配问题。合同网协议(Contract Net Protocol)借了建筑承包市场的制度:发包的镇民当管理者,接活的镇民当承包者,四阶段走完一单生意。

招标:管理者向潜在承包者广播 cfp,说明任务、限制与截止时间。投标:有意的承包者在截止前回 propose,附上自己的估价(通常按自身成本与当前负载核算)。授标:管理者择优回 accept-proposal,其余 reject-proposal执行汇报:中标签民干活,完工后 inform 结果;干砸或超时,管理者重新招标。

四阶段的每个环节都埋着工程细节:投标截止设超时(钟慢的镇民不等人);流标者要收拒绝消息(好让它们释放预留资源);中标签民也可能毁约(分级承诺合同允许买回,毁约金写进机制)。这些细节在第 4 章任务分配里逐一展开,这里先把协议跑起来。

代码实验一:多轮报价,单调让步

先实现一对一协商。卖方要价从高往低让,买方出价从低往高让,双方保留价夹出的区间是成交区;让步幅度按剩余差距的比例收缩,避免一步让穿底线。

class Trader: """谈判镇民:保留价、让步节奏、出价历史。""" def __init__(self, name, opening, reserve, concession=0.3): self.name = name self.offer = opening # 当前出价 self.reserve = reserve # 保留价(底线) self.k = concession # 让步比例 def concede(self, opponent_offer): """向对方靠一步,但绝不越过自己的底线。""" gap = opponent_offer - self.offer new_offer = self.offer + self.k * gap # 卖方底线在上,买方底线在下;越线则贴线 self.offer = min(new_offer, self.reserve) if gap > 0 else \ max(new_offer, self.reserve) return self.offer def negotiate(seller, buyer, max_rounds=12, tol=0.5): for r in range(max_rounds): if buyer.offer >= seller.offer: # 出价追上要价:成交 price = (buyer.offer + seller.offer) / 2 return f"第{r+1}轮成交,价 {price:.1f}", r + 1 if seller.offer - buyer.offer <= tol: # 够近了,击掌成交 price = seller.offer # 按卖方现价成交,不破底线 return f"第{r+1}轮以 {price:.1f} 击掌成交", r + 1 seller.concede(buyer.offer) # 各让一步 buyer.concede(seller.offer) return "谈崩:区间未闭合", max_rounds seller = Trader("鱼摊", opening=50, reserve=38, concession=0.4) buyer = Trader("食堂", opening=30, reserve=44, concession=0.4) print(negotiate(seller, buyer)) seller2 = Trader("鱼摊", opening=50, reserve=46, concession=0.25) buyer2 = Trader("食堂", opening=30, reserve=42, concession=0.25) print(negotiate(seller2, buyer2)) # 底线无交集:必然谈崩

两组参数对照着看很有意思:第一组成交区间从三十八到四十四,双方按比例让步、在容忍度内击掌成交;第二组保留价区间(卖方四十六以上、买方四十二以下)没有交集,再怎么让也贴不拢——协议能保证过程合法,保证不了结局存在。谈判前先确认成交区间非空,是镇民的必修课。另外留意成交价落在区间内的位置:它由双方耐心与让步节奏决定,这正是第 6 章讨价还价博弈要算的账。

代码实验二:简化合同网,一单生意走四阶段

再把承包市场搬进代码。管理者发招标,三个承包者按自身负载与距离估价投标,管理者选最低价授标,落选者收拒信。

import random class Contractor: def __init__(self, name, base_cost, workload): self.name, self.base, self.workload = name, base_cost, workload def bid(self, task): # 估价 = 基础成本 ×(1+负载率) + 距离惩罚 return round(self.base * (1 + self.workload) + abs(task["site"] - self.base), 1) def on_award(self, task): self.workload = min(1.0, self.workload + 0.2) # 接单,负载上升 def contract_net(task, contractors): print(f"招标: {task['name']} @街区{task['site']}") proposals = [] for c in contractors: # 阶段:投标 b = c.bid(task) proposals.append((b, c)) print(f" {c.name} propose 报价 {b}") proposals.sort(key=lambda p: p[0]) # 阶段:授标(择最低) winner = proposals[0][1] for b, c in proposals[1:]: print(f" -> {c.name} reject-proposal") print(f" -> {winner.name} accept-proposal") winner.on_award(task) # 阶段:执行与汇报 print(f" {winner.name} inform 完工") return winner, proposals[0][0] town_workers = [Contractor("mason", base_cost=12, workload=0.2), Contractor("plumber", base_cost=10, workload=0.6), Contractor("roofer", base_cost=11, workload=0.4)] winner, price = contract_net({"name": "修谷仓顶", "site": 11}, town_workers)

注意估价公式把负载率算了进去:泥瓦匠虽贵但闲,管道匠便宜但忙——报价会自动暴露这种差异。把授标后的 workload 累积与下一轮招标连起来,这就是第 4 章负载均衡市场的雏形。

理论账本

合同网的美德:完全分散(管理者只在单笔生意内有权威)、可扩展(加承包者不需要改协议)、天然容错(承包者死了换一家)。它的账单同样清楚:一轮招标的通信量随承包者数量线性涨;管理者是单笔生意的瓶颈与单点;贪婪授标(选当前最低价)不保证全局最优——三笔关联任务分别授给三家,可能不如打包授给一家。学术界的改良方向包括:分级承诺(允许受约束的毁约)、基于边际成本的投标函数、面向长线合作的市场化变体。这些变体的共同思路:把一次性博弈改造成带预期与声誉的重复博弈——正好接上第 5 章的信任与第 6 章的重复博弈。

⚠️ 常见坑:投标估价只算"我干这活的成本",不算"机会成本"。满负荷的镇民报低价抢下任务,挤掉的是自己手头高价值工作。正确的投标价应等于边际成本加机会成本——这也是为什么负载率必须进估价函数。

沙盘推演小结

邮政局门前的集市开张了:买方卖方按协议你让我一步我让你一步,成交区间闭合就击掌;发包方广播招标,承包者们估价投标,最低价中签、落选者拿拒信走人。第 3 章的通信三件套还剩最后一件:当集市天天开、桩桩生意都要谈,通信费会吃掉利润——下一节立规矩,用组织与规范把高频协商沉淀成低成本制度。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U