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

268 lines
7.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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. 基本使用
```python
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. 在现有项目中集成
```python
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. 运行演示
```bash
# 运行独立算法演示
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 参数
```python
algorithm = Greedy3x3Algorithm(
maze, # 必需:迷宫地图
start_pos=None, # 可选:起始位置(x,y),默认自动寻找
end_pos=None, # 可选:目标位置(x,y),默认自动寻找
debug=False # 可选:是否输出调试信息
)
result = algorithm.run(
max_moves=1000, # 最大移动步数
max_stuck=20 # 连续无资源的最大步数
)
```
## 结果格式
算法执行后返回的结果字典包含:
```python
{
'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. **路径效率**:为了收集资源,路径可能不是最短的
## 测试用例
项目包含多个测试迷宫:
### 简单测试迷宫
```python
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']
]
```
### 复杂测试迷宫
```python
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` 类来自定义资源评估逻辑:
```python
class CustomGreedy3x3(Greedy3x3Algorithm):
def _evaluate_resource_value(self, cell):
# 自定义评估逻辑
if cell.startswith('special'):
return 100 # 特殊资源高价值
return super()._evaluate_resource_value(cell)
```
### 自定义移动策略
```python
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标准库