Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 在加权图中显示路径_Matlab - Fatal编程技术网

Matlab 在加权图中显示路径

Matlab 在加权图中显示路径,matlab,Matlab,我有一个加权图。我为图中的每个节点分配了三个键。我想要一个代码,如果图中有两个唯一的节点,它将显示连接两个节点的所有路径(如果存在公共键)。节点也可以以多跳方式连接 keypool = randint(n,n,[1,10]) %key pool generation for l = 1:n for k = 1:3 nodekey(l,k) = keypool(l,k);%Selects key from key pool end; end; for i=1:n fprintf('%s %

我有一个加权图。我为图中的每个节点分配了三个键。我想要一个代码,如果图中有两个唯一的节点,它将显示连接两个节点的所有路径(如果存在公共键)。节点也可以以多跳方式连接

keypool = randint(n,n,[1,10]) %key pool generation
for l = 1:n
for k = 1:3
    nodekey(l,k) = keypool(l,k);%Selects key from key pool
end;
end;
for i=1:n
fprintf('%s %d \t =  %d  %d  %d \n','key_node',i,nodekey(i,:));
end
这是我为生成所有节点的随机密钥而编写的代码。我不知道只有当有一个公共密钥时,如何找到两个节点之间的路径。输入节点数:5

keypool =

 5     3     1     7     7
 3     7     8     4     3
 9     3    10     7    10
 2     5     2     7     8
 7    10     7     3     5

key_node 1   =  5  3  1 
key_node 2   =  3  7  8 
key_node 3   =  9  3  10 
key_node 4   =  2  5  2 
key_node 5   =  7  10  7 
n的值是用户输入的节点数。上面的代码将为五个节点生成这样的随机键。如果我想找到节点1和节点5之间的路径,假设可能的路径是:1->2->3->5,1->5,1->2->5。应打印仅具有公共密钥的路径。即1->2->3->5,1->2->5

wt=zeros(n,n);
while(1)
    i=input('enter the starting node:(0 to quit):');
    if (i==0)    
        break;
    end
    j=input('enter the destination node:');
    wt(i,j)=input('Enter the cost: '); 
end
disp('Adjacency Matrix');
for i=1:n
fprintf('           %d',i);
end
for i=1:n
fprintf('\n%d          ',i);
for j=1:n
    fprintf('%d          ',wt(i,j));
end
end
Adjacency Matrix
       1           2           3           4           5
1          0          1          1          0          0          
2          0          0          0          0          0          
3          1          0          0          1          0          
4          0          0          1          0          0          
5          0          0          0          0          0     
这意味着节点(1,2)(1,3)(3,4)(4,3)已连接


用户在图中输入连通性。密钥池中的数字是随机生成的。分配给节点1的密钥为5,3,1,分配给节点5的密钥为7,10,7。这两个节点没有公共密钥。因此不应打印此路径。如果源(节点1)存在公共密钥,则应将路由遍历到目标(节点5)

您可以将问题分解为两个步骤:

  • 确定哪些节点已连接并共享同一密钥。 这些信息将存储在一个矩阵中(让我们用
    M
    表示),我将其称为修改的邻接矩阵

  • 根据修改后的邻接矩阵查找从一个节点到另一个节点的所有可能路径

  • 第一部分可以这样解决:

    %// Obtain matrix 'sh' where each element at position (i, j) indicates if
    %// node i and node j share a key
    pairs = nchoosek(1:n, 2);                %// All possible pairs of nodes
    sh = zeros(n);
    for k = 1:size(pairs, 1)
        node1 = pairs(k, 1);
        node2 = pairs(k, 2);
        sh(node1, node2) = any(ismember(nodekey(node1, :), nodekey(node2, :)));
        sh(node2, node1) = sh(node1, node2); %// Matrix must be symmetrical
    end
    
    %// Obtain the modified adjacency matrix
    M = sh & (wt > 0);
    
    我把第二部分留给你。使用给定的(修改的)邻接矩阵
    M
    查找从节点A到节点B的所有可能路径是一个众所周知的问题。下面是它的一个可能实现

    希望这有帮助

    p.S:
    您可以通过编写以下内容简化
    nodekey
    的生成:

    nodekey = keypool(:, 1:3);
    

    MATLAB的矢量化操作确实有助于使代码更加高效和优雅

    如果你想要代码,你应该写一些。如果你有一个更具体的问题,或者如果你被困在某个地方,请展示你到目前为止所做的。到目前为止,我使用权重形成了一个矩阵。从这个矩阵中,我找到了图中两个节点之间的路径。我不知道只有当两个节点之间有一个公共密钥时如何找到路径。这是一个好的开始,你应该发布它(在问题内部),这样那些试图回答你问题的人就可以使用它了。此外,一个全面的示例将非常有助于理解您的目标。考虑4个节点。假设拓扑看起来像一个正方形。节点1和节点2已连接。节点2和节点3已连接。节点4和节点3已连接。节点1和节点4已连接。从节点1到3的可能路径为:1->2->3和1->4->3。分配密钥后,如果节点之间存在公共密钥,则只应打印路径。再次,请将其编辑到问题中。另外,我正在考虑一个更具体的例子,带有实际的键,以及一个逐步解释您希望程序做什么的例子。