在多Agent系统中,每个自治智能体通常拥有有限的资源、能力或信息,当它们面对超出单个Agent能力的任务时,结成联盟共同行动往往能获得更高的整体收益。例如在物流调度中,多个运输Agent共享订单池可以降低空驶率;在云计算资源分配中,多个计算节点协作可以完成单个节点无法承载的大规模计算。合作博弈理论为这类联盟形成与收益分配问题提供了严谨的分析框架,其核心在于回答两个问题:哪些Agent应该联合起来形成联盟,以及联盟产生的总收益如何在成员之间进行公平且稳定的分配。

一个典型的合作博弈可以用特征函数形式表示:给定Agent集合N={1,2,...,n},特征函数v: 2^N → R为每个可能的子集S(即联盟)赋予一个实数收益v(S),表示该联盟内的Agent通过协作所能获得的最高总效用。特征函数通常满足超可加性,即对于任意两个不相交联盟S和T,有v(S∪T) ≥ v(S)+v(T),这意味着合作不会损害任何一方。如果该不等式取等号,则说明联盟之间没有协作增益;若严格大于,则存在正的协同效应,这正是联盟形成的经济动力。在实际工程中,特征函数往往需要通过模拟、优化求解或历史数据学习得到,不同问题的特征函数构建方法差异巨大。
联盟结构生成与特征函数的计算瓶颈
联盟结构生成是指将所有Agent划分成若干互不相交的联盟的过程,其搜索空间随Agent数量呈Bell数增长,对于n=10的规模就已超过10万种划分,完全枚举在实际中不可行。因此研究者提出了基于动态规划、分支定界或启发式搜索的方法来寻找最优联盟结构。然而在许多实际场景中,博弈并非单纯追求全局最优联盟结构,而是允许Agent根据局部信息和收益预期动态加入或退出联盟,最终达到某种均衡状态。此时特征函数的计算成本成为主要瓶颈,因为每个可能的联盟S都需要评估一次v(S),当Agent数量较多时指数爆炸问题严重。
为了降低计算开销,可以采用特征函数近似方法,比如将联盟收益建模为成员个体特征的聚合函数,或者利用机器学习从少量采样联盟中预测未观测联盟的收益。另一种思路是限制联盟规模,只考虑大小不超过k的联盟,因为超大规模联盟在现实中往往难以协调。在一些分布式系统中,特征函数还可以通过每个Agent的局部效用函数加权求和得到,从而将评估复杂度从O(2^n)降至O(n)。不论采用何种近似,合作博弈的后续分析都依赖于特征函数的准确性与一致性,因此在设计系统时需要权衡计算资源与模型精度。
Shapley值:基于边际贡献的公平分配
Shapley值是合作博弈中最经典的收益分配方案,由Lloyd Shapley在1953年提出。它为每个Agent i分配一个数值φ_i(v),表示该Agent在所有可能联盟形成顺序中的平均边际贡献。具体定义为:φ_i(v) = Σ_{S⊆N\{i}} [|S|! (n-|S|-1)! / n!] × [v(S∪{i}) - v(S)]。该公式的含义是:随机生成一个包含所有Agent的排列,Agent i加入时其前面已经形成的联盟为S,i带来的边际贡献为v(S∪{i}) - v(S),对所有可能的S进行加权平均,权重为S出现的概率。Shapley值满足四条公理:效率性(所有Agent的分配之和等于总联盟收益v(N))、对称性(贡献相同的Agent获得相同分配)、虚拟性(贡献为零的Agent分配为零)以及可加性(两个独立博弈之和的Shapley值等于各自Shapley值之和)。
以下是使用Python计算Shapley值的完整实现。代码中使用了itertools生成所有子集,并按照公式累加权值。
import itertools
import math
def shapley_values(agents, characteristic_function):
n = len(agents)
shapley = {agent: 0.0 for agent in agents}
for agent in agents:
others = [a for a in agents if a != agent]
for r in range(len(others) + 1):
# 遍历所有不包含agent的子集S
for subset in itertools.combinations(others, r):
S = set(subset)
S_with_agent = S | {agent}
marginal = characteristic_function(S_with_agent) - characteristic_function(S)
weight = math.factorial(len(S)) * math.factorial(n - len(S) - 1) / math.factorial(n)
shapley[agent] += weight * marginal
return shapley
# 示例特征函数:三个Agent,任意联盟收益定义
def v(S):
mapping = {
frozenset(): 0,
frozenset({1}): 3,
frozenset({2}): 4,
frozenset({3}): 2,
frozenset({1,2}): 10,
frozenset({1,3}): 7,
frozenset({2,3}): 8,
frozenset({1,2,3}): 15,
}
return mapping[frozenset(S)]
result = shapley_values([1,2,3], v)
print(result)
上述代码输出结果为:Agent 1分配5.5,Agent 2分配6.0,Agent 3分配3.5,总和为15,满足效率性。Shapley值虽然公平,但计算复杂度为O(2^n),当Agent数量超过20时精确计算几乎不可行,因此实际中常使用蒙特卡洛采样近似,即随机生成大量排列,对每个Agent统计其边际贡献的平均值。这种方法以精度换速度,在联盟规模适中的场景下非常实用。
核心与核仁:稳定性约束下的分配空间
Shapley值侧重公平性,但并不保证形成的联盟能够稳定维持。一个联盟中的部分Agent可能认为脱离当前联盟另组小联盟能获得更高收益,此时当前联盟就会面临分裂威胁。合作博弈中的核心概念刻画了所有不会被任何子联盟推翻的分配方案集合。正式地,一个分配向量x属于核心,当且仅当对于所有S⊆N,Σ_{i∈S} x_i ≥ v(S),且Σ_{i∈N} x_i = v(N)。如果核心非空,说明存在一种分配使得任何Agent子集都没有动机脱离大联盟,联盟是稳定的。然而现实中核心经常为空,比如当协同效应不够强时,大联盟无法提供足够的总收益来满足所有子联盟的需求。
当核心为空或需要从多个核心元素中挑选一个时,核仁是另一种常用的分配方案。核仁的思想是使所有联盟的最不满程度最小化。定义每个联盟S对于分配x的超量e(S,x) = v(S) - Σ_{i∈S} x_i,表示联盟S如果独立行动相对于当前分配能获得的额外收益,超量越大说明该联盟越不满意。核仁分配在所有满足效率性且个体理性的分配中,按字典序最小化最大的超量,然后再最小化次大的超量,以此类推。核仁可以通过线性规划迭代求解,或使用Kopelowitz算法在多项式时间内计算。与Shapley值相比,核仁更强调稳定性,尤其适合于资源竞争激烈、Agent容易叛逃的场景。
在实际多Agent系统设计中,收益分配的目标常常不是单一的公平或稳定,而是需要根据业务需求在二者之间权衡。例如在联盟形成初期,可以采用Shapley值吸引不同能力的Agent加入;当联盟运行一段时间后,再根据实际贡献调整分配系数以维持核心稳定性。此外,动态联盟场景下收益函数可能随时间变化,需要引入重复博弈或在线学习机制,让Agent根据历史分配调整自己的联盟选择策略,最终收敛到稳健的均衡。