阶段三:任务分配 协商协议
合同网协议(Contract Net Protocol, CNP)由 Reid Smith 于 1980 年提出,是分布式任务分配中最经典的协商协议。它模拟了商业合同的形成过程:管理者发布任务,承包商提交标书,管理者评估并授予合同。
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) ✅ 验证通过:合同网协议完成任务分配,考虑能力匹配和负载均衡
| 指标 | 广播模式 | 定向模式 |
|---|---|---|
| 消息数/任务 | O(n) | O(k), k=候选数 |
| 延迟 | 1轮 | 1轮 |
| 负载均衡 | 中等 | 中等 |
| 隐私性 | 低 | 较高 |
本课合同网协议的计算复杂度是实际应用中的关键考量因素。在群体规模为N、迭代次数为T的情况下:
对于大规模问题,可以采用以下策略降低复杂度:
合同网协议与其他相关方法的对比分析:
| 算法 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|
| 本课方法 | 分布式、鲁棒、可扩展 | 近似解、参数敏感 | 大规模动态环境 |
| 集中式方法 | 全局最优、确定性强 | 单点故障、不可扩展 | 小规模静态问题 |
| 分层方法 | 兼顾全局和局部 | 层次设计复杂 | 中等规模问题 |
| 混合方法 | 综合各方法优点 | 实现复杂度高 | 高要求场景 |
合同网协议领域的当前热点研究方向包括:
标准CNP的通信开销为O(n·m)(n个管理者×m个承包商),在大规模系统中成为瓶颈:
初始化阶段:所有智能体/粒子的初始位置和速度随机生成。随机初始化保证了多次运行的统计意义,但单次运行的结果可能因随机种子不同而变化。
主循环结构:每个时间步包含三个阶段——感知(获取邻居和环境信息)、决策(根据规则计算控制量)、执行(更新位置和速度)。这种"感知-决策-执行"循环是所有群体机器人算法的基本框架。
参数调优建议:先用默认参数运行一次观察基本行为,然后逐个调整关键参数。每次只改一个参数,记录变化效果。重点关注:收敛速度、稳态误差和鲁棒性。
常见问题:
群体机器人课程 © 2026 | 第13课/共25课