📄 ccpoints.m
字号:
function cpp=ccpoints(be,en,sd,gd,s)
%余枝搜索法搜索闭合环
%be 起点 en 终点 sd 总点数 gd 观测值 s 距离
cpp=[]; %存放闭合环点号信息
bee=be;
enn=en;
temp=[];
course=zeros(1,gd); %标记观测边号
%建立生成树==========================================================
% while 2
g=size(bee,1);
num=zeros(1,sd);
%计算结点度
for i=1:g
num(bee(i))=num(bee(i))+1;
num(enn(i))=num(enn(i))+1;
end
%取出最大度结点,以最大度结点为起始点建立生成树
[degreenum,pointnum]=max(num);
been=[bee enn];
temp1=[];
i1=0;
i2=0;
[i,j]=find(been==pointnum);
tem=been(i,:);
tem=reshape(tem,1,prod(size(tem)));
tem((tem==pointnum))=[];%2级点树枝的点号
temp=[temp pointnum tem];%已记录的点
course(i)=1; %标记树枝
while 1%树是否已包含所有的点
if size(temp,2)==sd;%首先判断是否所有的点都已记录
break;
end
for i=tem
[i1,j1]=find(i==been);
beentem=been(i1,:);
for j=1:size(beentem,1);
xxx=beentem(j,:);
newpoint=xxx(xxx~=i);
if any(temp==newpoint)==0; %若不是已记录的点
temp=[temp newpoint];
temp1=[temp1 newpoint];%3级点
course(i1(j))=1;%也标记为树枝
end
end
end
tem=temp1;
temp1=[];
if size(temp,2)==sd;%所有点已记录
break;
end
if isempty(tem)==1;%无新点产生
break;
end
end
%course=1标记树枝;course=0标记余枝
[i j]=find(course==0);
ns=length(i);%余枝数,也即闭合环数
%--------------------------------------------------------------------
if ns>0
A=[];
B=[];
for i=1:gd
if course(i)==0
B=[B;be(i) en(i) s(i)];%余枝边长记录
else
A=[A;be(i) en(i) s(i)];%树枝边长记录
end
end
r=ns;
rr=r;
site=[];
m=[];
for xyt=1:rr%闭合环数
number=zeros(1,r);
site1=[];
dist1=[];
for ii=1:r
n=1;%支路数
course=[];
been=[];
i=[];
j=[];
st=[];
dt=[];
course=zeros(1,gd);%以新点点号标记该观测值
been=A(:,1:2);
temp1=[];
i1=0;
i2=0;
[i,j]=find(been==B(ii,2));%从第ii余枝的终点开始找与之相连的树枝点
tem=been(i,:);
tem=reshape(tem,1,prod(size(tem)));
tem((tem==B(ii,2)))=[];%新点点号
temp=[B(ii,2) tem];%已搜索到的点号
course(i)=B(ii,2);%标记与该余枝点相连的树枝
%正向寻找
while 1
n=n+1; %支路个数
for i=tem
[i1,j1]=find(i==been);
beentem=been(i1,:);
for j=1:size(beentem,1);
xxx=beentem(j,:);
newpoint=xxx(xxx~=i);
if any(temp==newpoint)==0;%新点是否已记录
temp=[temp newpoint];
temp1=[temp1 newpoint];; %存放下一个层次出现的所有新点
course(i1(j))=i; %若为新点,其支路定义为起点的点号,便于后面反向寻找闭合环,在某点上,其支路编号与该点不同的是环上的支路。
end
if newpoint==B(ii,1) %若新点为余支的另一端点
m=i; %存放与余支的另一端点相连的点号
t=i1(j); %该支路在观测值数组中的序号
break;
end
end
if newpoint==B(ii,1)
break;
end
end
tem=temp1;
temp1=[];
if newpoint==B(ii,1)
break;
end
end
%反向提取闭合环
st=[ m];
di=A(t,3);
while 3
if length(st)==n;
break;
end
[i1,j1]=find(been==m);
tem=i1';
fl=0;
for i=tem
fl=fl+1;
if course(i)~=0 & course(i)~=m
m=course(i);
st=[st m];%闭合环点号
di=di+A(i,3);%闭合路线长
break;
end
end
end
st=[st B(ii,1)];
di=di+B(ii,3);
st=[st st(1)];
site1{ii}=st; %闭合环点号数组,若干闭合环
number(ii)=n+1; %闭合环边数
dis(ii)=di; %闭合环长度
end
tem=find(number==min(number));%最终的闭合环要符合边数最少
[i,j]=min(dis(tem));%边长最短
site{xyt}=site1{tem(j)};
distt(xyt)=dis(tem(j));
r=r-1;
A=[A;B(tem(j),:)];%余枝化为树枝
B(tem(j),:)=[];%余枝减少
end
cpp=site;
end
return
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -