@TOC## 一、项目背景最近在做 Python 课程的 GridBot 实验,这是一个非常有意思的具身智能入门项目。我们接手了一个"醉汉机器人"——它在 10×10 的网格世界里随机乱走,平均要 350 步才能到终点,成功率只有 60%,金币全靠碰运气。任务目标:优化 decide 函数的策略,让机器人变得更聪明!## 二、Baseline 表现有多差?先看看 baseline 的表现(醉汉策略):| 指标 | Baseline | 说明 ||:—|:—😐:—|| 平均步数 | ~416 步 | 走得慢,还经常绕圈 || 金币收集率 | ~46% | 全靠碰运气 || 通关成功率 | 7/15(47%) | 迷宫图经常超时失败 || 总分 | 21 / 50 | 刚及格边缘 |baseline 的核心问题:- 没有方向感:随机选择前进或转向,就像喝醉酒的人- 不知道目标在哪:完全不利用终点坐标信息- 记不住路:同一个地方反复走- 不会捡金币:路过金币全靠运气## 三、我的优化思路我采用了分层优先级策略,从高到低依次是:### 策略 1:金币优先(最高优先级)前后左右四个方向,只要看到金币就去捡。如果同时有多个方向有金币,选离终点更近的那个。### 策略 2:目标导向寻路利用曼哈顿距离(Manhattan Distance)作为启发函数,每一步都选择让自己离终点更近的方向。这是一种贪心策略。### 策略 3:记忆避重用 perception["memory"] 记录每个格子的访问次数,走过的地方增加惩罚权重,减少走回头路的概率。### 策略 4:综合评分每个可行方向的得分 = 到终点的曼哈顿距离 + 访问次数惩罚 + 靠近终点奖励,选得分最低的方向。## 四、核心代码实现python"""GridBot 智能机器人 — 寻路+金币+记忆综合策略"""# 方向常量NORTH, EAST, SOUTH, WEST = 0, 1, 2, 3DIR_NAME_TO_NUM = {"北": NORTH, "东": EAST, "南": SOUTH, "西": WEST}# 每个方向的坐标增量DIR_DELTA = { NORTH: (0, -1), EAST: (1, 0), SOUTH: (0, 1), WEST: (-1, 0),}# 相对方向转绝对方向RELATIVE_TO_ABSOLUTE = { "front": lambda d: d, "right": lambda d: (d + 1) % 4, "back": lambda d: (d + 2) % 4, "left": lambda d: (d + 3) % 4,}def _abs_dir(perception, relative): """相对方向 → 绝对方向""" cur_dir = DIR_NAME_TO_NUM[perception["direction"]] return RELATIVE_TO_ABSOLUTE[relative](cur_dir)def _next_pos(pos, abs_dir): """计算走一步后的位置""" x, y = pos dx, dy = DIR_DELTA[abs_dir] return (x + dx, y + dy)def _manhattan_distance(p1, p2): """曼哈顿距离""" return abs(p1[0] - p2[0]) + abs(p1[1] - p2[1])def _turn_action(from_dir, to_dir): """计算转向动作""" diff = (to_dir - from_dir) % 4 if diff == 0: return None # 已经朝对了 elif diff == 1: return "右转" elif diff == 2: return "后转" else: return "左转"def decide(perception): """综合策略决策函数""" pos = perception["position"] target = perception["target"] cur_dir = DIR_NAME_TO_NUM[perception["direction"]] memory = perception["memory"] # 初始化记忆:访问次数字典 if not memory: memory.append({}) visited = memory[0] visited[pos] = visited.get(pos, 0) + 1 # 收集四个方向的信息 dir_info = {} for rel in ("front", "right", "back", "left"): abs_d = _abs_dir(perception, rel) dir_info[abs_d] = perception[rel] # ========== 策略1:看到金币就去捡 ========== coin_dirs = [d for d, cell in dir_info.items() if cell == "金币"] if coin_dirs: best_coin_dir = min( coin_dirs, key=lambda d: ( _manhattan_distance(_next_pos(pos, d), target) + visited.get(_next_pos(pos, d), 0) * 50 ) ) action = _turn_action(cur_dir, best_coin_dir) return "前进" if action is None else action # ========== 策略2:朝终点走(贪心 + 记忆惩罚)========== candidates = [] for d, cell in dir_info.items(): if cell in ("墙壁", "边界"): continue next_p = _next_pos(pos, d) dist = _manhattan_distance(next_p, target) visit_penalty = visited.get(next_p, 0) * 30 closer_bonus = -10 if dist < _manhattan_distance(pos, target) else 0 candidates.append((dist + visit_penalty + closer_bonus, d)) if candidates: candidates.sort() best_dir = candidates[0][1] action = _turn_action(cur_dir, best_dir) return "前进" if action is None else action # ========== 兜底:右转 ========== return "右转"## 五、优化前后对比运行 python run.py --evaluate 评测结果:### 各地图详细表现| 地图 | Baseline 步数 | 我的版本步数 | Baseline 金币 | 我的版本金币 | Baseline 通关 | 我的版本通关 ||:—|:—😐:—😐:—😐:—😐:—😐:—:|| 地图1 — 新手村 | 374 | 24 | 78% | 33% | 2/3 | 3/3 || 地图2 — 小径 | 299 | 21 | 33% | 25% | 2/3 | 3/3 || 地图3 — 花园 | 447 | 24 | 60% | 60% | 1/3 | 3/3 || 地图4 — 迷宫入口 | 458 | 22 | 50% | 17% | 2/3 | 3/3 || 地图5 — 挑战迷宫 | 500 | 27 | 10% | 29% | 0/3 | 3/3 |### 总体对比| 指标 | Baseline | 我的版本 | 提升 ||:—|:—😐:—😐:—|| 平均步数 | 416 | 24 | 快了 17.3 倍! || 金币收集率 | 46% | 33% | 略有下降(后续优化) || 通关成功率 | 47% | 100% | 翻倍还多! || 自动评测总分 | 21 / 50 | 43 / 50 | 提升 105% |## 六、踩坑与心得### 踩坑点 1:相对方向 vs 绝对方向刚开始我直接用 perception["front"] 来判断方向,但机器人的朝向会变,“前面"不是固定的北边。后来才想明白:感知信息都是相对当前朝向的,需要转换成绝对方向才能和坐标对应起来。解决方法:用一个字典把相对方向(前/右/后/左)映射成绝对方向(北/东/南/西)的偏移量。### 踩坑点 2:记忆空间的初始化perception["memory"] 是一个 list,刚开始我直接 memory.append(pos) 存位置,但后来发现每次调用 decide 都会 append,导致列表越来越长,查找效率低。解决方法:改成字典 {位置: 访问次数},查找 O(1),还能量化惩罚。### 踩坑点 3:贪心策略会陷入局部最优纯贪心策略(只朝终点走)在遇到墙壁时会卡住——因为所有靠近终点的方向都被墙挡住了。机器人会在原地反复左右转。解决方法:加入记忆惩罚,让机器人"记住"走过的路,遇到死胡同时倾向于走没走过的方向,自然就能绕出去。### 学习心得1. 具身智能的感知-行动循环:机器人只能"看到"前后左右四个格子,不能开上帝视角。这让我深刻体会到了感知的局限性——智能就是在有限信息下做出好决策。2. 分层策略的威力:简单的几条规则按优先级组合,效果就远超随机策略。不需要复杂的算法。3. 记忆很重要:没有记忆的智能体就是醉汉。哪怕只是简单记录"我去过哪”,也能大幅提升效率。4. Trade-off 无处不在:金币收集率下降了,因为策略优先保证到达终点。这是一个设计选择——你的目标是什么,就优化什么。## 七、后续优化方向1. BFS/A 寻路*:如果允许记忆完整地图,可以用 BFS 预先计算最优路径2. 更智能的金币收集:路过金币附近时可以稍微绕路去捡,而不是只有相邻时才捡3. 死路标记:确定走不通的路径标记为死路,避免反复探索4. 强化学习:用 Q-learning 让机器人自己学策略## 八、总结从 baseline 的 21 分提升到 43 分,翻倍的进步!核心思路其实很简单——目标导向 + 记忆避重 + 金币优先,不到 200 行代码就让一个随机乱走的醉汉变成了能稳定通关的智能体。这个项目让我第一次真切感受到:算法的力量不在于有多复杂,而在于能不能用对地方。一个简单的贪心策略加上记忆,就能产生质的飞跃。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