学校の日の最小スパニングツリー、少額アップは、これが最初であります
クラスカルのアルゴリズム
クラスカルのアルゴリズムに関する多くの情報を持って、次のように、アルゴリズムのプロセスを、それらを繰り返しません。
- 隣接行列と重量を得ました。
- 最小距離は2点を結ぶ、初期化。
- 接続がループを形成するためにキャンセルされた場合、最小距離次の二点を結ぶ、すべてのn個のノードがツリーのN-1側に接続されるまで、ステップとを接続する前記繰り返します。
互いに素セット
:約互いに素-セットはこれを見てすることができ、「詳細A非常に興味深い互いに素セット」。
ここでは、合成(MergeNode)は、ルートノード(ルートノード)を見つけるために使用される2つのサブ関数です。第二の機能は、計算量が少ない、デフォルトが圧縮される圧縮オプション、圧縮を加えました。
互いに素セット、アプリケーション、氷山のクラスカル先端をたくさん持っていることに留意すべきです。
%% 并查集
% 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) % MST:MinimumSpanningTree
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
この関数は、2次元プロットのために使用することができ、それはまた、3次元のために使用することができます。
入力パラメータ:
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
スクリーンショット:
(永続的な努力をし、いくつかのプログラム上で、いくつかの長ったらしい〜)総理の別の記事を参照してください。
免責事項:この記事はブロガーオリジナル記事です、許さブロガーなく再生してはなりません。