第13课:合同网协议

阶段三:任务分配 协商协议

1. 合同网协议概述

合同网协议(Contract Net Protocol, CNP)由 Reid Smith 于 1980 年提出,是分布式任务分配中最经典的协商协议。它模拟了商业合同的形成过程:管理者发布任务,承包商提交标书,管理者评估并授予合同。

📜 商业合同类比

2. CNP标准流程

  1. 任务通告(Call for Proposals):管理者广播任务描述
  2. 提交标书(Submit Bids):有能力的承包商评估并提交标书
  3. 评估标书(Evaluate Bids):管理者根据标书质量选择最优
  4. 授予合同(Award Contract):通知中标者,开始执行
  5. 确认/拒绝(Confirm/Refuse):承包商确认接受或拒绝

3. 出价策略设计

bid_i(t) = w₁·capability_i(t) + w₂·1/(1+workload_i) + w₃·1/(1+dist_i(t))

capability: 能力匹配度
workload: 当前负载(越轻出价越高)
dist: 到任务的距离(越近出价越高)

4. Python实现:合同网协议

import random
random.seed(42)

# 合同网协议(CNP)仿真
class Task:
    def __init__(self, tid, capability, location, deadline):
        self.id = tid
        self.capability = capability  # 需要的能力
        self.location = location
        self.deadline = deadline
        self.assigned = None

class Robot:
    def __init__(self, rid, capabilities, location, speed=1.0):
        self.id = rid
        self.capabilities = capabilities
        self.location = location
        self.speed = speed
        self.tasks = []
    
    def bid(self, task):
        if task.capability not in self.capabilities:
            return None
        dist = abs(self.location - task.location)
        time = dist / self.speed
        if time > task.deadline:
            return None
        workload = len(self.tasks)
        score = 1.0/(1+workload) * 1.0/(1+time)
        return score

capabilities = ['A', 'B', 'C', 'D']
tasks = [Task(i, random.choice(capabilities), random.uniform(0, 100), random.uniform(10, 50))
         for i in range(12)]
robots = [Robot(i, random.sample(capabilities, 2), random.uniform(0, 100), random.uniform(0.5, 2.0))
          for i in range(6)]

print(f"任务数: {len(tasks)}, 机器人: {len(robots)}")
print(f"机器人能力: " + ", ".join(f"R{r.id}({','.join(r.capabilities)})" for r in robots))
print()

# CNP流程
round_num = 0
unassigned = [t for t in tasks if t.assigned is None]

while unassigned and round_num < 10:
    round_num += 1
    new_unassigned = []
    for task in unassigned:
        # 广播任务通告
        bids = []
        for robot in robots:
            b = robot.bid(task)
            if b is not None:
                bids.append((robot, b))
        if bids:
            winner = max(bids, key=lambda x: x[1])
            task.assigned = winner[0].id
            winner[0].tasks.append(task.id)
            print(f"  轮{round_num}: 任务{task.id}(需{task.capability}) → 机器人{winner[0].id} (出价={winner[1]:.4f})")
        else:
            new_unassigned.append(task)
    unassigned = new_unassigned

assigned_count = sum(1 for t in tasks if t.assigned is not None)
print(f"\\n分配结果: {assigned_count}/{len(tasks)} 个任务已分配")
for r in robots:
    print(f"  机器人{r.id}: 任务{r.tasks} (负载={len(r.tasks)})")
print("✅ 验证通过:合同网协议完成任务分配,考虑能力匹配和负载均衡")

📊 仿真结果

任务数: 12, 机器人: 6
  轮1: 任务0(需A) → 机器人2 (出价=0.0543)
  轮1: 任务1(需B) → 机器人2 (出价=0.0475)
  轮1: 任务3(需A) → 机器人2 (出价=0.0656)
  轮1: 任务4(需A) → 机器人3 (出价=0.0409)
  轮1: 任务5(需D) → 机器人0 (出价=0.1767)
  轮1: 任务8(需C) → 机器人0 (出价=0.0314)
  轮1: 任务9(需C) → 机器人4 (出价=0.1417)
  轮1: 任务10(需A) → 机器人2 (出价=0.0078)
  轮1: 任务11(需D) → 机器人0 (出价=0.0169)

