maze_python/README_3x3_GREEDY.md
2025-07-01 10:12:59 +08:00

7.5 KiB
Raw Blame History

3x3视野贪心资源收集算法使用指南

概述

本项目实现了一个基于3x3视野的贪心算法用于在迷宫环境中收集资源。该算法的核心特点是

  • 视野限制每次移动时只考虑当前位置周围3x3范围内的单元格
  • 贪心策略:在可见范围内选择价值最高的资源
  • 移动限制:只能进行上下左右四个方向的移动
  • 智能探索:当视野内没有资源时,会进行探索性移动寻找新资源

文件说明

主要文件

  1. greedy_3x3_algorithm.py - 独立的3x3视野贪心算法模块
  2. tanxin.py - 原有的贪心算法实现已集成新的3x3算法
  3. greedy_resource_collector.py - 完整版本的贪心收集器(支持全局搜索)
  4. strict_3x3_greedy.py - 严格的3x3视野算法演示

演示文件

  • greedy_resource_collector.py - 包含演示的完整贪心算法
  • strict_3x3_greedy.py - 专门的3x3算法演示

使用方法

1. 基本使用

from greedy_3x3_algorithm import Greedy3x3Algorithm

# 创建迷宫(二维数组,[y][x]格式)
maze = [
    ['s', '0', 'g5', '1', 't3'],  # s=起点, g5=价值5的金币, 1=墙壁, t3=损失3的陷阱
    ['0', '1', '0', '0', 'g2'],   # 0=可通行路径
    ['g3', '0', '1', 't2', '0'],
    ['0', 't1', '0', '0', 'g4'],
    ['1', '0', 'g1', '0', 'e']    # e=终点
]

# 创建算法实例
algorithm = Greedy3x3Algorithm(maze, debug=True)

# 运行算法
result = algorithm.run()

# 查看结果
print(f"总价值: {result['total_value']}")
print(f"收集资源数量: {result['resources_count']}")
print(f"移动步数: {result['total_moves']}")

# 打印详细结果
algorithm.print_result()

2. 在现有项目中集成

from tanxin import Greedy3x3ResourceCollector

# 使用现有的迷宫数据
map_data = your_maze_data  # 二维数组格式

# 创建收集器
collector = Greedy3x3ResourceCollector(map_data)

# 运行收集算法
result = collector.run_3x3_greedy_collection()

# 获取兼容格式的路径 (y, x格式)
path_yx = collector.get_path()
total_reward = collector.get_total_reward()
marked_map = collector.add_path_to_map()

3. 运行演示

# 运行独立算法演示
python greedy_3x3_algorithm.py

# 运行集成演示
echo "2" | python tanxin.py

# 运行比较演示
python strict_3x3_greedy.py

算法详解

