目前,我的寻路系统遇到了一些麻烦,该系统在我的大图上“通常”很慢:
图形的每个顶点定义为:
最后一条规则是,地球不与海洋相连(所以我们有很多子图)。
我的启发式方法非常经典:我计算当前顶点位置和目标位置之间的点。
我没有针对边缘的预先计算权重。 我使用“复杂”算法(取决于步行者的速度,地面的类型,如果我们向上或向下)
float PathWorld::updateWeight(const Agent& agent, const EdgeInfo& edgeInfo) const
{
const Agent::Navigation& navigation = agent.getNavigation();
const auto& fromTerrain = edgeInfo._from->_terrain;
const auto& toTerrain = edgeInfo._to->_terrain;
const float mean = (navigation._speed.at(fromTerrain._type) + navigation._speed.at(toTerrain._type)) * 0.5f;
const float diff = BT::Maths::clamp((1000.0f + toTerrain._height - fromTerrain._height) / 1000.0f, 0.5f, 2.0f);
return edgeInfo._distance / mean * diff;
}
目前,当我计算一条路径时,执行时间不到1毫秒到1秒。路径解仅在8或80个顶点之间,而我没有比例时间。 (因此8个顶点路径可能需要1秒,而80个顶点路径则需要1 ms)。
我使用Visual Studio进行了快速分析:提高是我的瓶颈。
所有完整的代码和测试数据都可以在我的GitHub上找到。
https://github.com/Rominitch/myBlogSource/tree/master/DEMO/TestPathfinding
简单/小型演示不受我的困扰。只是复杂的情况。 所有图形均由同一程序(未发布)生成。
我的测试程序真的是假的: -我进入一个节点进入图表 -在此之后(使用索引)获取XXX个节点并计算路径。
输出:
Statistics:
Start node: Ocean H= 0 SubGraph= 2
nbValid: 2053/15000 (valid path / number of path computed)
min / max: 1/75 (number of vertex in path computed)
min time for one path: 0 ms
max time for one path: 7 ms
Statistics:
Start node: Forest H= 100 SubGraph= 1
nbValid: 1420/1500
min / max: 1/76
min time for one path: 0 ms
max time for one path: 558 ms
Statistics:
Start node: Swamp H= 50 SubGraph= 1
nbValid: 601/1000
min / max: 1/51
min time for one path: 0 ms
max time for one path: 1246 ms
Statistics:
Start node: Clay H= 300 SubGraph= 22
nbValid: 138/15000
min / max: 1/12
min time for one path: 0 ms
max time for one path: 0 ms
谢谢!
答案 0 :(得分:2)
好!我发现了问题。
当前,Bug属于我的启发式实现,该实现不计算当前节点与目标之间的距离平方。 只是进行“准随机”启发式。
此外,就我而言
boost::astar_search
表现不如
boost::astar_search_tree
最后,我也优化了我的图形(删除了虚拟边缘)。
新统计信息:
Statistics:
Start node: Ocean H= 0 SubGraph= 2
nbValid: 2028/15000
min / max: 1/145
min time for one path: 0 ms
max time for one path: 13 ms
mean: 0 ms
Global time: 1845 ms
Statistics:
Start node: Forest H= 100 SubGraph= 1
nbValid: 1420/1500
min / max: 1/92
min time for one path: 0 ms
max time for one path: 13 ms
mean: 0 ms
Global time: 1232 ms
Statistics:
Start node: Swamp H= 50 SubGraph= 1
nbValid: 601/1000
min / max: 1/50
min time for one path: 0 ms
max time for one path: 11 ms
mean: 0 ms
Global time: 504 ms
Statistics:
Start node: Clay H= 300 SubGraph= 23
nbValid: 138/15000
min / max: 1/17
min time for one path: 0 ms
max time for one path: 1 ms
mean: 0 ms
Global time: 115 ms