%本段程序形成层次结构和节点队列阵用以决定配电网潮流计算的节点顺序
function layer=nodelayer(branch,bus)
%第一列为支路首节点,第二列为支路尾节点
branch=[1 2
2 4
4 10
2 3
3 5
3 6
6 7
6 8
6 9];
%第一列支路号,第二列是否是电源点:是为1.否为0
bus=[1 1
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
10 0];
p=find(bus(:,2)==1); %找到电源点位置
y=bus(p,1);
m=length(branch);
n=length(bus);
mycell=cell(n,4); % 存线路拓扑结构
w=branch(:,2); %取线路末节点阵列
s=branch(:,1); %取线路首节点阵列
c=1; %记录连接点数
t=1; %记录mycell
mycell{n,1}=y; %放电源点
py=find(s==y);
mycell{n,2}=length(py);
for l=1:py
mycell{n,3}(l)=branch(py(l),2);
mycell{n,4}(l)=1;
end
for i=1:n-1
mycell{t,1}(1)=branch(i,2); %取节点号
mycell{t,3}(1)=branch(i,1); %取首连接点
mycell{t,4}(1)=2; %父节点
fp=find(s==branch(i,2)); %fp 末节点作为首节点所在的位置
num=length(fp); %做首节点的个数
c=c+num; % 连接点数
mycell{t,2}=c;
for j=1:num %做首节点时与其连接的节点
branch(fp(j),1);
mycell{t,3}(1+j)=branch(fp(j),2);
mycell{t,4}(1+j)=1;
end
t=t+1;
c=1;
end
%一下程序形成层次关系
%第一层存放末梢节点
temp=[]; %存放该层父节点
t=1;
layer={};
for i=1:n
if ~isempty(find(mycell{i,2}==1&&mycell{i,4}==2)); %找到末梢节点
layer{1,1}(t)=mycell{i,1};
temp(t)=mycell{i,3}; %父节点阵
t=t+1;
end
end
j=2;
while(1)
layer{1,j}=temp;
if temp==1
break
else
temp=[];
for p=1:length(layer{1,j})
q=layer{1,j}(p);
for s=1:n
if q==mycell{s,1}
break
end
end
if mycell{s,4}(1)~=2
temp(p)=1;
else
temp(p)=mycell{s,3}(1);
end
end
end
j=j+1;
end
L=length(layer); %实现各层唯一元素
for u=L:-1:1
layer{1,u}=unique(layer{1,u});
end
for i=L:-1:1
n=length(layer{1,i});
for j=i-1:-1:1
for k=1:n
fx=find(layer{1,i}(k)==layer{1,j});
if ~isempty(fx)
layer{1,j}(fx)=[];
end
end
end
end