%本程序返回并且要求不重复选定的支路矩阵
function Y=fusion(Bus,Branch)
%采用根节点融合法产生初始辐射状网络
% Bus 待选节点
% Branch 待选支路
% Y 选定支路集
% yi 为1建设该线路;为0则不建
Bus=[0 0 1
1 1.2+i*0.9 0
2 1.5+i*1.13 0
3 0.6+i*0.45 0
4 0.4+i*0.3 0
5 1.2+i*0.9 0
6 0.75+i*0.55 0
7 0.8+i*0.6 0
8 0.5+i*0.38 0
9 0.55+i*0.41 0];
%支路节点,负荷,电源点
Branch=[0 1 0.246+i*0.463 0 0.0 400
1 3 0.898+i*0.931 0 0.0 300
0 2 0.084+i*0.139 0 30.5 400
2 4 0.726+i*0.613 0 8.7 300
3 5 0.633+i*0.515 0 10.3 300
8 3 0.422+i*0.333 0 12.2 300
8 7 0.345+i*0.234 0 15.9 300
6 7 0.754+i*0.556 0 9.0 300
9 4 0.112+i*0.150 0 21.0 300
5 7 0.675+i*0.433 0 14.3 300
4 5 0.231+i*0.123 0 23.0 350
9 6 0.234+i*0.155 0 17.8 300
5 6 0.456+i*0.354 0 12.0 300
4 8 0.854+i*0.724 0 9.1 300
4 3 0.868+i*0.760 0 19.2 300
6 0 0.135+i*0.240 0 23.4 400];
%第1列首节点,2列尾节点,3列支路阻抗,4列特征支路,5列该支路投资,6列电流限制
m=length(Branch); %取支路数
Y=zeros(m,1); %待选线路初始化为0矩阵
n=length(Bus); %取节点数
N=[]; % 存根节点
Q=[]; % 存与电源点相连的支路号
%S=[]; %存未标记矩阵
%本段程序取根节点群 默认是0
%这段程序没有用吧。
l=1;
N(l)=0; %将0加入根节点群。
l=l+1;
%本段程序取与电源点相连的支路
t=1;
for p=1:m
bi=Branch(p,:);
j=find(bi(1,1)==N); %判断支路端点是否是电源点
q=find(bi(1,2)==N);
if (isempty(j)&isempty(q))
continue;
else Q(t)=p;
t=t+1;
end
end
s=unidrnd(length(Q));
b=Q(s); %取与电源点相连的任意支路号
Y(b)=1;
Branch(b,4)=1; %标记该条支路
if Branch(b,1)==0
Bus(Branch(b,2)+1,3)=1;
elseif Branch(b,1)~=0
Bus(Branch(b,1)+1,3)=1;
end
while(1)
while(1)
u=unidrnd(m);
pi=Branch(u,:);
if pi(:,4)~=1 %随机取未标记支路
break
end
end
%以上小段程序取任意未标记支路
if pi(1,1)==0 %为了不使节点号为0
Bus(pi(1,2)+1,3)=1;
Y(u)=1;
Branch(u,4)=1;
elseif pi(1,2)==0
Bus(pi(1,1)+1,3)=1;
Y(u)=1;
Branch(u,4)=1;
elseif Bus(pi(1,1)+1,3)==0&Bus(pi(1,2)+1,3)==0
continue
elseif Bus(pi(1,1)+1,3)==1&Bus(pi(1,2)+1,3)==1
Y(u)=0;
else
Y(u)=1;
Branch(u,4)=1;
Bus(pi(1,1)+1,3)=1;
Bus(pi(1,2)+1,3)=1;
end
for ni=1:n
if Bus(ni,3)==0
break
end
end
end
我单步试过了。可以。但是好像跳不出while外循环