繁体   English   中英

最低成本路径/最低成本路径

[英]Minimum cost path / least cost path

我目前正在使用来自skimage.graph和函数route_through_array的库来获取成本图中从一个点到另一个点的最小成本路径。 问题是我有多个起点和多个终点,这导致数千次迭代。 我目前正在用两个for循环修复此问题。 以下代码只是一个示例:

img=np.random.rand(400,400)
img=img.astype(dtype=int)
indices=[]
costs=[]
start=[[1,1],[2,2],[3,3],[4,5],[6,17]]
end=[[301,201],[300,300],[305,305],[304,328],[336,317]]
for i in range(len(start)):
    for j in range(len(end)):
        index, weight = route_through_array(img, start[i],end[j])
        indices.append(index)
        costs.append(weight)

根据我从文档中了解到的功能,该函数接受许多端点,但是我不知道如何在函数中传递它们。 有任何想法吗?

通过直接与skimage.graph.MCP Cython类进行交互,应该可以更加有效地实现skimage.graph.MCP目的。 便利包装器route_through_array不够通用。 假设我正确理解了您的问题,那么您所寻找的基本上是MCP.find_costs()方法。

您的代码将如下所示(忽略导入)

img = np.random.rand(400,400)
img = img.astype(dtype=int)
starts = [[1,1], [2,2], [3,3], [4,5], [6,17]]
ends = [[301,201], [300,300], [305,305], [304,328], [336,317]]

# Pass full set of start and end points to `MCP.find_costs`
from skimage.graph import MCP
m = MCP(img)
cost_array, tracebacks_array = m.find_costs(starts, ends)

# Transpose `ends` so can be used to index in NumPy
ends_idx = tuple(np.asarray(ends).T.tolist())
costs = cost_array[ends_idx]

# Compute exact minimum cost path to each endpoint
tracebacks = [m.traceback(end) for end in ends]

请注意,原始输出cost_array实际上是一个与img形状相同的完全密集的数组,该数组仅在您要求终点的位置具有有限值。 这种方法唯一可能的问题是,从多个起点开始的最小路径是否会收敛到同一终点。 通过上面的代码,您只会获得这些收敛路径中较低者的完整追溯。

追溯步骤仍然有一个循环。 通过使用tracebacks_array并与`m.offsets进行交互,可以消除这种情况,这也可以消除上述的歧义。 但是,如果您只想要最低成本和最佳路径,则可以省略此循环-只需使用argmin找到最低成本,然后跟踪该单个端点(或几个端点,如果多个端点被捆绑在一起以获得最低成本) ) 背部。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM