2018SZB-B 暴力搜索拓扑结构
生活随笔
收集整理的這篇文章主要介紹了
2018SZB-B 暴力搜索拓扑结构
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
clc;clear all;close all;%初始化
dataSize=13;
rand('state',1);
K=1;
dataFrame=rand(dataSize,2).*0.2;
% plot(dataFrame(:,1)',dataFrame(:,2),'x');
CATEGORY = zeros(dataSize,5);%單個站點狀態描述矩陣(4個特征)
categoryId = [1:dataSize]';%有dataSize行
categorySiteMode = rand(dataSize,1)>0.5;%蝴蝶是1,star是0,比例是0.5
categorySiteStatus = zeros(dataSize,1);%是主站還是子站 全零空陣
categoryIfConnect = zeros(dataSize,1);%主站(1)還是子站(0)。。。4
categoryCLASS=zeros(dataSize,1);%所屬類別 初始化全零
categoryHS = -1*ones(dataSize,1);
[Id,SiteMode,Class,HorS,Layer...%] = deal(1,2,3,4,5);
CATEGORY(:,Id) = categoryId;%序列號。。。。。。。。。。。。。。。1
CATEGORY(:,SiteMode) = categorySiteMode;%蝴蝶(1) star(0)。。。。2
CATEGORY(:,Class) = categoryCLASS;%分類后所屬編號。。。。。。。。。3
CATEGORY(:,HorS) = categoryIfConnect;%主站(1)還是子站(0)。。。4
CATEGORY(:,Layer) = categoryHS;%主站(1)還是子站(0)。。。4
%[序列 蝴蝶 類別 主站]Output = zeros(dataSize,dataSize);%連接關系網絡 1000*1000 %%
tic
[idx ,C] = kmeans(dataFrame,K);%使用聚類
countClass=zeros(K,1);
CATEGORY(:,Class)=idx';%更新類別屬性的列CATEGORY(:,Class)
%%計算每一類的個數填充矩陣countClass
for iii=1:K%數出每一類有幾個基站
countClass(iii)=sum(idx==iii);
end
%%
% for kk=1:K
% plot(dataFrame(idx==kk,1),dataFrame(idx==kk,2),'.','MarkerSize',12);
% hold on;
% end
% plot(C(:,1),C(:,2),'kx',...
% 'MarkerSize',12,'LineWidth',3);
% grid on;title '聚類分布圖';xlabel('經度/°');ylabel('緯度/°');
%%DISCentroidBetweenEach = zeros(length(C),length(dataFrame));%每一個
for i = 1:length(C)for j=1:length(dataFrame)if CATEGORY(j,Class)==i;DISCentroidBetweenEach(i,j)=distance(C(i,1),C(i,2),dataFrame(j,1),dataFrame(j,2));%注意這里用的是聚類中心之間的距離不是主站elseDISCentroidBetweenEach (i,j)=NaN;endend
end
%%
CentroiIndex=zeros(K,1);
for i=1:K
% 提取每一類中儲存著聚類中心坐標 與 其余各個點坐標(包括自己。。自己跟自己肯定最近啊哈哈哈哈)距離的 行矩陣a=DISCentroidBetweenEach(i,:);
% 找出其中最小的一個 提取下標,這個就是要的主站身份ID[bB iI]=sort(a);
% 把身份ID儲存到 CentroiIndex中 CentroiIndex(i)=iI(1);
end
%%
% 設定距離閾值
HH=999;% 主站到主站50
HS=999;% 主站到基站20
SS=999;% 基站到基站10%%
k=1;
Kslice=CATEGORY(find(CATEGORY(:,Class)==k),:);% Kslice有用的是第一列的ID切片fromH=CentroiIndex(k);toS= Kslice(:,1);disFromHtoS=zeros(1,length(toS));for F=1:length(toS)disFromHtoS(F) = disFromTo(toS(F),CentroiIndex(k),dataFrame );end[HSdis HsID_temp]=sort(disFromHtoS,'descend');temp_slice=Kslice(:,1);HsID = temp_slice(HsID_temp);%這個是直接能夠灌入距離計算的排序后原始ID 注意,最后一個就是主站自己 驗證完畢
for cn=1:8
F= HsID(cn);
[CATEGORY,Output] = connectSite(F, CentroiIndex(k),Output,CATEGORY,1,1);
end% 企圖連接剩下的四個點
box=HsID(9:12);%連接第二層
initSumDIs=0;
Final=zeros(1,4)+1;
for i=1:4
initSumDIs=initSumDIs+(disFromTo(box(1),HsID(4+i),dataFrame ));
end
Rt=[];Ri=[];
%%
SearchCount=0;
[O1 O2 O3 O4]=deal(0);
initO=[O1 O2 O3 O4]
sr=[];
for O1=1:8for O2=1:8for O3=1:8 for O4=1:8%%if O4~=O3&O4~=O2&O4~=O1&O3~=O2&O3~=O1&O2~=O1currentO=[O1 O2 O3 O4];
for S1=1:4for S2=1:4for S3=1:4for S4=1:4if S4~=S3&S4~=S2&S4~=S1&S3~=S2&S3~=S1&S2~=S1tempSum=(disFromTo(box(S1),HsID(O1),dataFrame) +disFromTo(box(S2),HsID(O2),dataFrame)+...disFromTo(box(S3),HsID(O3),dataFrame)+disFromTo(box(S4),HsID(O4),dataFrame));Rt=[Rt tempSum ];Ri=[Ri initSumDIs];SNow=[S1 S2 S3 S4];SearchCount=SearchCount+1;sr=[sr SearchCount];if SearchCount>10000break;endif (tempSum<initSumDIs)Final=[S1 S2 S3 S4];initSumDIs=tempSum;initO=currentO;SearchCount=0;elsecontinue;endendendendend end
end
%%
endendend end%%
for ii=1:4[CATEGORY,Output] = connectSite(box(Final(ii)) ,HsID(initO(ii)),Output,CATEGORY,1,1);
end
%%
toc
% G=graph(Output);
% subplot(1,2,1)
% plot(G)
% subplot(1,2,2)plot(Rt,'LineWidth',0.05);hold on ;plot(Ri,'LineWidth',2);
legend('嘗試','最優');
xlabel('嘗試次數');
ylabel('距離代價');
%%
%REF
% hold on
% scatter(dataFrame(4,1),dataFrame(4,2),'*')
function [CATEGORY,Output] = connectSite(from , to,Output,CATEGORY,Contyp,LayerN) %輸入連接矩陣關系矩陣CONNInput,觸發站點編號from,目的站點編號to ,大目錄CATEGORY,連接類型HH(2)還是Hs(1)、SS(1) % 層屬性更新變量LayerN % Detailed explanation goes here Output(from,to)=Contyp; Output(to,from)=Contyp; CATEGORY(from,5)=LayerN; CATEGORY(to,5)=LayerN;end
function [ DIS ] = computeMutualDis(dataFrame,La,Lo) %要求輸入數據框架本體dataFrame,與La,Lo % dataFrame用來計算尺寸 La,Lo用來計算距離的實際經緯度 DIS = zeros(length(dataFrame),length(dataFrame));%s Radius = 6378; az=0; [h l] = size(dataFrame);%分別獲取數據框架的行(h)列(l)值 for i=1:hfor j=1:h%距離計算arclen是曲線距離,az是直線距離[arclen,az] = distance(La(i),Lo(i),La(j),Lo(j),Radius);DIS(i,j) = arclen;%更改這個可以實現距離替換end endend
function [ DIS ] = computeMutualDis(dataFrame,La,Lo) %要求輸入數據框架本體dataFrame,與La,Lo % dataFrame用來計算尺寸 La,Lo用來計算距離的實際經緯度 DIS = zeros(length(dataFrame),length(dataFrame));%s Radius = 6378; az=0; [h l] = size(dataFrame);%分別獲取數據框架的行(h)列(l)值 for i=1:hfor j=1:h%距離計算arclen是曲線距離,az是直線距離[arclen,az] = distance(La(i),Lo(i),La(j),Lo(j),Radius);DIS(i,j) = arclen;%更改這個可以實現距離替換end endend
function [CATEGORY,Output] = connectSite(from , to,Output,CATEGORY,Contyp,LayerN) %輸入連接矩陣關系矩陣CONNInput,觸發站點編號from,目的站點編號to ,大目錄CATEGORY,連接類型HH(2)還是Hs(1)、SS(1) % 層屬性更新變量LayerN % Detailed explanation goes here Output(from,to)=Contyp; Output(to,from)=Contyp; CATEGORY(from,5)=LayerN; CATEGORY(to,5)=LayerN;end
function [ DIS ] = computeMutualDis(dataFrame,La,Lo) %要求輸入數據框架本體dataFrame,與La,Lo % dataFrame用來計算尺寸 La,Lo用來計算距離的實際經緯度 DIS = zeros(length(dataFrame),length(dataFrame));%s Radius = 6378; az=0; [h l] = size(dataFrame);%分別獲取數據框架的行(h)列(l)值 for i=1:hfor j=1:h%距離計算arclen是曲線距離,az是直線距離[arclen,az] = distance(La(i),Lo(i),La(j),Lo(j),Radius);DIS(i,j) = arclen;%更改這個可以實現距離替換end endend
function [ DIS ] = computeMutualDis(dataFrame,La,Lo) %要求輸入數據框架本體dataFrame,與La,Lo % dataFrame用來計算尺寸 La,Lo用來計算距離的實際經緯度 DIS = zeros(length(dataFrame),length(dataFrame));%s Radius = 6378; az=0; [h l] = size(dataFrame);%分別獲取數據框架的行(h)列(l)值 for i=1:hfor j=1:h%距離計算arclen是曲線距離,az是直線距離[arclen,az] = distance(La(i),Lo(i),La(j),Lo(j),Radius);DIS(i,j) = arclen;%更改這個可以實現距離替換end endend
總結
以上是生活随笔為你收集整理的2018SZB-B 暴力搜索拓扑结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: XYNUOJ 第四次比赛 懒省事得小名
- 下一篇: Mysql查询当天,本周,本月所有数据记