主要内容

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

这个例子展示了如何定义一个函数来可视化搜索dfsearch通过高亮显示图形的节点和边。

创建并绘制有向图。

S = [1 2 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 =有向图(s, t);情节(G)

在图形上执行深度优先搜索。指定“allevents”返回算法中的所有事件。另外,指定重新启动真正的以确保搜索访问图中的每个节点。

T = dfsearch(G, 1,)“allevents”,“重新启动”,真正的)
T=38x4表格事件节点边缘索引uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuN边新南威尔士427迪斯科舞厅2南南威尔士新南威尔士262迪斯科舞厅6南南威尔士发现的南南南威尔士发现的南南南威尔士发现的南南南威尔士完成的南南南威尔士完成的南南南威尔士完成的南南南威尔士完成的南南南威尔士完成的南南南威尔士完成的南南南南南威尔士完成的南南南南南南威尔士完成节点3南南完成节点7南南完成节点1南南开始节点9南南边缘完成南9 1 12边完成南9 6 13边完成南9 8 14完成节点9南南开始节点10南南南边缘完成南10 2 15完成节点10南南南

表中的值,T,对可视化搜索很有用。这个函数可视化搜索显示了使用的搜索结果的一种方法搜索dfsearch要根据事件表高亮显示图形中的节点和边,T. 该函数在算法中的每一步之前都会暂停,因此您可以通过按任意键慢慢完成搜索。

保存可视化搜索在当前文件夹中。

函数visualize_search (G, t)%G是一个图或有向图对象,t是调用% BFSEARCH或DFSEARCH。%%输入示例:G=有向图([1 2 3 3 3 4 5 6 7 8 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);版权所有1984-2019 The MathWorks, Inc.isundirected = isa (G,“图形”);如果是无向的%用相应的有向图替换图,因为我们需要分离%两个方向的边[src,tgt]=findedge(G);G=有向图([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”,“自动”);对于2 = 1:尺寸(t) 1)开关t、 活动(二)案例“startnode”突出(h, t.Node (ii),“MarkerSize”,min(h.MarkerSize)*2);案例“discornode”突出(h, t.Node (ii),“NodeColor”,“r”);案例“finishnode”突出(h, t.Node (ii),“NodeColor”,“k”);否则如果Is无向a=G.边.重量;b=t.EdgeIndex(ii);edgeind=相交(查找(a==b),...findedge(G,t.Edge(ii,1),t.Edge(ii,2));其他的edgeind = t.EdgeIndex (ii);终止开关t、 活动(二)案例“edgetonew”突出(h,“边缘”,edgeind,“EdgeColor”,“b”);案例“边缘发现”突出(h,“边缘”,edgeind,“EdgeColor”(0.8 0 0.8));案例“边缘完成”突出(h,“边缘”,edgeind,“EdgeColor”,[0 0.8 0]);终止终止nodeStr=t.节点;如果isnumeric(nodeStr) nodeStr = num2cell(nodeStr);nodeStr = cellfun(@num2str,“UniformOutput”,假);终止边缘=t.边缘;如果isnumeric(edgeStr)edgeStr=num2单元(edgeStr);edgeStr=cellfun(@num2str,edgeStr,“UniformOutput”,假);终止如果~ isnan (t.Node (ii)标题([char (t {ii, 1})“在节点上”nodeStr{ii}]);其他的标题([char(t{ii,1})"在边缘",edgeStr {ii, 1}”、“...edgeStr {ii, 2},“)带边索引”sprintf (' % d ',t{ii,4})];终止disp ('按任意键继续…')停顿终止disp (“好了。”)接近所有

使用此命令运行可视化搜索在图G和搜索结果T:

visualize_search (G, T)

图形以全灰色开始,然后每次按键时都会出现一个新的搜索结果。搜索结果将根据以下内容突出显示:

  • “startnode”——开始节点增加在尺寸上。

  • “discornode”——节点将红色当他们被发现时。

  • “finishnode”——节点将黑色在他们完成之后。

  • “edgetonew”-导致未发现节点的边将旋转蓝色.

  • “边缘发现”-导致发现的节点的边会旋转品红色的.

  • “边缘完成”-导致完成节点的边将旋转绿色.

.gif动画显示您在单步浏览结果时看到的内容可视化搜索.

另见

|||

相关的话题