地图元素说明

  • s - 起点 (Start)
  • e - 终点 (End)
  • g数字 - 金币资源,数字表示价值(如 g5 = 价值5的金币
  • t数字 - 陷阱资源,数字表示损失(如 t3 = 损失3的陷阱
  • 0 - 可通行的路径
  • 1 - 墙壁,无法通过
  • l - 锁/机关
  • b - Boss

算法流程

  1. 初始化:从起点开始,初始化路径和收集状态
  2. 视野扫描获取当前位置3x3范围内的所有单元格
  3. 资源评估
    • 优先选择正价值资源(金币)
    • 如果没有正价值资源,选择损失最小的负价值资源(陷阱)
  4. 移动决策
    • 如果找到资源,移动到该位置并收集
    • 如果没有资源,进行探索性移动到未访问的位置
  5. 循环执行重复步骤2-4直到满足停止条件

停止条件

  • 达到最大移动步数默认1000步
  • 连续多步默认20步无法找到新资源
  • 无法进行任何移动

算法参数

Greedy3x3Algorithm 参数

algorithm = Greedy3x3Algorithm(
    maze,                    # 必需:迷宫地图
    start_pos=None,         # 可选:起始位置(x,y),默认自动寻找
    end_pos=None,           # 可选:目标位置(x,y),默认自动寻找  
    debug=False             # 可选:是否输出调试信息
)

result = algorithm.run(
    max_moves=1000,         # 最大移动步数
    max_stuck=20            # 连续无资源的最大步数
)

结果格式

算法执行后返回的结果字典包含:

{
    'path': [(x1,y1), (x2,y2), ...],           # 移动路径 (x,y格式)
    'path_yx_format': [(y1,x1), (y2,x2), ...], # 移动路径 (y,x格式兼容现有代码)
    'collected_resources': [                     # 收集的资源详情
        {
            'position': (x, y),
            'type': 'g5',
            'value': 5
        },
        ...
    ],
    'total_value': 15,                          # 资源总价值
    'total_moves': 25,                          # 总移动步数
    'resources_count': 8,                       # 收集资源数量
    'start_pos': (0, 0),                        # 起始位置
    'end_pos': (4, 4),                          # 目标位置
    'final_pos': (2, 3),                        # 最终位置
    'explored_positions_count': 15,             # 探索位置数量
    'algorithm_name': '3x3视野贪心算法'
}

性能特点

优势

  1. 局部最优:在有限视野内做出最优决策
  2. 探索能力:能够智能探索未知区域
  3. 资源优先:优先收集高价值资源,避免低价值陷阱
  4. 防死循环:具备多种机制防止无限循环

限制

  1. 视野限制:可能错过视野外的高价值资源
  2. 局部陷阱:可能陷入局部最优解
  3. 路径效率:为了收集资源,路径可能不是最短的

测试用例

项目包含多个测试迷宫:

简单测试迷宫

simple_maze = [
    ['s', '0', 'g5', '1', 't3'],
    ['0', '1', '0', '0', 'g2'],
    ['g3', '0', '1', 't2', '0'],
    ['0', 't1', '0', '0', 'g4'],
    ['1', '0', 'g1', '0', 'e']
]

复杂测试迷宫

complex_maze = [
    ['s', '0', 'g5', '1', 't3', '0', 'g8'],
    ['0', '1', '0', '0', 'g2', '1', '0'],
    ['g3', '0', '1', 't2', '0', '0', 'g6'],
    ['0', 't1', '0', '0', 'g4', '1', '0'],
    ['1', '0', 'g1', '0', '0', '0', 't5'],
    ['0', 'g7', '0', '1', '0', 'g9', '0'],
    ['t4', '0', '0', '0', '1', '0', 'e']
]

扩展开发

自定义评估函数

可以通过继承 Greedy3x3Algorithm 类来自定义资源评估逻辑:

class CustomGreedy3x3(Greedy3x3Algorithm):
    def _evaluate_resource_value(self, cell):
        # 自定义评估逻辑
        if cell.startswith('special'):
            return 100  # 特殊资源高价值
        return super()._evaluate_resource_value(cell)

自定义移动策略

class CustomGreedy3x3(Greedy3x3Algorithm):
    def _find_exploration_target(self):
        # 自定义探索策略
        adjacent = self.get_adjacent_positions(self.current_pos)
        # 选择最靠近终点的位置
        if adjacent:
            return min(adjacent, key=lambda pos: 
                abs(pos[0] - self.end_pos[0]) + abs(pos[1] - self.end_pos[1]))
        return None

常见问题

Q: 算法为什么会在某些位置反复移动?

A: 这是因为算法在视野内找不到新资源时会进行探索性移动。连续20步无资源后会自动停止。

Q: 如何提高算法的收集效率?

A: 可以调整参数:

  • 减小 max_stuck 参数,减少无效探索
  • 增加迷宫中的资源密度
  • 优化迷宫布局,减少死胡同

Q: 算法支持什么样的迷宫格式?

A: 支持二维列表格式,使用 [y][x] 索引方式。单元格内容为字符串。

Q: 如何集成到现有项目?

A: 可以使用 tanxin.py 中的 Greedy3x3ResourceCollector 类,它与现有代码兼容。

版本信息

  • 版本: 1.0
  • 作者: GitHub Copilot
  • 创建日期: 2025年1月
  • Python版本: 3.6+
  • 依赖: 无额外依赖使用Python标准库