Python 在二进制网格中扩展块(膨胀)

Python 在二进制网格中扩展块(膨胀),python,algorithm,matrix,Python,Algorithm,Matrix,对于A*实现(为“汽车”机器人生成路径),我需要调整模型以考虑汽车的“宽度”,从而避免障碍物 我的一个想法是将所有障碍物扩展到汽车的宽度,这样所有离障碍物太近的单元也会被标记为障碍物 我尝试使用两种简单的算法来实现这一点,但速度仍然太慢(特别是在大网格上),因为它多次通过相同的单元格: unreachable = set() # I first add all the unreachables to a set to avoid 'propagation' for lin

对于A*实现(为“汽车”机器人生成路径),我需要调整模型以考虑汽车的“宽度”,从而避免障碍物

我的一个想法是将所有障碍物扩展到汽车的宽度,这样所有离障碍物太近的单元也会被标记为障碍物

我尝试使用两种简单的算法来实现这一点,但速度仍然太慢(特别是在大网格上),因为它多次通过相同的单元格:

    unreachable = set()
    # I first add all the unreachables to a set to avoid 'propagation'
    for line in self.grid:
        for cell in line:
            if not cell.reachable:
                unreachable.add(cell)

    for cell in unreachable:
        # I set as unreachable all the cell's neighbours in a certain radius
        for nCell in self.neighbours( cell, int(radius/division) ):
            nCell.reachable = False
以下是邻居的定义:

def neighbours(self, cell, radius = 1, unreachables = False):
    neighbours = set()
    for i in xrange(-radius, radius + 1):
        for j in xrange(-radius, radius + 1):
            x = cell.x + j
            y = cell.y + i
            if 0 <= y < self.height and 0 <= x < self.width and (self.grid[y][x].reachable or unreachables )) :
                neighbours.add(self.grid[y][x])

    return neighbours
def邻居(self,cell,radius=1,unreachables=False):
邻居=集合()
对于X范围内的i(-radius,radius+1):
对于X范围内的j(-半径,半径+1):
x=单元x+j
y=单元格。y+i

如果你要找的是已知的,如果你的障碍物和车是凸的,有一个线性算法来计算它。

你要找的是已知的,如果你的障碍物和车是凸的,有一个线性算法来计算它。

我最后用卷积和我的“地图”(一个矩阵,其中“1”是一个障碍,“0”是一个自由单元)作为第一个操作数,一个car大小的矩阵,所有矩阵都以“1”作为第二个操作数填充

这两个矩阵的卷积积积给出了一个矩阵,其中未到达任何障碍物的单元格(即:附近没有任何障碍物)的值为“0”,而在其附近至少有一个障碍物的单元格(即等于“1”的单元格)的值为!=0

下面是Python实现(对卷积产品使用scipy):


最后,我使用了卷积积,将我的“map”(一个矩阵,其中“1”是一个障碍,“0”是一个自由单元)作为第一个操作数,将一个car大小的矩阵作为第二个操作数,并用“1”填充

这两个矩阵的卷积积积给出了一个矩阵,其中未到达任何障碍物的单元格(即:附近没有任何障碍物)的值为“0”,而在其附近至少有一个障碍物的单元格(即等于“1”的单元格)的值为!=0

下面是Python实现(对卷积产品使用scipy):


你的代码没有意义,为什么最后要对不可访问中的单元格执行
:cell.reachable=False
?只有可访问设置为False的单元格才是不可访问的。呜呜。那部分代码不属于那里。删除它。谢谢!(但问题并不在于代码的这一部分。这一行前面的内容是导致算法变慢的原因)你的代码没有意义,为什么最后要对不可访问中的单元格执行
:cell.reachable=False
?只有可访问设置为False的单元格才是不可访问的。呜呜。那部分代码不属于那里。删除它。谢谢!(但问题并不在于代码的这一部分。这一行前面的内容是导致算法变慢的原因)看起来很像(特别是“膨胀”的常规页面)但是,你能给出更多关于如何使用“二进制”网格的细节吗?因为我不喜欢单独考虑每个障碍,而是用“形状”和“向量”来感谢你的答案,但是它还不够清楚,最后我用了一个“愚蠢”的卷积产品来做这个。(因为我的车的形状可以近似于一个“正方形”)看起来很像(特别是“扩张”的一般页面)但是,你能给出更多关于如何使用“二进制”网格的细节吗?因为我不喜欢单独考虑每个障碍,而是用“形状”和“向量”来感谢你的答案,但是它还不够清楚,最后我用了一个“愚蠢”的卷积产品来做这个。(因为我的车的形状可以近似于“正方形”)
    # r: car's radius; 1 : Unreachable ; 0 : Reachable
    car = scipy.array( [[1 for i in xrange(r)] for j in xrange(r)] )
    # Converting my map to a binary matrix
    grid = scipy.array( [[0 if self.grid[i][j].reachable else 1 for j in xrange(self.width)] for i in xrange(self.height)] )

    result = scipy.signal.fftconvolve( grid, car, 'same' )

    # Updating the map with the result
    for i in xrange(self.height):
        for j in xrange(self.width):
            self.grid[i][j].reachable = int(result[i][j]) == 0