多智能体动态规划需要先给出状态、联合动作、转移和成本。下面用两个协作智能体完成各自一次任务的确定性模型,比较先做 A、先做 B 和等待。它是已知模型上的集中式规划,没有训练神经网络,也不代表分散个体能在缺少全局信息时直接执行。
明确每一步的约束与成本
状态 (a,b) 的两个分量为 0 或 1,分别表示 A、B 的任务是否完成。动作 (u,v) 为是否在本步完成相应任务;共享工具只能支持一人,所以 u+v≤1。已完成任务不能重复完成。完成 A 花费 2,完成 B 花费 3;步末 A 未完成额外计 1,B 未完成计 0.5。时域结束每个未完成任务计 10。所有数值是教学设定。

有限时域递推为 V(h,s)=min动作[本步成本+V(h−1,下一状态)],V(0,s) 为终端成本。Berkeley 教材说明 Bellman 的一步转移与后续价值组合;这里将奖励最大化改写成成本最小化,并显式保留剩余步数,不能把它叫成无限时域收敛实验。
运行可缓存的递推
保存 joint_dp.py,用 Python 3 执行 python joint_dp.py。每次递推减一层,只有四个任务状态,因此本例可完整枚举。返回值包含最小成本和当前最优动作,平局按动作遍历顺序选。
from functools import lru_cache
from itertools import product
def choices(s):
return [a for a in product((0,1), repeat=2)
if sum(a)<=1 and all(not (done and action) for done,action in zip(s,a))]
def move(s,a):
nxt = tuple(max(done,action) for done,action in zip(s,a))
cost = 2*a[0]+3*a[1]+(1-nxt[0])+0.5*(1-nxt[1])
return nxt,cost
@lru_cache(None)
def solve(h,s):
if h==0:
return 10*sum(1-v for v in s),None
options=[]
for a in choices(s):
nxt,cost=move(s,a)
options.append((cost+solve(h-1,nxt)[0],a))
return min(options,key=lambda item:item[0])
s=(0,0)
print("optimal:",solve(2,s))
assert solve(2,s)==(5.5,(1,0))
for h in (2,1):
value,a=solve(h,s)
print("remaining,state,action,cost:",h,s,a,value)
s,_=move(s,a)
assert s==(1,1)
手算对照与改模型的方法
先 A 的第一步成本为 2+0.5=2.5,第二步 B 成本为 3,总计 5.5。先 B 的第一步为 3+1=4,第二步 A 为 2,总计 6;等待会额外增加未完成成本。输出应先选 (1,0),再选 (0,1)。这与按到达顺序 FIFO 排队不同:规划是按明确目标比较可能动作,排队只是执行给定调度规则。
终端罚款或剩余时域改变时,最佳动作可能改变;先更新数学定义再更新断言。随机转移需加入各后继状态的概率加权,局部观察需重新定义信息状态。多个个体的联合动作组合会快速膨胀,这段代码不承诺大规模调度性能。验收保留成本分解、动作约束和最终状态,不能只看函数返回一个数字就说协作优化完成。
资料与核对依据
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/33379.html