博客
关于我
CDS最小支配集的MATLAB仿真
阅读量:247 次
发布时间:2019-03-01

本文共 5034 字,大约阅读时间需要 16 分钟。

clc;

clear;
close all;

Node_Num=200;%size of nodes: 100

Posxy=zeros(Node_Num,2);%node_coordinate.the(:,1)for the x, and (:,2) for y
Radius=10;
Scale=100;
Area_Size_W=100;%area: square 300*300

d1=zeros(Node_Num,Node_Num+1);%store one_hop neighbors information

%%

%*************************Intialize the network***************************

for i=1:Node_Num

    Posxy(i,:)=Scale*rand(1,2);
end

%%

%***************node get the one_hop neighbors information****************

for i=1:Node_Num

    num1=0;
    for j=1:Node_Num
        if i~=j
            dist=(Posxy(i,1)-Posxy(j,1))^2+...
                (Posxy(i,2)-Posxy(j,2))^2;
            dist=sqrt(dist);
            if dist<Radius&&dist>0
                num1=num1+1;
                d1(i,num1+1)=j;
            end
        end
    end
    d1(i,1)=num1;
end

%%

%*********************show the connected picture**************************

hold on

for i=1:Node_Num%draw the line between two nodes
    for j=1:d1(i,1)
        plot([Posxy(i,1),Posxy(d1(i,j+1),1)],...
            [Posxy(i,2),Posxy(d1(i,j+1),2)],'-ok');
        hold on;
    end
end

%%

%************node get the two_hop neighbors information*******************

Max_Degree=max(d1(:,1));

Neighbor_hop2=zeros(Max_Degree,Max_Degree+1,Node_Num);%store two_hop neighbors information
for i=1:Node_Num
   for j=1:d1(i,1)
       Neighbor_hop2(j,1,i)=d1(i,j+1);
       for m=1:d1(d1(i,j+1),1)
           Neighbor_hop2(j,m+1,i)=d1(d1(i,j+1),m+1);
       end
   end
end

%

%**********color the node with gray and white based on the rule**********
%0-white;1-gray;

Color_N=zeros(Node_Num,1);%intial the color of nodes

for i=1:Node_Num

    if d1(i,1)<2
        Color_N(i,1)=0;
    else
        for j=1:d1(i,1)
            color=0;
            for n=j+1:d1(i,1)
                state=0;
                for m=2:d1(Neighbor_hop2(j,1,i),1)+1
                    if Neighbor_hop2(n,1,i)==Neighbor_hop2(j,m,i)
                        state=1;
                        break;
                    end
                end
                if state==0
                    color=1;
                    break;
                end
            end
            if color==1
                break;
            end
        end
        Color_N(i,1)=color;
    end
end

%%

%**********color Black based on the rule**********
%0-white;1-gray;2-balck;3-gray';

%Balck

for i=1:Node_Num
    if Color_N(i,1)==0&&d1(i,1)>0
        temp_degree=0;
        temp_id=0;
        for j=1:d1(i,1)
            if Color_N(d1(i,j+1),1)~=0
                if Color_N(d1(i,j+1),1)~=2
                    Color_N(d1(i,j+1),1)=3;
                end
                if d1(d1(i,j+1),1)>temp_degree
                    temp_degree=d1(d1(i,j+1),1);
                    temp_id=d1(i,j+1);
                elseif d1(d1(i,j+1),1)==temp_degree
                    if temp_id>d1(i,j+1)
                        temp_degree=d1(d1(i,j+1),1);
                        temp_id=d1(i,j+1);
                    end
                end
            end
        end
        if temp_id~=0
            Color_N(temp_id,1)=2;
        end
    end
end
%end Balck

%%

%%**********color Real_Violet based on the rule**********
%0-white;1-gray;2-balck;3-gray';
%remove the Violet node form to get a dominating set
%1 and 3 组成DS

Count2=0;

for m=1:Node_Num
    if Color_N(m,1)==1
        Count2=Count2+1;
    end
end
while(Count2)%Simulation of distributed computing
    for i=1:Node_Num
        if Color_N(i,1)==1
            temp_degree=d1(i,1);
            state=1;
            for j=1:d1(i,1)
                if Color_N(d1(i,j+1))==1
                    if temp_degree>d1(d1(i,j+1),1)
                        state=1;
                    elseif temp_degree==d1(d1(i,j+1),1)
                        if i<d1(i,j+1)
                            state=1;
                        else
                            state=0;
                            break;
                        end
                    else
                        state=0;
                        break;
                    end
                end
            end
            if state==1
                Color_N(i,1)=4;
                Count2=Count2-1;
                for j=1:d1(i,1)
                    if Color_N(d1(i,j+1))==1
                        Color_N(d1(i,j+1),1)=5;
                        Count2=Count2-1;
                    end
                end
            end
        end
    end