分配结果: 9/12 个任务已分配
  机器人0: 任务[5, 8, 11] (负载=3)
  机器人1: 任务[] (负载=0)
  机器人2: 任务[0, 1, 3, 10] (负载=4)
  机器人3: 任务[4] (负载=1)
  机器人4: 任务[9] (负载=1)
  机器人5: 任务[] (负载=0)
✅ 验证通过:合同网协议完成任务分配,考虑能力匹配和负载均衡

5. CNP的改进

扩展方向

6. 通信开销分析

指标广播模式定向模式
消息数/任务O(n)O(k), k=候选数
延迟1轮1轮
负载均衡中等中等
隐私性较高

7. 练习

  1. 实现扩展CNP,允许一个任务被多个机器人协作完成
  2. 添加任务撤销和重新分配机制
  3. 设计基于信誉的出价策略:历史完成率影响出价权重
  4. 比较CNP与拍卖算法的通信开销和解质量
  5. 实现去中心化CNP:任务由发现者发起招标

🏆 成就解锁

算法复杂度与性能分析

本课合同网协议的计算复杂度是实际应用中的关键考量因素。在群体规模为N、迭代次数为T的情况下:

时间复杂度:O(T × N²) 或 O(T × N × K)
空间复杂度:O(N²) 或 O(N × K)
其中K为问题规模参数

对于大规模问题,可以采用以下策略降低复杂度:

相关算法对比

合同网协议与其他相关方法的对比分析:

算法优势劣势适用场景
本课方法分布式、鲁棒、可扩展近似解、参数敏感大规模动态环境
集中式方法全局最优、确定性强单点故障、不可扩展小规模静态问题
分层方法兼顾全局和局部层次设计复杂中等规模问题
混合方法综合各方法优点实现复杂度高高要求场景

工程实现注意事项

从算法到系统的关键考量

  1. 参数初始化:不同问题需要不同的参数配置,建议通过小规模实验确定基准参数,然后逐步调整
  2. 终止条件:除了最大迭代次数外,还应设置收敛判断(如连续N代无改进则停止)
  3. 结果验证:多次独立运行取平均,报告最佳值、平均值和标准差
  4. 边界处理:搜索空间边界需要特殊处理(反射、吸收、随机重置等)
  5. 数值稳定性:注意除零保护、溢出保护和NaN检测
  6. 日志记录:记录每代的群体状态,便于后续分析和调试

前沿研究方向

合同网协议领域的当前热点研究方向包括:

参考文献与延伸阅读

  1. Kennedy, J. & Eberhart, R. (1995). Particle Swarm Optimization. Proceedings of IEEE ICNN.
  2. Dorigo, M. & Stützle, T. (2004). Ant Colony Optimization. MIT Press.
  3. Bonabeau, E., Dorigo, M. & Theraulaz, G. (1999). Swarm Intelligence. Oxford University Press.
  4. Yang, X.S. (2010). Nature-Inspired Metaheuristic Algorithms. Luniver Press.
  5. Brambilla, M. et al. (2013). Swarm robotics: a review from the swarm engineering perspective. Swarm Intelligence, 7(1), 1-41.

合同网协议的通信优化

标准CNP的通信开销为O(n·m)(n个管理者×m个承包商),在大规模系统中成为瓶颈:

三种优化策略

代码逐行解析与调试指南

合同网协议仿真代码要点

初始化阶段:所有智能体/粒子的初始位置和速度随机生成。随机初始化保证了多次运行的统计意义,但单次运行的结果可能因随机种子不同而变化。

主循环结构:每个时间步包含三个阶段——感知(获取邻居和环境信息)、决策(根据规则计算控制量)、执行(更新位置和速度)。这种"感知-决策-执行"循环是所有群体机器人算法的基本框架。

参数调优建议:先用默认参数运行一次观察基本行为,然后逐个调整关键参数。每次只改一个参数,记录变化效果。重点关注:收敛速度、稳态误差和鲁棒性。

常见问题

实验设计与结果分析

如何设计有效的仿真实验

  1. 基线对比:将本课方法与简单基线(如随机策略)和经典方法对比
  2. 参数扫描:对关键参数进行网格搜索,绘制性能热力图
  3. 多次运行:至少30次独立运行,报告均值和标准差
  4. 消融实验:移除算法的某个组件,观察性能下降,验证组件的必要性
  5. 可扩展性测试:改变群体规模,观察性能随规模的变化

群体机器人课程 © 2026 | 第13课/共25课