7.5 KiB
7.5 KiB
3x3视野贪心资源收集算法使用指南
概述
本项目实现了一个基于3x3视野的贪心算法,用于在迷宫环境中收集资源。该算法的核心特点是:
- 视野限制:每次移动时只考虑当前位置周围3x3范围内的单元格
- 贪心策略:在可见范围内选择价值最高的资源
- 移动限制:只能进行上下左右四个方向的移动
- 智能探索:当视野内没有资源时,会进行探索性移动寻找新资源
文件说明
主要文件
greedy_3x3_algorithm.py
- 独立的3x3视野贪心算法模块tanxin.py
- 原有的贪心算法实现,已集成新的3x3算法greedy_resource_collector.py
- 完整版本的贪心收集器(支持全局搜索)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
算法流程
- 初始化:从起点开始,初始化路径和收集状态
- 视野扫描:获取当前位置3x3范围内的所有单元格
- 资源评估:
- 优先选择正价值资源(金币)
- 如果没有正价值资源,选择损失最小的负价值资源(陷阱)
- 移动决策:
- 如果找到资源,移动到该位置并收集
- 如果没有资源,进行探索性移动到未访问的位置
- 循环执行:重复步骤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视野贪心算法'
}
性能特点
优势
- 局部最优:在有限视野内做出最优决策
- 探索能力:能够智能探索未知区域
- 资源优先:优先收集高价值资源,避免低价值陷阱
- 防死循环:具备多种机制防止无限循环
限制
- 视野限制:可能错过视野外的高价值资源
- 局部陷阱:可能陷入局部最优解
- 路径效率:为了收集资源,路径可能不是最短的
测试用例
项目包含多个测试迷宫:
简单测试迷宫
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标准库