end

%%

%choes some node to form the connect nodes who's color number eqult to 2 or
%4
tempall=1;
temp_self=Neighbor_hop2(:,:,1)*0;%2 hop's information

for i=1:Node_Num

    if Color_N(i,1)==4||Color_N(i,1)==2

        temp_self=temp_self*0;%2 hop's information
        
        %node i formulation the 2_hop connected graph
        for n=1:d1(i,1)
            temp2=d1(d1(i,n+1),1);
            temp_count=1;
            state=1;
            for m=2:temp2+1
                temp_self(n,1)=d1(i,n+1);
                temp=Neighbor_hop2(n,m,i);
                state=1;
                for p=1:d1(i,1)
                    if temp==i
                        state=0;
                        break;
                    elseif temp==d1(i,p+1)
                        state=0;
                        break;
                    end
                end
                if state==1

                    temp_count=temp_count+1;

                    temp_self(n,temp_count)=temp;

                end

            end
        end
        
        
        
        
%%        
        %chose some node in two_hops of node i to connect the2_hop's dominating nodes
        Already_handle=zeros(Max_Degree*Max_Degree,1);
        Already_handle_result=Already_handle;
        handle_count=0;
        for n=1:d1(i,1)
            if temp_self(n,1)==0;
                break;                
            end
            for m=2:Max_Degree+1
                if temp_self(n,m)==0
                    break;
                end
                if Color_N(temp_self(n,m),1)==4||Color_N(temp_self(n,m),1)==2
                    state=0;
                    for p=1:handle_count
                        if Already_handle(p,1)==temp_self(n,m)
                            state=1;
                            if Already_handle_result(p,1)==0
                                break;
                            else
                                if Color_N(temp_self(n,1))==2||Color_N(temp_self(n,1))==4
                                    Already_handle_result(p,1)=0;
                                    break;
                                elseif  d1(temp_self(n,1),1)>d1(Already_handle_result(p,1),1)
                                    Already_handle_result(p,1)=temp_self(n,1);
                                elseif d1(temp_self(n,1),1)==d1(Already_handle_result(p,1),1)
                                    if temp_self(n:1)<Already_handle_result(p,1)
                                        Already_handle_result(p,1)=temp_self(n,1);
                                    end
                                end
                            end
                        end
                    end
                    if state==0;
                        if Color_N(temp_self(n,1))==2||Color_N(temp_self(n,1))==4
                            Already_handle(handle_count+1,1)=temp_self(n,m);
                            Already_handle_result(handle_count+1,1)=0;
                            handle_count=handle_count+1;
                        else
                            Already_handle(handle_count+1,1)=temp_self(n,m);
                            Already_handle_result(handle_count+1,1)=temp_self(n,1);
                            handle_count=handle_count+1;
                        end
                    end
                end
            end
        end
        
        for n=1:handle_count
           if  Already_handle_result(n,1)==0
              
           else
               Color_N(Already_handle_result(n,1))=6;
               
               temp1=Already_handle_result(n,1);
               temp2=Already_handle(n,1);
               plot([Posxy(i,1),Posxy(temp1,1)],[Posxy(i,2),Posxy(temp1,2)],'o-.c')
               plot([Posxy(temp2,1),Posxy(temp1,1)],[Posxy(temp2,2),Posxy(temp1,2)],'o-.c')
               
           end
        end
 

D-38

转载地址:http://ptwx.baihongyu.com/

你可能感兴趣的文章
MySql中 delimiter 详解
查看>>
MYSQL中 find_in_set() 函数用法详解
查看>>
MySQL中auto_increment有什么作用?(IT枫斗者)
查看>>
MySQL中B+Tree索引原理
查看>>
mysql中cast() 和convert()的用法讲解
查看>>
mysql中datetime与timestamp类型有什么区别
查看>>
MySQL中DQL语言的执行顺序
查看>>
mysql中floor函数的作用是什么?
查看>>
MySQL中group by 与 order by 一起使用排序问题
查看>>
mysql中having的用法
查看>>
MySQL中interactive_timeout和wait_timeout的区别
查看>>
mysql中int、bigint、smallint 和 tinyint的区别、char和varchar的区别详细介绍
查看>>
mysql中json_extract的使用方法
查看>>
mysql中json_extract的使用方法
查看>>
mysql中kill掉所有锁表的进程
查看>>
mysql中like % %模糊查询
查看>>
MySql中mvcc学习记录
查看>>
mysql中null和空字符串的区别与问题!
查看>>