在特定点之间找到三维中最短(最快)的路径

时间:2015-09-25 18:35:47

标签: matlab graph 3d shortest-path floyd-warshall

这是我的问题陈述:

我有一个指定尺寸的立方体。随着时间的推移,在这个立方体中会产生一些球。我已经模拟了坐标(x,y,z位置),生成时间和球的大小。现在我需要找到重叠球的最短路径,将立方体的上侧连接到下方并找到完成此路径的时间。

我现在想到的是找到所有点之间的欧氏距离和球半径的总和。然后将距离与总和进行比较以找到重叠矩阵。然后找到顶部的所有对象,其z大小小于0且z +大小大于多维数据集的深度,然后我应该找到路径。 我提前感谢任何帮助和想法。

例如,考虑以下数据和我迄今为止开发的代码:

offspr_x = [1 3 5 1 2]
offspr_y = [3 3 1 8 2]
offspr_z = [1 4 5 3 2]
size = [2 1 4 6 3]
time = [2 5 6 3 8]

Pos= [offspr_x' offspr_y' offspr_z']
dd=pdist(Pos,'euclidean')
ddm = squareform(dd)


% compute similar matrix based on sum of object sizes (assumes size is radius)

drad = meshgrid(size)+ meshgrid(size)';
dadj = ddm.*(ddm <= drad);

现在我需要将重叠矩阵转换为图形对象,并尝试找到offspr_z-size&lt;这些点之间的最短路径。 0(顶部的所有对象的z大小小于0)和offspr_z + size&gt; 5(底部的对象的z +大小大于5):

starts = find(offspr_z-size < 0)
ends = find(offspr_z+size > 5)

更新:正如@beaker建议的那样,我也尝试了Floyd-Warshall,这里是我使用的代码:

function D = FastFloyd(D)

n = size(D, 1); 

for k=1:n

    i2k = repmat(D(:,k), 1, n);
    k2j = repmat(D(k,:), n, 1);

    D = min(D, i2k+k2j);

end

end

因此,对于:

 dadj(dadj==0)=Inf
 D = FastFloyd(dadj)

我得到了以下结果:

D =

3.4641    4.1815    6.0000    5.3852    1.7321
4.1815    4.8990    3.0000    5.4772    2.4495
6.0000    3.0000    6.0000    8.3066    4.3589
5.3852    5.4772    8.3066   10.7703    6.1644
1.7321    2.4495    4.3589    6.1644    3.4641

但我需要在开始和结束向量之间找到最短(最快)的路径(那些与立方体的上下表面重叠的点)。我说最快,因为我对最小的距离不感兴趣,但是在最短的时间内......

1 个答案:

答案 0 :(得分:0)

你有个好的开始:

offspr_x = [1 3 5 1 2]
offspr_y = [3 3 1 8 2]
offspr_z = [1 4 5 3 2]
size = [2 1 4 6 3]
time = [2 5 6 3 8]

Pos= [offspr_x' offspr_y' offspr_z']
dd=pdist(Pos,'euclidean')

pdist为您提供距离矢量。要将其更改为可识别的内容,请使用squareform

ddm = squareform(dd)

现在我们将您的计算用于半径矩阵,然后使用邻接矩阵:

% compute similar matrix based on sum of object sizes (assumes size is radius)

drad = meshgrid(size)+ meshgrid(size)';
adj = ddm.*(ddm <= drad);

这会在ddm中找到小于其各自半径距离的值,并将其用作蒙版以从ddm获取值。

以下是测试用例的输出:

adj =

   0.00000   0.00000   6.00000   5.38516   1.73205
   0.00000   0.00000   3.00000   5.47723   2.44949
   6.00000   3.00000   0.00000   8.30662   4.35890
   5.38516   5.47723   8.30662   0.00000   6.16441
   1.73205   2.44949   4.35890   6.16441   0.00000