Main Content

可视化广度优先和深度优先搜索

此示例显示了如何定义一个可视化的函数BFSearchandDFSearch通过突出显示图的节点和边缘。

创建并绘制有向图。

s = [1 2 3 3 3 3 4 5 6 7 8 9 9 9 10]; t = [7 6 1 5 6 8 2 4 4 3 7 1 6 8 2]; G = digraph(s,t); plot(G)

在图表上执行深度优先搜索。指定``缓解''返回算法中的所有事件。另外,指定重新启动作为true确保搜索访问图中的每个节点。

t= dfsearch(G, 1,``缓解'',,,,'重新开始',,,,true)
T = 38x4 table Event Node Edge EdgeIndex ________________ ____ __________ _________ startnode 1 NaN NaN NaN discovernode 1 NaN NaN NaN edgetonew NaN 1 7 1 discovernode 7 NaN NaN NaN edgetonew NaN 7 3 10 discovernode 3 NaN NaN NaN edgetodiscovered NaN 3 1 3 edgetonew NaN 35 4 discovernode 5 NaN NaN NaN edgetonew NaN 5 4 8 discovernode 4 NaN NaN NaN edgetonew NaN 4 2 7 discovernode 2 NaN NaN NaN edgetonew NaN 2 6 2 discovernode 6 NaN NaN NaN edgetodiscovered NaN 6 4 9 finishnode 6 NaN NaN NaN finishnode 2 NaNNan Nan finishnode 4 Nan Nan Nan finernode 5 Nan Nan Nan Nan Edgetofinofined Nan 3 6 5 EdgetOnew Nan 3 8 6 DiscoverNode 8 Nan Nan Nan Nan EdgetOdododed Nan 8 7 7 11终点NNAN NAN NAN NAN NAN NAN NANDENNODE 3 NAN NAN NAN NAN NAN NAN NAN NAN NAN NAN NAN NAN NAN NAN NAN NAN NAN NAN NAN STARNNODE 1 NAN SNANE 1 NAN 1 NAN 1 NAN 1 NAN 1 NAN 1 NAN 1 NANNaN NaN startnode 9 NaN NaN NaN discovernode 9 NaN NaN NaN edgetofinished NaN 9 1 12 edgetofinished NaN 9 6 13 edgetofinished NaN 9 8 14 finishnode 9 NaN NaN NaN startnode 10 NaN NaN NaN discovernode 10 NaN NaN NaN edgetofinished NaN 102 15终点节点10 nan nan nan

the values in the table,t,,,,are useful for visualizing the search. The functionVisualize_search.mshows one way to use the results of searches performed withBFSearchandDFSearch要根据事件表突出显示图中的节点和边缘,t。函数在算法中的每个步骤之前停止,因此您可以通过按任何键来慢慢逐步浏览搜索。

SaveVisualize_search.m在当前文件夹中。

functionvisualize_search(G,t)%g是图形或图形对象,t是由调用到%BFSEARCH or DFSEARCH on that graph.%示例输入:g = digraph([1 2 3 3 3 3 4 5 6 7 8 9 9 9 10],...%[7 6 1 5 6 8 2 4 4 3 7 1 6 8 2]);%t = dfsearch(G, 1, 'allevents', 'Restart', true);%Copyright 1984-2019 The MathWorks, Inc.脱节= isa(G,'图形');如果脱节%Replace graph with corresponding digraph, because we need separate两个方向的%边缘[src,tgt] = findedge(g);g = digraph([[src; tgt],[tgt; src],[1:numedges(g),1:numedges(g)]);结尾h =图(g,'nodeColor',[0.5 0.5 0.5],,'edgeColor',[0.5 0.5 0.5],,...'EdgeLabelMode',,,,'汽车');为了ii=1:size(t,1)switcht.event(ii)案子“startnode”highlight(h,t.Node(ii),'MarkerSize',最小(H.Markersize)*2);案子'discovernode'highlight(h,t.Node(ii),'nodeColor',,,,'r');案子'finishnode'highlight(h,t.Node(ii),'nodeColor',,,,'k');otherwise如果iSundrected a = g.edges.peage;b = t.EdgeIndex(ii);edgeInd = Intersect(find(a == b),,...findedge(G,t.Edge(ii,1),t.Edge(ii,2)));别的edgeind = t.EdgeIndex(ii);结尾switcht.event(ii)案子'edgetonew'highlight(h,“边缘”,edgeind,'edgeColor',,,,'b');案子“ edgetodsiscoved”highlight(h,“边缘”,edgeind,'edgeColor',,,,[0.8 0 0.8]);案子'edgetofined'highlight(h,“边缘”,edgeind,'edgeColor',[0 0.8 0]);结尾结尾Nodestr = T.Node;如果isnumeric(nodeStr) nodeStr = num2cell(nodeStr); nodeStr = cellfun(@num2str, nodeStr,“统一输出”, 错误的);结尾edgestr = t.edge;如果isnumeric(edgestr)edgestr = num2cell(edgestr);edgestr = cellfun(@num2str,edgestr,“统一输出”, 错误的);结尾如果~isnan(t.Node(ii)) title([char(t{ii, 1})“在节点上”Nodestr {II}]);别的标题([char(t {ii,1}))' 边缘 ('edgeStr{ii, 1}', '...edgeStr{ii, 2},')带有边缘索引'sprintf('%d ',t {ii,4})]);结尾disp(“敲击任何继续的钥匙……”) 暂停结尾disp('完毕。') 关闭all

Use this command to runVisualize_search.mon graphGand search resultt

visualize_search(G,T)

该图以所有灰色开始,然后每次按键时都会出现一个新的搜索结果。搜索结果根据以下方式突出显示

  • “startnode”- Starting nodesincrease在尺寸方面。

  • 'discovernode'- Nodes turn红色的正如他们发现的那样。

  • 'finishnode'- Nodes turn黑色的after they are finished.

  • 'edgetonew'- 导致未被发现的节点转弯的边缘蓝色的

  • “ edgetodsiscoved”l -边ead to discovered nodes turnmagenta

  • 'edgetofined'- 导致节点转弯的边缘绿色

.gif动画显示了您介入结果时所看到的Visualize_search.m

也可以看看

|||

Related Topics