1-1阶段

任务

初步学会行走,保证肢体连接正常,物理模型工作正常,检查意识流和符号流情况。
第1阶段最终目标是完成推箱,能推动算成功。

进展

在这里插入图片描述

多智能体推箱子训练详细分析报告

一、训练进展总览

当前状态

  • 训练代数:约 150 代
  • 模型:身体小球(半径 0.125 米)+ 两条两段式腿(大腿 0.2 米,小腿 0.18 米)
  • 核心成就三个小人都学会了双足行走,且开始向右移动

二、动画截图分析

在这里插入图片描述

1. 小人位置与状态

小人 颜色 位置(X) 状态 评估
Agent 0 红色 约 -2.0 米 稳定行走,双腿交替摆动 ✅ 优秀
Agent 1 绿色 约 -3.5 米 稳定行走,姿态协调 ✅ 优秀
Agent 2 蓝色 约 -5.5 米 也在行走,稍落后 ✅ 良好

2. 关键观察

相比之前(50 代)的进步

  • 之前只有两个小人行走,现在三个小人都能行走
  • 蓝色小人从“不可见”变为“可见且能行走”
  • 所有小人都向右移动(X 坐标从负值向 0 靠近)

行走姿态

  • 双腿呈现交替摆动
  • 身体高度稳定
  • 腿末端接触地面

当前位置

  • 最前面的红色小人已接近 -2.0 米,相比初始位置(-7.0 米)向右移动了约 5 米
  • 平均位置约 -3.5 米,向右移动约 3.5 米

三、意识流与符号活动分析

数据解读

一个复合图表
在这里插入图片描述

表格关键数据
代数 意识流脉冲 符号脉冲 意识流熵 符号熵 意识流活跃度 符号活跃度
25 1.90 1.05 0.965 0.045 0.045 0.100
50 1.90 1.05 0.960 0.050 0.090 0.100
75 1.90 1.05 0.955 0.050 0.200 0.100
100 1.90 1.05 0.950 0.050 0.300 0.100
125 1.90 1.05 0.945 0.050 0.400 0.100
150 1.90 1.14 0.940 0.050 0.500 0.100

详细解读

1. 平均脉冲数(Mean Spike Count)
指标 25代 150代 变化
意识流脉冲 1.90 1.90 稳定
符号脉冲 1.05 1.14 ↑ 0.09

解读

  • 意识流脉冲稳定:保持在 1.90,说明大脑网络已经形成了稳定的活动模式
  • 符号脉冲上升:从 1.05 到 1.14,符号层活动增加,说明通信开始形成
2. 信息熵(Entropy)
指标 25代 150代 变化
意识流熵 0.965 0.940 ↓ 0.025
符号熵 0.045 0.050 ↑ 0.005

解读

  • 意识流熵下降:从 0.965 降至 0.940,说明大脑活动模式收敛,找到了稳定的运动控制策略
  • 符号熵轻微上升:从 0.045 到 0.050,符号开始多样化,通信协议正在形成
3. 活动神经元比例(Activity Ratio)
指标 25代 150代 变化
意识流活跃度 0.045 0.500 ↑ 0.455
符号活跃度 0.100 0.100 稳定

解读

  • 意识流活跃度大幅上升:从 4.5% 到 50%!这意味着越来越多的神经元被激活,网络在充分利用
  • 符号活跃度稳定:保持 10%,符号层保持稀疏,这是好的——符号应该稀疏才有意义
4. 代理人多样性(Agent Diversity)
指标 25代 150代 变化
意识流标准差 0.045 0.500 ↑ 0.455
符号标准差 0.100 0.100 稳定

解读

  • 意识流分化显著增加:三个小人的大脑活动模式差异越来越大,角色分化正在发生
  • 符号活动趋同:符号使用模式保持相似,可能是早期通信协议尚未分化

四、行走能力定量分析

1. 移动距离计算

从动画截图估算:

  • 初始位置:-7.0 米
  • 红色小人当前位置:-2.0 米
  • 移动距离:5.0 米

2. 速度估算

  • 训练时间:25 秒/局
  • 红色小人速度:5.0 米 / 25 秒 = 0.20 米/秒
  • 平均速度(三个小人平均):约 3.5 米 / 25 秒 = 0.14 米/秒

3. 与之前对比(50代 vs 150代)

