
第12篇:多Agent系统协同机制
文章目录
- 第12篇:多Agent系统协同机制
-
- 摘要
- 一、多Agent协同概述
-
- [1.1 协同模式分类](#1.1 协同模式分类)
- [1.2 协同场景](#1.2 协同场景)
- 二、协同算法
-
- [2.1 契约网协议](#2.1 契约网协议)
- [2.2 市场机制](#2.2 市场机制)
- 三、任务分配策略
-
- [3.1 任务分配算法](#3.1 任务分配算法)
- [3.2 贪心分配算法](#3.2 贪心分配算法)
- 四、冲突解决
-
- [4.1 冲突类型](#4.1 冲突类型)
- [4.2 冲突解决策略](#4.2 冲突解决策略)
- 五、协同通信协议
-
- [5.1 通信协议设计](#5.1 通信协议设计)
- [5.2 组播通信](#5.2 组播通信)
- 六、协同案例:多Agent任务执行
-
- [6.1 协同流程](#6.1 协同流程)
- [6.2 代码示例:任务协调器](#6.2 代码示例:任务协调器)
- 七、总结与下一步
-
- [7.1 本文总结](#7.1 本文总结)
- [7.2 下一步](#7.2 下一步)
摘要
本文深入探讨多Agent系统的协同机制,包括协同算法、任务分配策略和冲突解决。通过理论讲解和代码示例,帮助读者理解如何设计和实现高效的多Agent协同系统。
一、多Agent协同概述
1.1 协同模式分类
#mermaid-svg-miY3LPRthwcXu219{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-miY3LPRthwcXu219 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-miY3LPRthwcXu219 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-miY3LPRthwcXu219 .error-icon{fill:#552222;}#mermaid-svg-miY3LPRthwcXu219 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-miY3LPRthwcXu219 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-miY3LPRthwcXu219 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-miY3LPRthwcXu219 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-miY3LPRthwcXu219 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-miY3LPRthwcXu219 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-miY3LPRthwcXu219 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-miY3LPRthwcXu219 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-miY3LPRthwcXu219 .marker.cross{stroke:#333333;}#mermaid-svg-miY3LPRthwcXu219 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-miY3LPRthwcXu219 p{margin:0;}#mermaid-svg-miY3LPRthwcXu219 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-miY3LPRthwcXu219 .cluster-label text{fill:#333;}#mermaid-svg-miY3LPRthwcXu219 .cluster-label span{color:#333;}#mermaid-svg-miY3LPRthwcXu219 .cluster-label span p{background-color:transparent;}#mermaid-svg-miY3LPRthwcXu219 .label text,#mermaid-svg-miY3LPRthwcXu219 span{fill:#333;color:#333;}#mermaid-svg-miY3LPRthwcXu219 .node rect,#mermaid-svg-miY3LPRthwcXu219 .node circle,#mermaid-svg-miY3LPRthwcXu219 .node ellipse,#mermaid-svg-miY3LPRthwcXu219 .node polygon,#mermaid-svg-miY3LPRthwcXu219 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-miY3LPRthwcXu219 .rough-node .label text,#mermaid-svg-miY3LPRthwcXu219 .node .label text,#mermaid-svg-miY3LPRthwcXu219 .image-shape .label,#mermaid-svg-miY3LPRthwcXu219 .icon-shape .label{text-anchor:middle;}#mermaid-svg-miY3LPRthwcXu219 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-miY3LPRthwcXu219 .rough-node .label,#mermaid-svg-miY3LPRthwcXu219 .node .label,#mermaid-svg-miY3LPRthwcXu219 .image-shape .label,#mermaid-svg-miY3LPRthwcXu219 .icon-shape .label{text-align:center;}#mermaid-svg-miY3LPRthwcXu219 .node.clickable{cursor:pointer;}#mermaid-svg-miY3LPRthwcXu219 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-miY3LPRthwcXu219 .arrowheadPath{fill:#333333;}#mermaid-svg-miY3LPRthwcXu219 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-miY3LPRthwcXu219 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-miY3LPRthwcXu219 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-miY3LPRthwcXu219 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-miY3LPRthwcXu219 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-miY3LPRthwcXu219 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-miY3LPRthwcXu219 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-miY3LPRthwcXu219 .cluster text{fill:#333;}#mermaid-svg-miY3LPRthwcXu219 .cluster span{color:#333;}#mermaid-svg-miY3LPRthwcXu219 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-miY3LPRthwcXu219 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-miY3LPRthwcXu219 rect.text{fill:none;stroke-width:0;}#mermaid-svg-miY3LPRthwcXu219 .icon-shape,#mermaid-svg-miY3LPRthwcXu219 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-miY3LPRthwcXu219 .icon-shape p,#mermaid-svg-miY3LPRthwcXu219 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-miY3LPRthwcXu219 .icon-shape .label rect,#mermaid-svg-miY3LPRthwcXu219 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-miY3LPRthwcXu219 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-miY3LPRthwcXu219 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-miY3LPRthwcXu219 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 多Agent协同模式
集中式协同
分布式协同
混合式协同
中心控制
任务分配
点对点
消息传递
分层控制
动态协调
1.2 协同场景
| 场景 | 特点 | 协同需求 |
|---|---|---|
| 任务分配 | 多个Agent完成同一任务 | 任务分解与分配 |
| 资源共享 | 共享有限资源 | 资源调度 |
| 信息融合 | 多源信息整合 | 数据融合 |
| 冲突解决 | 目标冲突 | 协商机制 |
| 知识共享 | 知识互补 | 知识传递 |
二、协同算法
2.1 契约网协议
投标者3 投标者2 投标者1 管理者 投标者3 投标者2 投标者1 管理者 #mermaid-svg-FgAz7h2co36M7zdD{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-FgAz7h2co36M7zdD .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-FgAz7h2co36M7zdD .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-FgAz7h2co36M7zdD .error-icon{fill:#552222;}#mermaid-svg-FgAz7h2co36M7zdD .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-FgAz7h2co36M7zdD .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-FgAz7h2co36M7zdD .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-FgAz7h2co36M7zdD .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-FgAz7h2co36M7zdD .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-FgAz7h2co36M7zdD .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-FgAz7h2co36M7zdD .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-FgAz7h2co36M7zdD .marker{fill:#333333;stroke:#333333;}#mermaid-svg-FgAz7h2co36M7zdD .marker.cross{stroke:#333333;}#mermaid-svg-FgAz7h2co36M7zdD svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-FgAz7h2co36M7zdD p{margin:0;}#mermaid-svg-FgAz7h2co36M7zdD .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-FgAz7h2co36M7zdD text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-FgAz7h2co36M7zdD .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-FgAz7h2co36M7zdD .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-FgAz7h2co36M7zdD .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-FgAz7h2co36M7zdD .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-FgAz7h2co36M7zdD #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-FgAz7h2co36M7zdD .sequenceNumber{fill:white;}#mermaid-svg-FgAz7h2co36M7zdD #sequencenumber{fill:#333;}#mermaid-svg-FgAz7h2co36M7zdD #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-FgAz7h2co36M7zdD .messageText{fill:#333;stroke:none;}#mermaid-svg-FgAz7h2co36M7zdD .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-FgAz7h2co36M7zdD .labelText,#mermaid-svg-FgAz7h2co36M7zdD .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-FgAz7h2co36M7zdD .loopText,#mermaid-svg-FgAz7h2co36M7zdD .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-FgAz7h2co36M7zdD .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-FgAz7h2co36M7zdD .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-FgAz7h2co36M7zdD .noteText,#mermaid-svg-FgAz7h2co36M7zdD .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-FgAz7h2co36M7zdD .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-FgAz7h2co36M7zdD .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-FgAz7h2co36M7zdD .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-FgAz7h2co36M7zdD .actorPopupMenu{position:absolute;}#mermaid-svg-FgAz7h2co36M7zdD .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-FgAz7h2co36M7zdD .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-FgAz7h2co36M7zdD .actor-man circle,#mermaid-svg-FgAz7h2co36M7zdD line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-FgAz7h2co36M7zdD :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 发布任务 发布任务 发布任务 投标 投标 投标 选择中标者 授予合同 拒绝 拒绝
Python示例:契约网协议实现
python
from typing import List, Dict, Any, Optional
class ContractNetProtocol:
def __init__(self):
self.managers = {}
self.bidders = {}
def register_manager(self, manager_id: str):
self.managers[manager_id] = {"tasks": [], "auctions": {}}
def register_bidder(self, bidder_id: str, capabilities: List[str]):
self.bidders[bidder_id] = {"capabilities": capabilities, "bids": []}
def announce_task(self, manager_id: str, task: Dict[str, Any]):
if manager_id not in self.managers:
return
task_id = task["task_id"]
self.managers[manager_id]["auctions"][task_id] = {
"task": task,
"bids": []
}
for bidder_id, info in self.bidders.items():
if any(cap in task.get("requirements", []) for cap in info["capabilities"]):
self._notify_bidder(bidder_id, task)
def _notify_bidder(self, bidder_id: str, task: Dict[str, Any]):
pass
def submit_bid(self, bidder_id: str, task_id: str, bid: Dict[str, Any]):
for manager_info in self.managers.values():
if task_id in manager_info["auctions"]:
manager_info["auctions"][task_id]["bids"].append({
"bidder_id": bidder_id,
**bid
})
def select_winner(self, manager_id: str, task_id: str) -> Optional[str]:
if manager_id not in self.managers:
return None
auction = self.managers[manager_id]["auctions"].get(task_id)
if not auction or not auction["bids"]:
return None
bids = auction["bids"]
winner = min(bids, key=lambda x: x.get("cost", float('inf')))
return winner["bidder_id"]
2.2 市场机制
Python示例:拍卖机制
python
class AuctionSystem:
def __init__(self):
self.auctions = {}
def create_auction(self, item_id: str, reserve_price: float = 0):
self.auctions[item_id] = {
"reserve_price": reserve_price,
"bids": [],
"status": "open"
}
def place_bid(self, item_id: str, bidder_id: str, price: float):
if item_id not in self.auctions or self.auctions[item_id]["status"] != "open":
return False
self.auctions[item_id]["bids"].append({
"bidder_id": bidder_id,
"price": price,
"timestamp": datetime.now()
})
return True
def close_auction(self, item_id: str) -> Optional[Dict[str, Any]]:
if item_id not in self.auctions:
return None
auction = self.auctions[item_id]
auction["status"] = "closed"
bids = auction["bids"]
if not bids:
return None
bids.sort(key=lambda x: x["price"], reverse=True)
highest_bid = bids[0]
if highest_bid["price"] >= auction["reserve_price"]:
return highest_bid
return None
三、任务分配策略
3.1 任务分配算法
#mermaid-svg-PmrpUAzHXJVBaZyP{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-PmrpUAzHXJVBaZyP .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-PmrpUAzHXJVBaZyP .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-PmrpUAzHXJVBaZyP .error-icon{fill:#552222;}#mermaid-svg-PmrpUAzHXJVBaZyP .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-PmrpUAzHXJVBaZyP .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-PmrpUAzHXJVBaZyP .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-PmrpUAzHXJVBaZyP .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-PmrpUAzHXJVBaZyP .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-PmrpUAzHXJVBaZyP .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-PmrpUAzHXJVBaZyP .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-PmrpUAzHXJVBaZyP .marker{fill:#333333;stroke:#333333;}#mermaid-svg-PmrpUAzHXJVBaZyP .marker.cross{stroke:#333333;}#mermaid-svg-PmrpUAzHXJVBaZyP svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-PmrpUAzHXJVBaZyP p{margin:0;}#mermaid-svg-PmrpUAzHXJVBaZyP .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-PmrpUAzHXJVBaZyP .cluster-label text{fill:#333;}#mermaid-svg-PmrpUAzHXJVBaZyP .cluster-label span{color:#333;}#mermaid-svg-PmrpUAzHXJVBaZyP .cluster-label span p{background-color:transparent;}#mermaid-svg-PmrpUAzHXJVBaZyP .label text,#mermaid-svg-PmrpUAzHXJVBaZyP span{fill:#333;color:#333;}#mermaid-svg-PmrpUAzHXJVBaZyP .node rect,#mermaid-svg-PmrpUAzHXJVBaZyP .node circle,#mermaid-svg-PmrpUAzHXJVBaZyP .node ellipse,#mermaid-svg-PmrpUAzHXJVBaZyP .node polygon,#mermaid-svg-PmrpUAzHXJVBaZyP .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-PmrpUAzHXJVBaZyP .rough-node .label text,#mermaid-svg-PmrpUAzHXJVBaZyP .node .label text,#mermaid-svg-PmrpUAzHXJVBaZyP .image-shape .label,#mermaid-svg-PmrpUAzHXJVBaZyP .icon-shape .label{text-anchor:middle;}#mermaid-svg-PmrpUAzHXJVBaZyP .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-PmrpUAzHXJVBaZyP .rough-node .label,#mermaid-svg-PmrpUAzHXJVBaZyP .node .label,#mermaid-svg-PmrpUAzHXJVBaZyP .image-shape .label,#mermaid-svg-PmrpUAzHXJVBaZyP .icon-shape .label{text-align:center;}#mermaid-svg-PmrpUAzHXJVBaZyP .node.clickable{cursor:pointer;}#mermaid-svg-PmrpUAzHXJVBaZyP .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-PmrpUAzHXJVBaZyP .arrowheadPath{fill:#333333;}#mermaid-svg-PmrpUAzHXJVBaZyP .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-PmrpUAzHXJVBaZyP .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-PmrpUAzHXJVBaZyP .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PmrpUAzHXJVBaZyP .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-PmrpUAzHXJVBaZyP .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PmrpUAzHXJVBaZyP .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-PmrpUAzHXJVBaZyP .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-PmrpUAzHXJVBaZyP .cluster text{fill:#333;}#mermaid-svg-PmrpUAzHXJVBaZyP .cluster span{color:#333;}#mermaid-svg-PmrpUAzHXJVBaZyP div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-PmrpUAzHXJVBaZyP .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-PmrpUAzHXJVBaZyP rect.text{fill:none;stroke-width:0;}#mermaid-svg-PmrpUAzHXJVBaZyP .icon-shape,#mermaid-svg-PmrpUAzHXJVBaZyP .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PmrpUAzHXJVBaZyP .icon-shape p,#mermaid-svg-PmrpUAzHXJVBaZyP .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-PmrpUAzHXJVBaZyP .icon-shape .label rect,#mermaid-svg-PmrpUAzHXJVBaZyP .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PmrpUAzHXJVBaZyP .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-PmrpUAzHXJVBaZyP .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-PmrpUAzHXJVBaZyP :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 任务分配
任务分析
Agent能力评估
分配策略
执行分配
贪心算法
遗传算法
拍卖机制
3.2 贪心分配算法
Python示例:任务分配
python
from typing import List, Dict, Any, Tuple
class TaskAllocator:
def __init__(self):
self.agents = {}
def register_agent(self, agent_id: str, capabilities: Dict[str, float]):
self.agents[agent_id] = {
"capabilities": capabilities,
"load": 0
}
def calculate_fitness(self, agent_id: str, task_requirements: Dict[str, float]) -> float:
agent = self.agents.get(agent_id)
if not agent:
return 0.0
score = 0.0
total_requirements = sum(task_requirements.values())
for skill, required in task_requirements.items():
if skill in agent["capabilities"]:
score += min(agent["capabilities"][skill], required)
if total_requirements > 0:
score /= total_requirements
load_penalty = agent["load"] / 10.0
return score - load_penalty
def allocate(self, task: Dict[str, Any]) -> Optional[str]:
requirements = task.get("requirements", {})
if not self.agents:
return None
best_agent = None
best_fitness = -float('inf')
for agent_id in self.agents:
fitness = self.calculate_fitness(agent_id, requirements)
if fitness > best_fitness:
best_fitness = fitness
best_agent = agent_id
if best_agent:
self.agents[best_agent]["load"] += 1
return best_agent
def deallocate(self, agent_id: str):
if agent_id in self.agents and self.agents[agent_id]["load"] > 0:
self.agents[agent_id]["load"] -= 1
四、冲突解决
4.1 冲突类型
#mermaid-svg-vsW7cU565haVp2zf{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-vsW7cU565haVp2zf .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-vsW7cU565haVp2zf .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-vsW7cU565haVp2zf .error-icon{fill:#552222;}#mermaid-svg-vsW7cU565haVp2zf .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-vsW7cU565haVp2zf .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-vsW7cU565haVp2zf .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-vsW7cU565haVp2zf .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-vsW7cU565haVp2zf .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-vsW7cU565haVp2zf .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-vsW7cU565haVp2zf .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-vsW7cU565haVp2zf .marker{fill:#333333;stroke:#333333;}#mermaid-svg-vsW7cU565haVp2zf .marker.cross{stroke:#333333;}#mermaid-svg-vsW7cU565haVp2zf svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-vsW7cU565haVp2zf p{margin:0;}#mermaid-svg-vsW7cU565haVp2zf .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-vsW7cU565haVp2zf .cluster-label text{fill:#333;}#mermaid-svg-vsW7cU565haVp2zf .cluster-label span{color:#333;}#mermaid-svg-vsW7cU565haVp2zf .cluster-label span p{background-color:transparent;}#mermaid-svg-vsW7cU565haVp2zf .label text,#mermaid-svg-vsW7cU565haVp2zf span{fill:#333;color:#333;}#mermaid-svg-vsW7cU565haVp2zf .node rect,#mermaid-svg-vsW7cU565haVp2zf .node circle,#mermaid-svg-vsW7cU565haVp2zf .node ellipse,#mermaid-svg-vsW7cU565haVp2zf .node polygon,#mermaid-svg-vsW7cU565haVp2zf .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-vsW7cU565haVp2zf .rough-node .label text,#mermaid-svg-vsW7cU565haVp2zf .node .label text,#mermaid-svg-vsW7cU565haVp2zf .image-shape .label,#mermaid-svg-vsW7cU565haVp2zf .icon-shape .label{text-anchor:middle;}#mermaid-svg-vsW7cU565haVp2zf .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-vsW7cU565haVp2zf .rough-node .label,#mermaid-svg-vsW7cU565haVp2zf .node .label,#mermaid-svg-vsW7cU565haVp2zf .image-shape .label,#mermaid-svg-vsW7cU565haVp2zf .icon-shape .label{text-align:center;}#mermaid-svg-vsW7cU565haVp2zf .node.clickable{cursor:pointer;}#mermaid-svg-vsW7cU565haVp2zf .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-vsW7cU565haVp2zf .arrowheadPath{fill:#333333;}#mermaid-svg-vsW7cU565haVp2zf .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-vsW7cU565haVp2zf .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-vsW7cU565haVp2zf .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-vsW7cU565haVp2zf .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-vsW7cU565haVp2zf .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-vsW7cU565haVp2zf .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-vsW7cU565haVp2zf .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-vsW7cU565haVp2zf .cluster text{fill:#333;}#mermaid-svg-vsW7cU565haVp2zf .cluster span{color:#333;}#mermaid-svg-vsW7cU565haVp2zf div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-vsW7cU565haVp2zf .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-vsW7cU565haVp2zf rect.text{fill:none;stroke-width:0;}#mermaid-svg-vsW7cU565haVp2zf .icon-shape,#mermaid-svg-vsW7cU565haVp2zf .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-vsW7cU565haVp2zf .icon-shape p,#mermaid-svg-vsW7cU565haVp2zf .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-vsW7cU565haVp2zf .icon-shape .label rect,#mermaid-svg-vsW7cU565haVp2zf .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-vsW7cU565haVp2zf .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-vsW7cU565haVp2zf .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-vsW7cU565haVp2zf :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 冲突类型
资源冲突
目标冲突
通信冲突
认知冲突
资源竞争
资源依赖
目标不一致
优先级冲突
消息冲突
协议冲突
信念冲突
观点冲突
4.2 冲突解决策略
Python示例:冲突解决
python
from typing import List, Dict, Any
class ConflictResolver:
def __init__(self):
self.resolution_strategies = {
"priority": self._resolve_by_priority,
"random": self._resolve_randomly,
"negotiation": self._resolve_by_negotiation
}
def _resolve_by_priority(self, agents: List[str], conflict: Dict[str, Any]) -> str:
priorities = conflict.get("priorities", {})
return max(agents, key=lambda a: priorities.get(a, 0))
def _resolve_randomly(self, agents: List[str], conflict: Dict[str, Any]) -> str:
import random
return random.choice(agents)
def _resolve_by_negotiation(self, agents: List[str], conflict: Dict[str, Any]) -> str:
proposals = conflict.get("proposals", {})
best_proposal = max(proposals.items(), key=lambda x: x[1].get("benefit", 0))
return best_proposal[0]
def resolve(self, conflict: Dict[str, Any]) -> str:
agents = conflict.get("agents", [])
strategy = conflict.get("strategy", "priority")
if strategy not in self.resolution_strategies:
strategy = "priority"
return self.resolution_strategies[strategy](agents, conflict)
五、协同通信协议
5.1 通信协议设计
#mermaid-svg-VbmNay84W4NLXTYI{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-VbmNay84W4NLXTYI .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-VbmNay84W4NLXTYI .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-VbmNay84W4NLXTYI .error-icon{fill:#552222;}#mermaid-svg-VbmNay84W4NLXTYI .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VbmNay84W4NLXTYI .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-VbmNay84W4NLXTYI .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VbmNay84W4NLXTYI .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VbmNay84W4NLXTYI .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-VbmNay84W4NLXTYI .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VbmNay84W4NLXTYI .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VbmNay84W4NLXTYI .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VbmNay84W4NLXTYI .marker.cross{stroke:#333333;}#mermaid-svg-VbmNay84W4NLXTYI svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VbmNay84W4NLXTYI p{margin:0;}#mermaid-svg-VbmNay84W4NLXTYI .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-VbmNay84W4NLXTYI .cluster-label text{fill:#333;}#mermaid-svg-VbmNay84W4NLXTYI .cluster-label span{color:#333;}#mermaid-svg-VbmNay84W4NLXTYI .cluster-label span p{background-color:transparent;}#mermaid-svg-VbmNay84W4NLXTYI .label text,#mermaid-svg-VbmNay84W4NLXTYI span{fill:#333;color:#333;}#mermaid-svg-VbmNay84W4NLXTYI .node rect,#mermaid-svg-VbmNay84W4NLXTYI .node circle,#mermaid-svg-VbmNay84W4NLXTYI .node ellipse,#mermaid-svg-VbmNay84W4NLXTYI .node polygon,#mermaid-svg-VbmNay84W4NLXTYI .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-VbmNay84W4NLXTYI .rough-node .label text,#mermaid-svg-VbmNay84W4NLXTYI .node .label text,#mermaid-svg-VbmNay84W4NLXTYI .image-shape .label,#mermaid-svg-VbmNay84W4NLXTYI .icon-shape .label{text-anchor:middle;}#mermaid-svg-VbmNay84W4NLXTYI .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-VbmNay84W4NLXTYI .rough-node .label,#mermaid-svg-VbmNay84W4NLXTYI .node .label,#mermaid-svg-VbmNay84W4NLXTYI .image-shape .label,#mermaid-svg-VbmNay84W4NLXTYI .icon-shape .label{text-align:center;}#mermaid-svg-VbmNay84W4NLXTYI .node.clickable{cursor:pointer;}#mermaid-svg-VbmNay84W4NLXTYI .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-VbmNay84W4NLXTYI .arrowheadPath{fill:#333333;}#mermaid-svg-VbmNay84W4NLXTYI .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-VbmNay84W4NLXTYI .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-VbmNay84W4NLXTYI .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-VbmNay84W4NLXTYI .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-VbmNay84W4NLXTYI .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-VbmNay84W4NLXTYI .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-VbmNay84W4NLXTYI .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-VbmNay84W4NLXTYI .cluster text{fill:#333;}#mermaid-svg-VbmNay84W4NLXTYI .cluster span{color:#333;}#mermaid-svg-VbmNay84W4NLXTYI div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-VbmNay84W4NLXTYI .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-VbmNay84W4NLXTYI rect.text{fill:none;stroke-width:0;}#mermaid-svg-VbmNay84W4NLXTYI .icon-shape,#mermaid-svg-VbmNay84W4NLXTYI .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-VbmNay84W4NLXTYI .icon-shape p,#mermaid-svg-VbmNay84W4NLXTYI .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-VbmNay84W4NLXTYI .icon-shape .label rect,#mermaid-svg-VbmNay84W4NLXTYI .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-VbmNay84W4NLXTYI .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-VbmNay84W4NLXTYI .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-VbmNay84W4NLXTYI :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 通信协议
消息格式
通信模式
协议栈
结构化消息
序列化
同步通信
异步通信
广播通信
应用层
传输层
网络层
5.2 组播通信
Python示例:组播通信
python
class MulticastCommunicator:
def __init__(self):
self.groups = {}
def create_group(self, group_id: str):
if group_id not in self.groups:
self.groups[group_id] = {"members": set(), "messages": []}
def join_group(self, group_id: str, agent_id: str):
if group_id in self.groups:
self.groups[group_id]["members"].add(agent_id)
def leave_group(self, group_id: str, agent_id: str):
if group_id in self.groups:
self.groups[group_id]["members"].discard(agent_id)
def send_to_group(self, group_id: str, message: Dict[str, Any], sender_id: str):
if group_id not in self.groups:
return
message_data = {
"sender_id": sender_id,
"content": message,
"timestamp": datetime.now().isoformat()
}
self.groups[group_id]["messages"].append(message_data)
for member_id in self.groups[group_id]["members"]:
if member_id != sender_id:
self._deliver_message(member_id, message_data)
def _deliver_message(self, agent_id: str, message: Dict[str, Any]):
pass
def get_messages(self, group_id: str, agent_id: str) -> List[Dict[str, Any]]:
if group_id not in self.groups:
return []
return self.groups[group_id]["messages"]
六、协同案例:多Agent任务执行
6.1 协同流程
Agent3 Agent2 Agent1 协调器 用户 Agent3 Agent2 Agent1 协调器 用户 #mermaid-svg-2SO5EGoJrNVyCTD9{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-2SO5EGoJrNVyCTD9 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-2SO5EGoJrNVyCTD9 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-2SO5EGoJrNVyCTD9 .error-icon{fill:#552222;}#mermaid-svg-2SO5EGoJrNVyCTD9 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-2SO5EGoJrNVyCTD9 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-2SO5EGoJrNVyCTD9 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-2SO5EGoJrNVyCTD9 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-2SO5EGoJrNVyCTD9 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-2SO5EGoJrNVyCTD9 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-2SO5EGoJrNVyCTD9 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-2SO5EGoJrNVyCTD9 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-2SO5EGoJrNVyCTD9 .marker.cross{stroke:#333333;}#mermaid-svg-2SO5EGoJrNVyCTD9 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-2SO5EGoJrNVyCTD9 p{margin:0;}#mermaid-svg-2SO5EGoJrNVyCTD9 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-2SO5EGoJrNVyCTD9 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-2SO5EGoJrNVyCTD9 .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-2SO5EGoJrNVyCTD9 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-2SO5EGoJrNVyCTD9 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-2SO5EGoJrNVyCTD9 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-2SO5EGoJrNVyCTD9 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-2SO5EGoJrNVyCTD9 .sequenceNumber{fill:white;}#mermaid-svg-2SO5EGoJrNVyCTD9 #sequencenumber{fill:#333;}#mermaid-svg-2SO5EGoJrNVyCTD9 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-2SO5EGoJrNVyCTD9 .messageText{fill:#333;stroke:none;}#mermaid-svg-2SO5EGoJrNVyCTD9 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-2SO5EGoJrNVyCTD9 .labelText,#mermaid-svg-2SO5EGoJrNVyCTD9 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-2SO5EGoJrNVyCTD9 .loopText,#mermaid-svg-2SO5EGoJrNVyCTD9 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-2SO5EGoJrNVyCTD9 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-2SO5EGoJrNVyCTD9 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-2SO5EGoJrNVyCTD9 .noteText,#mermaid-svg-2SO5EGoJrNVyCTD9 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-2SO5EGoJrNVyCTD9 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-2SO5EGoJrNVyCTD9 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-2SO5EGoJrNVyCTD9 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-2SO5EGoJrNVyCTD9 .actorPopupMenu{position:absolute;}#mermaid-svg-2SO5EGoJrNVyCTD9 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-2SO5EGoJrNVyCTD9 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-2SO5EGoJrNVyCTD9 .actor-man circle,#mermaid-svg-2SO5EGoJrNVyCTD9 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-2SO5EGoJrNVyCTD9 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 复杂任务请求 任务分解 子任务1 子任务2 子任务3 执行子任务1 执行子任务2 执行子任务3 子任务1完成 子任务2完成 子任务3完成 结果汇总 任务完成
6.2 代码示例:任务协调器
python
class TaskCoordinator:
def __init__(self):
self.agents = {}
self.tasks = {}
def register_agent(self, agent_id: str, capabilities: List[str]):
self.agents[agent_id] = {
"capabilities": capabilities,
"status": "idle"
}
def decompose_task(self, task: Dict[str, Any]) -> List[Dict[str, Any]]:
return [
{"subtask_id": f"{task['task_id']}-1", "requirements": ["analysis"]},
{"subtask_id": f"{task['task_id']}-2", "requirements": ["computation"]},
{"subtask_id": f"{task['task_id']}-3", "requirements": ["summary"]}
]
def assign_subtasks(self, task: Dict[str, Any]):
subtasks = self.decompose_task(task)
self.tasks[task["task_id"]] = {
"subtasks": subtasks,
"completed": [],
"status": "in_progress"
}
for subtask in subtasks:
for agent_id, info in self.agents.items():
if info["status"] == "idle":
if any(cap in subtask["requirements"] for cap in info["capabilities"]):
info["status"] = "busy"
self._assign_to_agent(agent_id, subtask)
break
def _assign_to_agent(self, agent_id: str, subtask: Dict[str, Any]):
pass
def mark_complete(self, task_id: str, subtask_id: str):
if task_id in self.tasks:
self.tasks[task_id]["completed"].append(subtask_id)
if len(self.tasks[task_id]["completed"]) == len(self.tasks[task_id]["subtasks"]):
self.tasks[task_id]["status"] = "completed"
七、总结与下一步
7.1 本文总结
本文介绍了多Agent系统的协同机制:
- 协同模式:集中式、分布式、混合式
- 协同算法:契约网协议、拍卖机制
- 任务分配:贪心算法、能力匹配
- 冲突解决:优先级、协商、随机
- 通信协议:组播、广播
7.2 下一步
下一篇文章将介绍Agent的情感与社交能力。
