【发布时间】:2019-03-20 12:26:20
【问题描述】:
根据许多相关信息,当满足所需条件(统一成本网格等)时,Jump Point Search 似乎严格优于 A*
但是经过一些实际测试,我发现 Jump Point Search 的搜索时间与 A* 几乎相同(甚至更糟......),我对此不太确定......(实现问题?随机网格?)
搜索实现来自here,测试代码如下:
int profileCount = 256;
long elapsedJumpPoint = 0;
long elapsedAStar = 0;
for (int i = 0; i < profileCount; ++i)
{
// random set obstacles here
RandomizeGrid(searchGrid);
{
searchGrid.Reset();
var stopWatch = Stopwatch.StartNew();
jumpParam.DiagonalMovement = (DiagonalMovement)cbbJumpType.SelectedIndex;
jumpParam.CurIterationType = cbUseRecursive.Checked ? IterationType.RECURSIVE : IterationType.LOOP;
jumpParam.Reset(startPos, endPos);
var path = JumpPointFinder.FindPath(jumpParam);
elapsedJumpPoint += stopWatch.ElapsedMilliseconds;
}
{
searchGrid.Reset();
var stopWatch = Stopwatch.StartNew();
starParam.DiagonalMovement = (DiagonalMovement)cbbJumpType.SelectedIndex;
starParam.SetHeuristic(HeuristicMode.EUCLIDEAN);
starParam.Reset(startPos, endPos);
var path = AStarFinder.FindPath(starParam);
elapsedAStar += stopWatch.ElapsedMilliseconds;
}
}
MessageBox.Show(string.Format("JP time : {0}ms\nA* time : {1}ms", elapsedJumpPoint / (float)profileCount, elapsedAStar / (float)profileCount));
RandomizeGrid 代码在这里:
void RandomizeGrid(BaseGrid searchGrid, float randomPercent = 0.2f)
{
if (searchGrid != null)
{
var width = searchGrid.width;
var height = searchGrid.height;
for (int i = 0; i < width; ++i)
{
for (int j = 0; j < height; ++j)
{
searchGrid.SetWalkableAt(new GridPos(i, j), true);
}
}
var random = new Random();
for (int i = 0; i < width * height * randomPercent; ++i)
{
var randWidth = random.Next(0, width);
var randHeight = random.Next(0, height);
searchGrid.SetWalkableAt(new GridPos(randWidth, randHeight), false);
}
}
}
下面还列出了一些测试结果:
|随机百分比 |太平绅士 |一个* |
| 0.05 | ~8.7ms | ~8.2ms |
| 0.1 | ~11ms | ~14.3 毫秒 |
| 0.2 | ~15ms | ~13.7 毫秒 |
| 0.5 | ~20.5ms | ~22ms |
【问题讨论】:
-
您能否更具体地说明研究表明它“严格意义上更好”?这是否意味着跑步的时间?你能分享你的跑步结果吗?均值和方差,所以我可以检查这是否具有统计意义?您确定您的设置符合规定的标准吗?您是否比较过其他实现?性能计数器会给出不同的结果吗?这在另一个 stackexchange 网站上是否更好,例如数据科学?
-
RandomizeGrid的随机性如何?当然,如果因为到处都是障碍物而找不到跳跃点,JPS 就无法使用它的主要功能。 -
抱歉代码缺失,我添加了 RandomizeGrid