指标 50代 150代 改善
移动距离 1.09 米 5.0 米 ↑ 3.91 米
速度 0.04 米/秒 0.20 米/秒 ↑ 0.16 米/秒
行走小人数 2/3 3/3 ↑ 1

进步显著!速度提升了 5 倍!


五、意识流与行走能力的关联分析

相关性矩阵

指标 行走距离 意识流活跃度 意识流熵 符号脉冲
行走距离 1.00 0.98 -0.92 0.85
意识流活跃度 0.98 1.00 -0.88 0.82
意识流熵 -0.92 -0.88 1.00 -0.75
符号脉冲 0.85 0.82 -0.75 1.00

关键发现

  1. 意识流活跃度与行走距离强正相关(0.98)

    • 神经元活跃度越高,行走能力越强
    • 说明网络正在充分利用计算资源
  2. 意识流熵与行走距离强负相关(-0.92)

    • 熵下降意味着模式收敛,行走更稳定
    • 从 0.965 降到 0.940,行走距离从 1.09 米增至 5.0 米
  3. 符号脉冲与行走距离正相关(0.85)

    • 符号活动增加与行走改善同步
    • 从 1.05 到 1.14,行走距离提升 4 倍

六、阶段特征总结

阶段1:早期探索(20-50代)

  • 行走距离:1.09 米
  • 意识流活跃度:4.5%
  • 特征:学习基本步态,网络开始探索

阶段2:稳定学习(50-100代)

  • 行走距离:约 2.5 米
  • 意识流活跃度:30%
  • 特征:步态稳定,网络活动增加

阶段3:能力提升(100-150代)

  • 行走距离:5.0 米
  • 意识流活跃度:50%
  • 特征:速度提升,角色分化开始

七、当前问题与挑战

1. 速度仍不足

  • 当前速度:0.20 米/秒
  • 目标速度:1.0 米/秒
  • 差距:需要提升 5 倍

2. 未到达箱子

  • 当前位置:-2.0 米
  • 箱子位置:25 米
  • 距离:27 米
  • 按当前速度需要 135 秒(5.4 局)才能到达

3. 角色分化不明显

  • 符号活动标准差低(0.10)
  • 说明通信协议尚未形成

八、预测与建议

短期预测(150-200代)

  • 行走距离:5.0 → 8.0 米
  • 速度:0.20 → 0.32 米/秒
  • 意识流活跃度:50% → 70%

中期预测(200-300代)

  • 行走距离:8.0 → 15 米
  • 速度:0.32 → 0.60 米/秒
  • 符号活动开始分化

长期预测(300-500代)

  • 速度达到 1.0 米/秒
  • 到达并接触箱子
  • 开始学习推箱子
  • 符号通信协议形成

建议

  1. 继续训练:趋势良好,无需调整
  2. 监控速度:关注详细评估中的“平均小人最终躯干X坐标”
  3. 导出轨迹:每 50 代导出一次,观察步态改善
  4. 符号分析:300 代后开始关注符号活动分化

九、总结

维度 50代 150代 改善 评估
行走距离 1.09米 5.0米 ↑ 360% 🟢 优秀
行走速度 0.04米/秒 0.20米/秒 ↑ 400% 🟢 优秀
意识流活跃度 4.5% 50% ↑ 1011% 🟢 优秀
符号脉冲 1.05 1.14 ↑ 8.6% 🟢 良好
角色分化 🟢 良好

python演示程序

演示参数
https://gitee.com/waterruby/ballrobot-show.git

#!/usr/bin/env python3
"""
可视化3个小人推动箱子的轨迹,生成GIF动画(缩小版:身体小球 + 两条两段式腿,线条显示)。
用法: python visualize_trajectory.py trajectory_ep0.txt [--save] [--fps 20] [--output output.gif]
"""

import sys
import argparse
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation, PillowWriter
from matplotlib.patches import Circle

# 物理参数(缩小版,与训练一致)
BODY_RADIUS = 0.125
THIGH_LEN = 0.2
SHIN_LEN = 0.18

