기반 해체 설정된 프로그램 + MATLAB 크루스 칼 알고리즘과 최소한의 나무 그리기에 걸쳐

학교 일 최소 스패닝 트리, 약간의 합계까지,이 처음이다

  1. 크루스 칼 알고리즘

    크루스 칼 알고리즘은 많은 정보를 소개 다음과 같이 알고리즘 과정을 반복하지 :

    • 인접 행렬 중량 획득;
    • 최소 거리가 두 지점을 연결 초기화;
    • 두 배의 거리를 연결 루프를 형성 취소되면 작은 접속, 모든 N 개의 노드가 트리의 N-1 측면에 접속 될 때까지 공정을 반복하는 상기 연결.
  2. 연결되지 않은 세트

    소개 분리 된 집합이 볼 수 있습니다 : "상세 매우 흥미 분리 된 세트"를 .
    여기에는 결합 (MergeNode)에 대해, 루트 노드 (rootNode를)를 검색하는 데 사용되는, 두 개의 서브 - 기능이다. 압축 옵션을 추가 압축 번째 함수 계산 한 다음 소량는 기본 압축된다.
    분리 된 세트 응용 프로그램, 빙산의 크루스 칼 팁을 많이 가지고 있음을 주목해야한다.

%% 并查集
% Node = RootNode(Node,Father)
% 输入:Node:需要查询的节点
%       Father:记录父节点的向量
% 输出:父节点
function Node = RootNode(Node,Father)  % 找到根结点
    for i=1:length(Node)
        while(Node(i)~=Father(Node(i)))
            Node(i) = Father(Node(i));
        end
    end
end
%% 并查集
% Father = MergeNode(Node1,Node2,Father)
% 输入:Node1:节点1
%       Node2:节点2
%       Father:父节点向量
%       CompressOption:压缩选项,默认为压缩
% 输出:Father:新的父节点
function Father = MergeNode(Node1,Node2,Father,CompressOption)
if nargin == 3
    CompressOption = 1;
end
RootNode1 = RootNode(Node1,Father);
if CompressOption  % 采取压缩操作
    while(Node1~=RootNode1)  % 压缩Node1所在的集合
        t = Father(Node1);
        Father(Node1) = RootNode1;
        Node1 = t;
    end
    while(Node2~=Father(Node2))    % 压缩Node2所在的集合
        t = Father(Node2);
        Father(Node2) = RootNode1; % 全部改变为Node1的根结点
        Node2 = t;
    end
    Father(Node2) = RootNode1; % 改变根结点
else
    Father(RootNode(Node2,Father)) = RootNode1; % 改变根结点
end

end

주요 기능 :

%% 用Kruskal算法求解最小生成树
function MST = Kruskal(Distance)
%% 开始计算
[Weight,Pos] = sort(Distance(find(triu(Distance)~=0)));
Num = max(find(~isinf(Weight)));
NumP = size(Distance);
Father = 1:NumP;
MST = [];
for i=1:Num
    [Node1,Node2] = GetSquarePos(Pos(i),NumP);
    if RootNode(Node1,Father) ~= RootNode(Node2,Father)
        Father = MergeNode(Node1,Node2,Father,0);
        MST = [MST;[Node1 Node2]];
        if size(MST,1) == NumP-1  % 如果树已满,就没有必要继续计算了
            break
        end
    end
end

%% 绘图
DrawMST(P,MST,0.08);
end

여기서 우리는 서브 루틴 GetSquarePos을 사용 :

function [Node1,Node2] = GetSquarePos(pos,Dim)  % 输入向量中的位置,输出矩阵中的位置
    S = cumsum([0:Dim-1])-pos;
    Node1 = min(find(S>=0));         % 列数
    Node2 = pos-sum(0:Node1-2);      % 行数
end

이 기능은 각 가장자리에 해당하는 두 개의 노드를 찾는 데 사용됩니다.

매핑 기능 DrawMST도 있습니다 :

%% 绘制最小生成树
function h = DrawMST(points,MST,deviation)  % MSTMinimumSpanningTree
if nargin == 2
    deviation = 0.01;
end
if size(points,2) >3
    error('本程序只能绘制二维或者三维图~~')
end
%% 开始作图
if size(points,2) == 2  % 二维数据
    for i=1:size(MST,1) % 树
        plot(points(MST(i,:),1),points(MST(i,:),2),'r-o','LineWidth',1.5,...
            'MarkerSize',5,'MarkerFaceColor','b'); hold on;
    end
    for i=1:size(points,1) 
        text(points(i,1)+deviation,points(i,1),num2str(i));
    end 
    title('最小生成树示意图')
    xlabel('x'), ylabel('y')
    h = gca;
else  % 三维数据
    for i=1:size(MST,1) % 树
        plot3(points(MST(i,:),1),points(MST(i,:),2),points(MST(i,:),3),'r-o','LineWidth',1.5,...
            'MarkerSize',5,'MarkerFaceColor','b'); hold on;
    end
    for i=1:size(points,1) 
        text(points(i,1),points(i,2),points(i,3)+deviation,num2str(i),'color','g');
    end 
    grid on;
    set(gca,'color','k')
    title('最小生成树示意图')
    xlabel('x'), ylabel('y'), zlabel('z')
    h = gca;
end
axis equal
end

이 함수는 이차원 플롯 사용될 수 있고, 또한 입체 위해 사용될 수있다.

입력 매개 변수 :

P = [6.4889    5.5314    4.4938
    7.0347    5.7275    5.5554
    6.7269    7.0984    5.8441
    5.6966    5.7221    6.2761
    6.2939    6.7015    5.7388
    5.2127    3.9482    6.4434
    6.8884    5.6462    6.3919
    4.8529    5.1764    4.7493
    4.9311    4.4229    5.0520
    5.1905    6.5080    5.2589];
Distance = squareform(pdist(P));  % 不解释

결과 :

ans =

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

스크린 샷 :

MST

(지속적인 노력을, 일부 프로그램 위의 일부 장황한 ~) 총리의 다른 기사보기

면책 조항 :이 문서는 블로거 원본입니다, 허용 된 블로거없이 복제 할 수 없다.

게시 14 개 원래 기사 · 원 찬양 19 ·은 30000 +를 볼

추천

출처blog.csdn.net/qq_24694761/article/details/78587452