Matrix 获取从方阵的一个点到另一个有障碍物的点的所有可能路径

Matrix 获取从方阵的一个点到另一个有障碍物的点的所有可能路径,matrix,octave,graph-theory,adjacency-matrix,Matrix,Octave,Graph Theory,Adjacency Matrix,我有一个方阵(比如5x5),有许多起点和终点(比如3组): 最终的目标是找到每对点的路径,这样就不会有路径穿过另一对点。在这个简单的例子中,可能有不止一个解,但在现实生活中,一旦你开始添加更多的点对,就会有一个唯一的解填充整个矩阵,这样就不会有一个正方形不被占用 然而,我的第一步是为每一对点找到从一个起点到其相应终点的所有可能路径,这样我就可以丢弃所有路径与另一条路径相交的路径。如果可能的话,我不想求助于图论,因为1)我对它一无所知,2)它似乎不是在八度音阶中实现的 我做了大量的研究,发现以下

我有一个方阵(比如5x5),有许多起点和终点(比如3组):

最终的目标是找到每对点的路径,这样就不会有路径穿过另一对点。在这个简单的例子中,可能有不止一个解,但在现实生活中,一旦你开始添加更多的点对,就会有一个唯一的解填充整个矩阵,这样就不会有一个正方形不被占用

然而,我的第一步是为每一对点找到从一个起点到其相应终点的所有可能路径,这样我就可以丢弃所有路径与另一条路径相交的路径。如果可能的话,我不想求助于图论,因为1)我对它一无所知,2)它似乎不是在八度音阶中实现的

我做了大量的研究,发现以下函数与我试图实现的几乎完全相同,但依赖于图论:

function pth = pathbetweennodes(adj, src, snk, verbose)
%PATHBETWEENNODES Return all paths between two nodes of a graph
%
% pth = pathbetweennodes(adj, src, snk)
% pth = pathbetweennodes(adj, src, snk, vflag)
%
%
% This function returns all simple paths (i.e. no cycles) between two nodes
% in a graph.  Not sure this is the most efficient algorithm, but it seems
% to work quickly for small graphs, and isn't too terrible for graphs with
% ~50 nodes.
%
% Input variables:
%
%   adj:    adjacency matrix
%
%   src:    index of starting node
%
%   snk:    index of target node
%
%   vflag:  logical scalar for verbose mode.  If true, prints paths to
%           screen as it traverses them (can be useful for larger,
%           time-consuming graphs). [false]
%
% Output variables:
%
%   pth:    cell array, with each cell holding the indices of a unique path
%           of nodes from src to snk.

% Copyright 2014 Kelly Kearney
我的问题是计算邻接矩阵。由于不熟悉图论,我有点理解邻接矩阵的概念,但对实际生成所述矩阵感到茫然

如果我分别对待每一对,并把其他占用的方块作为“限制”,我将有25 - 4 = 21个节点的每一个场景,在纸上,我可以写下来的边缘手动,但我不知道如何编码这一点?有人能帮忙吗

如果我们使用上面的示例并按行排列节点,考虑到蓝色的点对,我们会有类似的结果,目标是从节点1到节点17(反之亦然,不涉及方向性):

边是有效的移动(垂直或水平,无对角线),因此类似于:

1 - 2
2 - 1
2 - 3
2 - 6
3 - 2
3 - 4
etc...
你是如何从这段代码转换成一些代码的


当然,如果有更好的方法解决这个问题,我愿意接受任何建议。就问题的规模而言,它可以上升到一个10x10的网格,有10对起点/终点,因此有82个节点。

邻接矩阵是一个矩阵,如果节点
n
与所有其他元素相邻,元素
adj(n,:)
将用布尔值(或路径长度)告诉您。e、 在你的例子中,
adj(14,:)
除了
adj(14,9)
adj(14,15)
adj(14,18)
之外都是零

你从一个好的开始,但有点偏离了最初的。没有连接的节点仍然是系统中的节点。那会让你的生活更轻松

您的初始矩阵只是
node\u id=1:25
,或者如果您想要
node\u id=reformate(1:25,5,5)
。您不想访问的节点可以描述为与任何对象都不相邻的节点。因此,编程的方法是首先为5x5(或任何大小)网格创建邻接矩阵,然后删除所有不需要的路径,例如
adj(:,6)=0
(对于所有节点,确保它们不与节点6相邻(注意,节点是示例中的第一个红色圆圈))


要构建这个矩阵,你只需要知道哪些节点是相邻的,但是对于立方体来说,找到一个方程给你它的相邻节点是很容易的(或者只需检查
node\u id(ind2sub(你的节点)+[01])
和其他组合)

我明白了。谢谢,我会尝试一下,然后再报告。谢谢,我先创建了一个由零组成的矩阵,然后在有有效移动的地方添加一个(为此,我使用了一组if..elseif…else语句来检查矩阵元素是否位于外部边界上或矩阵的中心-可能有一种更好的方法可以做到这一点,但它是有效的),然后将被占用节点的行和列设置为0。查看生成的邻接矩阵(假设节点按列编号,从左上角的1开始),我确信有一种更快的定义方法,但现在我有了一个解决方案。我现在在尝试寻找多条路径的交点时遇到了另一个问题,但这是另一个主题,所以我将接受这个问题并提出另一个问题。再次感谢。@am304快速方法是创建一个更大的矩阵,计算方向差,然后裁剪方向结果,因此可以避免边界条件的ifs。
1 - 2
2 - 1
2 - 3
2 - 6
3 - 2
3 - 4
etc...