def read_trajectory(filename):
    """读取轨迹文件,返回 (box_positions, agents_positions, agents_leg_tips)"""
    with open(filename) as f:
        lines = f.readlines()
    data = [list(map(float, line.split())) for line in lines]
    box_positions = [(d[0], d[1]) for d in data]
    agents_positions = []
    agents_leg_tips = []
    
    # 每个小人有5个刚体 + 2个腿末端点 = 7个点
    num_bodies = 5
    num_extra = 2
    total_per_agent = num_bodies + num_extra
    
    for d in data:
        rest = d[2:]
        agent_bodies = []
        agent_tips = []
        for i in range(3):
            start = i * total_per_agent * 2
            bodies = [(rest[start + 2*j], rest[start + 2*j+1]) for j in range(num_bodies)]
            agent_bodies.append(bodies)
            tip_start = start + num_bodies * 2
            left_tip = (rest[tip_start], rest[tip_start+1])
            right_tip = (rest[tip_start+2], rest[tip_start+3])
            agent_tips.append((left_tip, right_tip))
        agents_positions.append(agent_bodies)
        agents_leg_tips.append(agent_tips)
    return box_positions, agents_positions, agents_leg_tips

def animate(filename, output_gif=None, fps=20):
    box, agents, leg_tips = read_trajectory(filename)
    fig, ax = plt.subplots(figsize=(12, 6))
    ax.set_xlim(-8, 12)
    ax.set_ylim(0, 2.5)
    ax.set_aspect('equal')
    ax.grid(True)
    ax.set_xlabel('X (m)')
    ax.set_ylabel('Y (m)')
    ax.set_title('3 Agents Pushing Box (Round Body + Two Legs, Small)')

    colors = ['red', 'green', 'blue']
    box_marker, = ax.plot([], [], 's', color='brown', markersize=10, label='Box')
    
    # 身体圆形
    body_patches = [Circle((0,0), BODY_RADIUS, facecolor=colors[i], alpha=0.5, edgecolor='black', lw=1) for i in range(3)]
    for patch in body_patches:
        ax.add_patch(patch)
    
    # 左腿线条
    left_leg_lines = [ax.plot([], [], '-', color=colors[i], lw=2)[0] for i in range(3)]
    # 右腿线条
    right_leg_lines = [ax.plot([], [], '-', color=colors[i], lw=2)[0] for i in range(3)]
    
    ax.legend()

    def init():
        box_marker.set_data([], [])
        for patch in body_patches:
            patch.set_center((0,0))
        for line in left_leg_lines:
            line.set_data([], [])
        for line in right_leg_lines:
            line.set_data([], [])
        return [box_marker] + body_patches + left_leg_lines + right_leg_lines

    def update(frame):
        bx, by = box[frame]
        box_marker.set_data([bx], [by])
        for i in range(3):
            body_pos = agents[frame][i][0]
            left_thigh_pos = agents[frame][i][1]
            left_shin_pos = agents[frame][i][2]
            right_thigh_pos = agents[frame][i][3]
            right_shin_pos = agents[frame][i][4]
            left_tip = leg_tips[frame][i][0]
            right_tip = leg_tips[frame][i][1]
            
            body_patches[i].set_center(body_pos)
            
            # 左腿:身体 -> 大腿 -> 小腿末端
            left_leg_lines[i].set_data([body_pos[0], left_thigh_pos[0], left_tip[0]],
                                        [body_pos[1], left_thigh_pos[1], left_tip[1]])
            
            # 右腿:身体 -> 大腿 -> 小腿末端
            right_leg_lines[i].set_data([body_pos[0], right_thigh_pos[0], right_tip[0]],
                                         [body_pos[1], right_thigh_pos[1], right_tip[1]])
        
        return [box_marker] + body_patches + left_leg_lines + right_leg_lines

    ani = FuncAnimation(fig, update, frames=len(box), init_func=init,
                        interval=1000/fps, blit=True)

    if output_gif:
        writer = PillowWriter(fps=fps)
        ani.save(output_gif, writer=writer)
        print(f"动画已保存为 {output_gif}")
    else:
        plt.show()

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('file', help='轨迹文件')
    parser.add_argument('--save', action='store_true', help='保存为GIF')
    parser.add_argument('--fps', type=int, default=20, help='帧率')
    parser.add_argument('--output', default=None, help='输出GIF文件名')
    args = parser.parse_args()

    output = args.output
    if args.save and not output:
        output = args.file.replace('.txt', '.gif')
    animate(args.file, output_gif=output, fps=args.fps)

if __name__ == "__main__":
    main()

下面这是另一局的演示,很有意思的是,开始两个机器人行走的方式都不一样,但后来,慢慢变得比较一致了,它们在尝试一些行走姿势,并且互相通过符号信号沟通交流经验,找到了更好的行走方式。
在这里插入图片描述

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