问题在于机器人和机器人需要拾取的物体在探路者中都是一个像素宽.实际上它们要大得多.通常A *探路者选择沿着障碍物的边缘放置路线,有时会使它与它们发生碰撞,我们不希望这样做.
我试图在障碍物上增加一些不可行走的领域,但它并不总是很好.它仍然与障碍物碰撞,在不允许行走的情况下添加太多点,导致它没有可以运行的路径.
你有什么建议可以解决这个问题吗?
编辑:
所以我按照Justin L的建议,在障碍物周围添加了大量成本,这导致了堕落:
Grid with no path http://sogaard.us/uploades/1_grid_no_path.png
在这里你可以看到障碍物周围的成本,最初中间的两个障碍物看起来就像角落里的障碍物,但是在运行我们的探路者后,似乎成本被覆盖了:
Grid with path http://sogaard.us/uploades/1_map_grid.png
Picture that shows things found on the picture http://sogaard.us/uploades/2_complete_map.png
Path found http://sogaard.us/uploades/3_path.png
这是发现的路径,因为我们的问题也是在拥抱障碍之前.
The grid from before with the path on http://sogaard.us/uploades/4_mg_path.png
另一张带有路径的成本地图的图片.
所以我觉得奇怪的是A *探路者为什么要压倒这些非常高的现场成本.
是不是当它使用当前字段评估打开列表中的节点时,看当前字段路径是否比打开列表中的路径短?
这是我用于探路者的代码:
Pathfinder.cs:http://pastebin.org/343774
Field.cs和Grid.cs:http://pastebin.org/343775
解决方法
也许就像线性渐变一样简单:
C = -mx + b
其中x是到最近物体的距离,b是边界外的成本权,m是成本消失的速率.当然,如果C为负数,则应将其设置为0.
也许是一个简单的双曲线衰变
C = b/x
其中b是边界外的理想成本.一旦达到某个低点,就截止到0.
或者,您可以使用指数衰减
C = k e^(-hx)
其中k是缩放常数,h是衰减速率.再次,切断是明智的.
第二个建议
我从未将A *应用于像素映射的地图;几乎总是,瓷砖.
您可以尝试大幅降低瓷砖的“分辨率”吗?也许每十个十或二十二个像素的一个瓦片;磁贴的成本是磁贴中像素的最高成本.
此外,您可以尝试对您用于A *的最短距离启发式进行去估值.