获取带权值连接路径的matlab代码
Matlab code to get connection paths with weights
在我 运行 Matlab 程序之后,我得到的矩阵在每一行和每一列中只有一个条目。
Mat(:,:,1) = [0 0.3; 0.9 0] - stage 1
Mat(:,:,2) = [0.7 0; 0 0.4] - stage 2
Mat(:,:,3) = [0 0.1; 0.5 0] - stage 3
如果我在第(i,j)个位置有入口,表示这个(当前)阶段第i个节点与下一个(未来)阶段第j个节点相连,入口的值表示它的路径权重。
如上例:
Mat(:,:,1)
表示阶段 1 的第一个节点与阶段 2 的第二个节点连接,阶段 1 的第二个节点与阶段 2 的第一个节点连接。
Mat(:,:,2)
表示阶段 2 的第一个节点与阶段 3 的第一个节点连接,阶段 2 的第二个节点与阶段 3 的第二个节点连接。
Mat(:,:,3)
表示阶段 3 的第一个节点与阶段 4 的第二个节点连接,阶段 3 的第二个节点与阶段 4 的第一个节点连接。
那么,stage-1到stage-4的连接路径可以给出权重:
path1=[0.3, 0.4, 0.5]
path2=[0.9, 0.7, 0.1]
但是我不知道如何使用Matlab代码得到这两个path1和path2向量。这是我 运行 最简单的例子,用于 2 x 2 矩阵,但我的实际情况是具有 #n 路径的一般 n x n 矩阵。
当给出所有 Mat(:,:,n) 矩阵时,有人可以帮助我使用 matlab 获得这些路径吗?
首先创建隐式图的邻接矩阵。然后进行一次DFS,找出所有从第一阶段开始的路径:
script.m
Mat = zeros(2,2,3);
Mat(:,:,1) = [0 0.3;0.9 0];
Mat(:,:,2) = [0.7 0;0 0.4];
Mat(:,:,3) = [0 0.1;0.5 0];
Z = size(Mat,3);
N = size(Mat,1);
adjacency = zeros( (Z+1) * N );
for z=1:size(Mat,3)
for r=1:size(Mat,1)
for c=1:size(Mat,2)
if Mat(r,c,z) > 0
adjacency( (z-1)*N + r , (z)*N + c) = Mat(r,c,z);
end
end
end
end
for i=1:N
dfs( adjacency, i, [])
end
dfs.m
function dfs(adj, node, path_)
flag = 0;
for i=1:size(adj,2)
if adj(node, i) > 0
flag = 1;
dfs(adj,i,[path_ adj(node,i)])
end
end
if flag==0
path_
end
end
输出
path_ =
0.3000 0.4000 0.5000
path_ =
0.9000 0.7000 0.1000
在我 运行 Matlab 程序之后,我得到的矩阵在每一行和每一列中只有一个条目。
Mat(:,:,1) = [0 0.3; 0.9 0] - stage 1
Mat(:,:,2) = [0.7 0; 0 0.4] - stage 2
Mat(:,:,3) = [0 0.1; 0.5 0] - stage 3
如果我在第(i,j)个位置有入口,表示这个(当前)阶段第i个节点与下一个(未来)阶段第j个节点相连,入口的值表示它的路径权重。
如上例:
Mat(:,:,1)
表示阶段 1 的第一个节点与阶段 2 的第二个节点连接,阶段 1 的第二个节点与阶段 2 的第一个节点连接。
Mat(:,:,2)
表示阶段 2 的第一个节点与阶段 3 的第一个节点连接,阶段 2 的第二个节点与阶段 3 的第二个节点连接。
Mat(:,:,3)
表示阶段 3 的第一个节点与阶段 4 的第二个节点连接,阶段 3 的第二个节点与阶段 4 的第一个节点连接。
那么,stage-1到stage-4的连接路径可以给出权重:
path1=[0.3, 0.4, 0.5]
path2=[0.9, 0.7, 0.1]
但是我不知道如何使用Matlab代码得到这两个path1和path2向量。这是我 运行 最简单的例子,用于 2 x 2 矩阵,但我的实际情况是具有 #n 路径的一般 n x n 矩阵。
当给出所有 Mat(:,:,n) 矩阵时,有人可以帮助我使用 matlab 获得这些路径吗?
首先创建隐式图的邻接矩阵。然后进行一次DFS,找出所有从第一阶段开始的路径:
script.m
Mat = zeros(2,2,3);
Mat(:,:,1) = [0 0.3;0.9 0];
Mat(:,:,2) = [0.7 0;0 0.4];
Mat(:,:,3) = [0 0.1;0.5 0];
Z = size(Mat,3);
N = size(Mat,1);
adjacency = zeros( (Z+1) * N );
for z=1:size(Mat,3)
for r=1:size(Mat,1)
for c=1:size(Mat,2)
if Mat(r,c,z) > 0
adjacency( (z-1)*N + r , (z)*N + c) = Mat(r,c,z);
end
end
end
end
for i=1:N
dfs( adjacency, i, [])
end
dfs.m
function dfs(adj, node, path_)
flag = 0;
for i=1:size(adj,2)
if adj(node, i) > 0
flag = 1;
dfs(adj,i,[path_ adj(node,i)])
end
end
if flag==0
path_
end
end
输出
path_ =
0.3000 0.4000 0.5000
path_ =
0.9000 0.7000 0.1000