ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

GridBot网格机器人优化实战:从醉汉随机走到智能寻路

GridBot网格机器人优化实战:从醉汉随机走到智能寻路 TOC## 一、项目背景最近在做 Python 课程的 GridBot 实验这是一个非常有意思的具身智能入门项目。我们接手了一个醉汉机器人——它在 10×10 的网格世界里随机乱走平均要 350 步才能到终点成功率只有 60%金币全靠碰运气。任务目标优化decide函数的策略让机器人变得更聪明## 二、Baseline 表现有多差先看看 baseline 的表现醉汉策略| 指标 | Baseline | 说明 ||:—|:—:—|| 平均步数 | ~416 步 | 走得慢还经常绕圈 || 金币收集率 | ~46% | 全靠碰运气 || 通关成功率 | 7/1547% | 迷宫图经常超时失败 || 总分 | 21 / 50 | 刚及格边缘 |baseline 的核心问题-没有方向感随机选择前进或转向就像喝醉酒的人-不知道目标在哪完全不利用终点坐标信息-记不住路同一个地方反复走-不会捡金币路过金币全靠运气## 三、我的优化思路我采用了分层优先级策略从高到低依次是### 策略 1金币优先最高优先级前后左右四个方向只要看到金币就去捡。如果同时有多个方向有金币选离终点更近的那个。### 策略 2目标导向寻路利用曼哈顿距离Manhattan Distance作为启发函数每一步都选择让自己离终点更近的方向。这是一种贪心策略。### 策略 3记忆避重用perception[memory]记录每个格子的访问次数走过的地方增加惩罚权重减少走回头路的概率。### 策略 4综合评分每个可行方向的得分 到终点的曼哈顿距离 访问次数惩罚 靠近终点奖励选得分最低的方向。## 四、核心代码实现pythonGridBot 智能机器人 — 寻路金币记忆综合策略# 方向常量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, keylambda 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 行代码就让一个随机乱走的醉汉变成了能稳定通关的智能体。这个项目让我第一次真切感受到算法的力量不在于有多复杂而在于能不能用对地方。一个简单的贪心策略加上记忆就能产生质的飞跃。
返回列表