268 lines
7.5 KiB
Markdown
268 lines
7.5 KiB
Markdown
# 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标准库
|