402 lines
13 KiB
Markdown
402 lines
13 KiB
Markdown
# 路径规划算法插件
|
||
|
||
一个功能完整的路径规划算法系统插件,为EG引擎提供多种经典和现代路径规划算法的实现。
|
||
|
||
## 功能特性
|
||
|
||
### 核心算法
|
||
- **A*算法**: 经典的启发式搜索算法,支持多种启发式函数和优化选项
|
||
- **Dijkstra算法**: 保证最短路径的搜索算法
|
||
- **BFS算法**: 广度优先搜索,适用于无权图
|
||
- **DFS算法**: 深度优先搜索,可能更快找到任意路径
|
||
- **JPS算法**: Jump Point Search,针对网格地图优化的A*算法,性能比传统A*快数倍
|
||
|
||
### 算法管理
|
||
- **统一接口**: 所有算法通过统一接口访问
|
||
- **参数配置**: 支持算法参数配置和调整
|
||
- **性能统计**: 自动收集和分析算法性能数据
|
||
- **批量测试**: 支持批量测试多个算法和场景
|
||
- **算法推荐**: 根据场景特点自动推荐最适合的算法
|
||
- **基准测试**: 对算法进行性能基准测试
|
||
|
||
### 可视化功能
|
||
- **网格显示**: 可视化显示网格地图,区分可通行区域和障碍物
|
||
- **路径绘制**: 实时绘制计算出的路径,支持动画效果
|
||
- **交互编辑**: 通过可视化界面编辑地图
|
||
- **场景切换**: 支持多种预设场景
|
||
- **节点可视化**: 可视化已访问节点和开放列表节点
|
||
- **动画支持**: 支持路径查找过程的动画演示
|
||
|
||
### 编辑器功能
|
||
- **可视化编辑**: 图形化界面编辑路径规划场景
|
||
- **多种工具**: 选择、添加障碍、移除障碍、设置起点终点等工具
|
||
- **场景生成**: 自动生成多种类型的测试场景
|
||
- **算法比较**: 直接在编辑器中比较不同算法性能
|
||
|
||
### 高级特性
|
||
- **性能优化**: 多种算法优化技术,包括启发式权重调整、Tie Breaker等
|
||
- **复杂度分析**: 提供各算法的时间和空间复杂度信息
|
||
- **数据验证**: 自动验证输入数据的有效性
|
||
- **报告生成**: 生成详细的算法性能报告
|
||
- **缓存机制**: 缓存性能数据以供后续分析
|
||
|
||
## 使用方法
|
||
|
||
### 快捷键操作
|
||
- **F1**: 切换路径规划编辑器显示
|
||
- **F2**: 切换可视化显示
|
||
- **F3**: 运行演示
|
||
- **F4**: 清除可视化
|
||
- **F5**: 比较算法性能
|
||
- **F6**: 显示统计信息
|
||
- **F7**: 生成算法报告
|
||
- **F8**: 优化路径
|
||
- **F9**: 生成随机场景
|
||
- **F10**: 切换动画
|
||
- **F11**: 显示算法信息
|
||
- **F12**: 导出详细报告
|
||
|
||
### GUI界面操作
|
||
插件会在屏幕左上角创建控制面板,右上角创建编辑器面板,可以通过按钮直接操作路径规划功能。
|
||
|
||
### 编程接口
|
||
```python
|
||
# 获取插件实例
|
||
pathfinding_plugin = world.plugin_manager.get_plugin("pathfinding_algorithms")
|
||
|
||
# 创建网格
|
||
grid = [[0, 0, 0, 1, 0],
|
||
[0, 1, 0, 1, 0],
|
||
[0, 1, 0, 0, 0],
|
||
[0, 0, 0, 1, 0],
|
||
[0, 0, 0, 0, 0]]
|
||
|
||
# 设置起点和终点
|
||
start = (0, 0)
|
||
goal = (4, 4)
|
||
|
||
# 使用A*算法查找路径
|
||
path, stats = pathfinding_plugin.find_path("astar", grid, start, goal)
|
||
|
||
if path:
|
||
print(f"找到路径,长度: {len(path)}")
|
||
print(f"访问节点数: {stats['nodes_visited']}")
|
||
print(f"耗时: {stats['time_taken']}秒")
|
||
else:
|
||
print("未找到路径")
|
||
|
||
# 可视化路径
|
||
pathfinding_plugin.visualize_path(path, grid)
|
||
|
||
# 获取可用算法列表
|
||
algorithms = pathfinding_plugin.get_available_algorithms()
|
||
print("可用算法:", algorithms)
|
||
|
||
# 设置算法参数
|
||
pathfinding_plugin.set_algorithm_parameter("astar", "heuristic", "euclidean")
|
||
|
||
# 获取算法参数
|
||
parameters = pathfinding_plugin.get_algorithm_parameters("astar")
|
||
print("A*算法参数:", parameters)
|
||
|
||
# 添加自定义算法
|
||
class CustomAlgorithm:
|
||
def find_path(self, grid, start, goal):
|
||
# 实现自定义算法
|
||
pass
|
||
|
||
pathfinding_plugin.add_algorithm("custom", CustomAlgorithm, "自定义算法描述")
|
||
|
||
# 比较算法性能
|
||
pathfinding_plugin.compare_algorithms()
|
||
|
||
# 生成报告
|
||
report = pathfinding_plugin.generate_report()
|
||
print("算法报告:", report)
|
||
|
||
# 设置可视化参数
|
||
pathfinding_plugin.set_visualization_settings({
|
||
'grid_color': LColor(0.7, 0.7, 0.7, 1.0),
|
||
'path_color': LColor(1.0, 0.5, 0.0, 1.0)
|
||
})
|
||
|
||
# 获取可视化参数
|
||
settings = pathfinding_plugin.get_visualization_settings()
|
||
print("可视化设置:", settings)
|
||
|
||
# 启用动画
|
||
pathfinding_plugin.enable_visualization_animation(True)
|
||
|
||
# 批量测试算法
|
||
test_cases = [
|
||
{'grid': grid, 'start': (0, 0), 'goal': (4, 4), 'name': 'test1'},
|
||
{'grid': grid, 'start': (1, 1), 'goal': (3, 3), 'name': 'test2'}
|
||
]
|
||
results = pathfinding_plugin.batch_test_algorithms(['astar', 'bfs'], test_cases)
|
||
|
||
# 详细比较算法
|
||
detailed_results = pathfinding_plugin.compare_algorithms_detailed(
|
||
['astar', 'jps'], grid, start, goal)
|
||
|
||
# 获取缓存的性能数据
|
||
performance_data = pathfinding_plugin.get_cached_performance_data('astar')
|
||
|
||
# 清除性能缓存
|
||
pathfinding_plugin.clear_performance_cache()
|
||
|
||
# 重置统计信息
|
||
pathfinding_plugin.reset_statistics()
|
||
|
||
# 验证网格数据
|
||
validation_result = pathfinding_plugin.validate_grid_data(grid)
|
||
print("网格验证结果:", validation_result)
|
||
|
||
# 获取算法复杂度信息
|
||
complexity = pathfinding_plugin.get_algorithm_complexity('astar')
|
||
print("A*算法复杂度:", complexity)
|
||
|
||
# 基准测试算法
|
||
benchmark_results = pathfinding_plugin.benchmark_algorithm('astar', grid, start, goal, 1000)
|
||
print("基准测试结果:", benchmark_results)
|
||
|
||
# 为特定网格优化算法
|
||
pathfinding_plugin.optimize_algorithm_for_grid('jps', grid)
|
||
```
|
||
|
||
## 核心组件
|
||
|
||
### 算法管理器
|
||
负责各种路径规划算法的注册、配置和执行。
|
||
|
||
主要功能:
|
||
- 算法注册和管理
|
||
- 参数配置和调整
|
||
- 统一接口访问
|
||
- 性能统计和分析
|
||
- 批量测试支持
|
||
- 算法推荐系统
|
||
|
||
### 可视化管理器
|
||
负责路径规划算法的可视化显示。
|
||
|
||
主要功能:
|
||
- 网格地图可视化
|
||
- 路径绘制和显示
|
||
- 起点终点标记
|
||
- 可视化参数配置
|
||
- 节点可视化(已访问节点、开放列表)
|
||
- 动画支持
|
||
|
||
### 路径规划编辑器
|
||
提供可视化编辑路径规划场景的功能。
|
||
|
||
主要功能:
|
||
- 图形化界面编辑
|
||
- 多种编辑工具
|
||
- 场景生成和管理
|
||
- 算法性能比较
|
||
|
||
## 算法说明
|
||
|
||
### A*算法
|
||
A*是一种启发式搜索算法,结合了Dijkstra算法的准确性和贪心最佳优先搜索的效率。
|
||
|
||
特点:
|
||
- 通过启发式函数指导搜索方向
|
||
- 保证找到最优解(在启发式函数可接受的情况下)
|
||
- 适用于静态环境
|
||
- 支持多种启发式函数(曼哈顿距离、欧几里得距离、切比雪夫距离等)
|
||
- 支持对角线移动和角落切割
|
||
- 支持Tie Breaker优化
|
||
|
||
### Dijkstra算法
|
||
Dijkstra算法是一种用于计算单源最短路径的经典算法。
|
||
|
||
特点:
|
||
- 保证找到最短路径
|
||
- 适用于权重图
|
||
- 时间复杂度较高
|
||
- 不需要启发式函数
|
||
|
||
### BFS算法
|
||
广度优先搜索算法,保证找到最短路径(在无权图中)。
|
||
|
||
特点:
|
||
- 保证找到最短路径
|
||
- 适用于无权图
|
||
- 内存使用较多
|
||
- 实现简单
|
||
|
||
### DFS算法
|
||
深度优先搜索算法,不保证找到最短路径,但可能更快找到任意路径。
|
||
|
||
特点:
|
||
- 可能更快找到路径
|
||
- 不保证最优解
|
||
- 内存使用较少
|
||
- 支持深度限制
|
||
|
||
### JPS算法
|
||
Jump Point Search是一种优化的A*算法,专门用于网格地图。
|
||
|
||
特点:
|
||
- 针对网格地图优化
|
||
- 比传统A*更快
|
||
- 保持A*的最优性
|
||
- 利用网格特性跳过大量不必要的节点
|
||
- 适用于大型网格地图
|
||
|
||
## 场景生成
|
||
|
||
### 简单场景
|
||
空的网格地图,适用于基本测试。
|
||
|
||
### 迷宫场景
|
||
使用深度优先搜索算法生成的迷宫。
|
||
|
||
### 房间场景
|
||
包含多个房间和走廊的复杂场景。
|
||
|
||
### 随机场景
|
||
随机生成障碍物的场景。
|
||
|
||
### 隧道场景
|
||
多条曲折隧道的场景。
|
||
|
||
## 性能优化
|
||
|
||
### 算法优化
|
||
- **启发式函数**: 多种启发式函数可选,适应不同场景
|
||
- **启发式权重**: 可调整权重平衡搜索速度和最优性
|
||
- **对角线移动**: 支持对角线移动提高效率
|
||
- **Tie Breaker**: 使用tie breaker优化打破平局
|
||
- **JPS优化**: 利用跳点搜索跳过大量节点
|
||
|
||
### 内存管理
|
||
- **对象复用**: 减少对象创建和销毁开销
|
||
- **批量处理**: 提高大量数据处理效率
|
||
- **缓存机制**: 缓存性能数据供后续分析
|
||
|
||
### 渲染优化
|
||
- **LOD支持**: 根据距离调整显示细节
|
||
- **视锥剔除**: 只渲染可见区域
|
||
- **批处理**: 合并相似的渲染调用
|
||
- **透明度优化**: 优化透明节点的渲染
|
||
|
||
## 扩展开发
|
||
|
||
### 添加新的路径规划算法
|
||
1. 在[algorithms](file:///home/hello/EG/plugins/user/pathfinding_algorithms/algorithms)目录中创建新的算法文件
|
||
2. 实现算法类,确保有find_path方法
|
||
3. 在[algorithm_manager.py](file:///home/hello/EG/plugins/user/pathfinding_algorithms/core/algorithm_manager.py)中注册新算法
|
||
|
||
### 添加新的场景生成器
|
||
1. 在[utils/demo_scenarios.py](file:///home/hello/EG/plugins/user/pathfinding_algorithms/utils/demo_scenarios.py)中实现新的场景生成函数
|
||
2. 在编辑器中添加对应的生成选项
|
||
|
||
### 添加新的可视化效果
|
||
1. 在[visualization_manager.py](file:///home/hello/EG/plugins/user/pathfinding_algorithms/visualization/visualization_manager.py)中实现新的可视化方法
|
||
2. 在编辑器中添加对应的控制选项
|
||
|
||
## 故障排除
|
||
|
||
### 路径查找失败
|
||
1. 检查起点和终点是否在可通行区域内
|
||
2. 确认网格数据格式是否正确
|
||
3. 检查算法参数设置
|
||
4. 使用数据验证功能检查网格有效性
|
||
|
||
### 性能问题
|
||
1. 使用算法比较功能分析性能瓶颈
|
||
2. 调整启发式权重优化搜索效率
|
||
3. 简化网格结构
|
||
4. 对于大型网格考虑使用JPS算法
|
||
|
||
### 可视化问题
|
||
1. 确认GUI系统是否正常工作
|
||
2. 检查可视化参数设置
|
||
3. 重新启用插件尝试
|
||
|
||
## API参考
|
||
|
||
### Plugin类主要方法
|
||
|
||
#### 初始化和控制
|
||
- `initialize()` - 初始化插件
|
||
- `enable()` - 启用插件
|
||
- `disable()` - 禁用插件
|
||
- `finalize()` - 清理插件资源
|
||
- `update(dt)` - 更新插件状态
|
||
|
||
#### 路径查找
|
||
- `find_path(algorithm, grid, start, goal)` - 查找路径
|
||
- `add_algorithm(name, algorithm_class, description)` - 添加新算法
|
||
- `remove_algorithm(name)` - 移除算法
|
||
- `get_available_algorithms()` - 获取可用算法列表
|
||
- `get_algorithm_description(algorithm)` - 获取算法描述
|
||
- `set_algorithm_parameter(algorithm, parameter, value)` - 设置算法参数
|
||
- `get_algorithm_parameters(algorithm)` - 获取算法参数
|
||
|
||
#### 可视化
|
||
- `visualize_path(path, grid)` - 可视化路径
|
||
- `visualize_grid(grid)` - 可视化网格
|
||
- `visualize_visited_nodes(visited_nodes)` - 可视化已访问节点
|
||
- `visualize_open_list(open_list)` - 可视化开放列表
|
||
- `clear_path_visualization()` - 清除路径可视化
|
||
- `set_visualization_settings(settings)` - 设置可视化参数
|
||
- `get_visualization_settings()` - 获取可视化参数
|
||
- `enable_visualization_animation(enable)` - 启用可视化动画
|
||
|
||
#### 性能和统计
|
||
- `compare_algorithms()` - 比较算法性能
|
||
- `show_stats()` - 显示统计信息
|
||
- `generate_report()` - 生成报告
|
||
- `batch_test_algorithms(algorithms, test_cases)` - 批量测试算法
|
||
- `compare_algorithms_detailed(algorithms, grid, start, goal)` - 详细比较算法
|
||
- `get_cached_performance_data(algorithm)` - 获取缓存的性能数据
|
||
- `clear_performance_cache()` - 清除性能缓存
|
||
- `reset_statistics()` - 重置统计信息
|
||
- `validate_grid_data(grid)` - 验证网格数据
|
||
- `get_algorithm_complexity(algorithm)` - 获取算法复杂度信息
|
||
- `benchmark_algorithm(algorithm, grid, start, goal, iterations)` - 基准测试算法
|
||
- `optimize_algorithm_for_grid(algorithm, grid)` - 为特定网格优化算法
|
||
|
||
#### 编辑器功能
|
||
- `toggle_editor()` - 切换编辑器显示
|
||
- `toggle_visualization()` - 切换可视化显示
|
||
- `run_demo()` - 运行演示
|
||
- `clear_visualization()` - 清除可视化
|
||
- `generate_random_scenario()` - 生成随机场景
|
||
- `toggle_animation()` - 切换动画
|
||
- `show_algorithm_info()` - 显示算法信息
|
||
- `export_detailed_report()` - 导出详细报告
|
||
|
||
## 性能调优建议
|
||
|
||
### 算法选择
|
||
1. 对于需要最优解的场景,使用A*或Dijkstra算法
|
||
2. 对于只需要找到任意路径的场景,使用BFS或DFS算法
|
||
3. 对于大型网格地图,使用JPS算法
|
||
4. 根据场景特点使用算法推荐功能
|
||
|
||
### 参数调整
|
||
1. 合理设置启发式权重(通常1.0为最佳)
|
||
2. 根据场景特点选择合适的启发式函数
|
||
3. 对于DFS算法,合理设置深度限制
|
||
4. 对于A*算法,考虑启用Tie Breaker优化
|
||
|
||
### 场景优化
|
||
1. 简化不必要的障碍物
|
||
2. 减小网格尺寸
|
||
3. 使用分层路径规划处理大场景
|
||
4. 对于静态环境,考虑预计算路径
|
||
|
||
## 版本信息
|
||
|
||
- 版本: 1.0.0
|
||
- 作者: EG Team
|
||
- 发布日期: 2024年
|
||
|
||
## 许可证
|
||
|
||
本插件遵循EG引擎许可证协议。 |