Matlab 有向有环图 所有回路非回路查询 最大环路查询

来源:互联网 发布:跳跃网络平台 编辑:程序博客网 时间:2024/06/01 07:24

1.查看拓扑结构 mat文件为邻接矩阵

%%% ShuanHolmes@outlook.com% 有向图绘制 拓扑情况%%%close all;clear;clc;% load('wMatTree.mat');% load('woutMat.mat');load('wMatWsparity.mat');W = full(W);W = W';% W = [W Wout'];% Wback = [Wback;0];% W = [W;Wback'];%load('xMat.mat');%netplot(W,1); %IDS={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T'}; %IDS={'A','B','C','D','E','F','G','H','I','J'}; n = size(W,1); % W是一个方阵 IDS = {}; for i=1:n    IDS = [IDS;num2str(i)]; % 节点标号 增加了一个反馈节点 end % A G J H I C % 1 7 10 8 9 3 %W = W - diag(diag(W)-diag(0)); bg=biograph(W,IDS); set(bg.nodes,'shape','circle','color',[1,1,1],'lineColor',[0,0,1]); %set(bg,'layoutType'); set(bg,'layoutType'); bg.showWeights='on'; set(bg.nodes,'textColor',[0,0,0],'lineWidth',2,'fontsize',9); set(bg,'arrowSize',7,'edgeFontSize',9); get(bg.nodes,'position');  dolayout(bg);%  bg.nodes(1).position=[0,0];%  bg.nodes(2).position=[0,40];%  bg.nodes(3).position=[0,80];%  bg.nodes(4).position=[0,120];%  bg.nodes(5).position=[60,0];%  bg.nodes(6).position=[40,40];%  bg.nodes(7).position=[60,80];%  bg.nodes(8).position=[60,120];%  bg.nodes(9).position=[120,0];%  bg.nodes(10).position=[120,80];%  bg.nodes(11).position=[120,80];%  bg.nodes(12).position=[120,120];%  bg.nodes(13).position=[180,0];%  bg.nodes(14).position=[180,40];%  bg.nodes(15).position=[180,80];%  bg.nodes(16).position=[180,120];%  bg.nodes(17).position=[240,0];%  bg.nodes(18).position=[240,40];%  bg.nodes(19).position=[240,80];%  bg.nodes(20).position=[240,120]; dolayout(bg,'pathsonly',true);   view(bg); help biograph; 

2.DFS 环路查找及非环路查找 main

%%% ShuanHolmes@outlook.com% 有向图中所有的环路 %%clc;clear;% diary('log.txt');% diary on;load('wMatWsparity.mat');W = full(W);x = size(W,1);for i = 1:x    RouteWalked = [];    CalcCircleFun(W,i,RouteWalked);end% diary off;

2.2DFS 环路查找及非环路查找 Function

%%% ShuanHolmes@outlook.com% 有向图中所有的环路及非环路打印% 深度优先 DFS%%function [] = CalcCircleFun(Mat, layer, RouteWalked)        if isempty(find(Mat(:,layer) ~= 0))        % disp('无环路情况:');        % 出度为0 终止查询        TmpRoute = RouteWalked;        TmpRoute = [TmpRoute;layer];        CalcCircleSaveDialogData(TmpRoute,'NoCircle.txt');        return;    end        [x,y] = size(Mat); % mat是一个方阵    for i = 1:x        % 遍历所有出度        TmpRoute = RouteWalked;                if Mat(i,layer) ~= 0        % 说明存在出度             index = find(TmpRoute == i);            if isempty(index)                % 存在出度且不存在环路 继续查询                TmpRoute = [TmpRoute;layer];                % 存在出度则可以将当前节点加入队列                CalcCircleFun(Mat, i, TmpRoute)            else                % disp('环路情况:');                % 存在出度但是存在环路 终止查询                TmpRoute = [TmpRoute;layer];                CalcCircleSaveDialogData(TmpRoute,'CircleWithoutLastPoint.txt');                TmpRoute = [TmpRoute;i];                CalcCircleSaveDialogData(TmpRoute,'Circle.txt');             end        end    endend
2.3DFS 环路查找及非环路查找 转移到外存中

%%% ShuanHolmes@outlook.com% 将屏幕显示结果存入日志文件%%function [] = CalcCircleSaveDialogData( Array , filename)    fid=fopen(filename,'a+');    length = size(Array);    length = max(length);        fprintf(fid, '\r\n');    for i=1:length        fprintf(fid, '%d ', Array(i));    end    fclose(fid);end
3.显示最大环路
%%% ShuanHolmes@outlook.com% 查看最长环路%%clc;clear;fid=fopen('Circle.txt','r');CircleResult = {};LenCircleResult = [];i = 1;while ~feof(fid) % 判断是否为文件末尾                   tline=fgetl(fid);    if ~isempty(tline)         nline = str2num(tline);        if nline(1) == nline(end)            CircleResult(i) = cellstr(tline);            LenCircleResult(i) = size(nline,2);            i = i + 1;        end    endendfclose(fid);index = find(LenCircleResult == max(LenCircleResult));MaxCircle = {};j = 1;for i = 1:max(size(index))    CompareResult = strcmp(MaxCircle,CircleResult(index(i)));     if isempty(find(CompareResult == 1))        MaxCircle(j) = CircleResult(index(i));        j = j + 1;    endendMaxCircle%%% 查看所有环路AllCircle = {};j = 1;for i = 1:max(size(CircleResult))    CompareResult = strcmp(AllCircle,CircleResult(i));     if isempty(find(CompareResult == 1))        AllCircle(j) = CircleResult(i);        j = j + 1;    endendAllCircle = cellstr(AllCircle);Statistic = zeros(1,20);for i = 1:max(size(AllCircle))    nline = str2num(cell2mat(AllCircle(i)));    for j = 1:size(nline,2)        Statistic(nline(j)) = Statistic(nline(j)) + 1;    endendStatistic



0 0