• 基于matlab的最小支配集CDS仿真


    目录

    1.算法描述

    2.仿真效果预览

    3.MATLAB部分代码预览

    4.完整MATLAB程序


    1.算法描述

           支配集的定义如下:给定无向图G =(V , E),其中V是点集, E是边集, 称V的一个子集S称为支配集当且仅当对于V-S中任何一个点v, 都有S中的某个点u, 使得(u, v) ∈E。对于图G = (V, E) 来说,最小支配集指的是从 V 中取尽量少的点组成一个集合, 使得 V 中剩余的点都与取出来的点有边相连.也就是说,设 V' 是图的一个支配集,则对于图中的任意一个顶点 u ,要么属于集合 V', 要么与 V' 中的顶点相邻. 在 V' 中除去任何元素后 V' 不再是支配集, 则支配集 V' 是极小支配集.称G 的所有支配集中顶点个数最少的支配集为最小支配集,最小支配集中的顶点个数称为支配数.

           最小支配集(minimal dominating set):对于图G=(V,E)来说,设V'是图G的一个支配集,则对于图中的任意一个顶点u,要么属于集合V',要么与V'中的顶点相连。在V'中除去任何元素后V'不再是支配集,则支配集V'是极小支配集。称G中所有支配集中顶点个数最少的支配集为最小支配集,最小支配集中的顶点个数称为支配数。

    最小支配集的性质:

    1)求最小支配集问题被证明属于NP完全问题,即对于给定问题域的输入规模,目前尚无足够的手段证明该问题能够被判定在多项式时间内求解。

    2)在含n个点的任意图中,若任意点的度大于等于3,则该图的最小支配集小于等于3n/8。

    3)对于特殊图,如树,可使用贪心或dp的方法解决问题。

    贪心策略
           首先选择一点为树根,再按照深度优先遍历得到遍历序列,按照所得序列的反向序列的顺序进行贪心,对于一个即不属于支配集也不与支配集中的点相连的点来说,如果他的父节点不属于支配集,将其父节点加入到支配集

    具体实现
    1.设整型数组dfn,fa,布尔数组vis,st。dfn[i]表示dfs中出现的第i个节点,fa[i]表示dfs中节点i的父节点,vis[i]-false表示节点i不属于支配集也不与支配集中的点相连,st[i]-true表示节点i在MDS中。

    2.建图(邻接表)。

    3.dfs一遍树,确定dfn,fa。

    4.dfn逆序查找,确定vis,st,同时得出MDS。

    2.仿真效果预览

    matlab2013B仿真结果如下:

    3.MATLAB部分代码预览

    1. tempall=1;
    2. temp_self=Neighbor_hop2(:,:,1)*0;%2 hop's information
    3. for i=1:Node_Num
    4. if Color_N(i,1)==4||Color_N(i,1)==2
    5. temp_self=temp_self*0;%2 hop's information
    6. %node i formulation the 2_hop connected graph
    7. for n=1:d1(i,1)
    8. temp2=d1(d1(i,n+1),1);
    9. temp_count=1;
    10. state=1;
    11. for m=2:temp2+1
    12. temp_self(n,1)=d1(i,n+1);
    13. temp=Neighbor_hop2(n,m,i);
    14. state=1;
    15. for p=1:d1(i,1)
    16. if temp==i
    17. state=0;
    18. break;
    19. elseif temp==d1(i,p+1)
    20. state=0;
    21. break;
    22. end
    23. end
    24. if state==1
    25. temp_count=temp_count+1;
    26. temp_self(n,temp_count)=temp;
    27. end
    28. end
    29. end
    30. %%
    31. %chose some node in two_hops of node i to connect the2_hop's dominating nodes
    32. Already_handle=zeros(Max_Degree*Max_Degree,1);
    33. Already_handle_result=Already_handle;
    34. handle_count=0;
    35. for n=1:d1(i,1)
    36. if temp_self(n,1)==0;
    37. break;
    38. end
    39. for m=2:Max_Degree+1
    40. if temp_self(n,m)==0
    41. break;
    42. end
    43. if Color_N(temp_self(n,m),1)==4||Color_N(temp_self(n,m),1)==2
    44. state=0;
    45. for p=1:handle_count
    46. if Already_handle(p,1)==temp_self(n,m)
    47. state=1;
    48. if Already_handle_result(p,1)==0
    49. break;
    50. else
    51. if Color_N(temp_self(n,1))==2||Color_N(temp_self(n,1))==4
    52. Already_handle_result(p,1)=0;
    53. break;
    54. elseif d1(temp_self(n,1),1)>d1(Already_handle_result(p,1),1)
    55. Already_handle_result(p,1)=temp_self(n,1);
    56. elseif d1(temp_self(n,1),1)==d1(Already_handle_result(p,1),1)
    57. if temp_self(n:1)
    58. Already_handle_result(p,1)=temp_self(n,1);
    59. end
    60. end
    61. end
    62. end
    63. end
    64. if state==0;
    65. if Color_N(temp_self(n,1))==2||Color_N(temp_self(n,1))==4
    66. Already_handle(handle_count+1,1)=temp_self(n,m);
    67. Already_handle_result(handle_count+1,1)=0;
    68. handle_count=handle_count+1;
    69. else
    70. Already_handle(handle_count+1,1)=temp_self(n,m);
    71. Already_handle_result(handle_count+1,1)=temp_self(n,1);
    72. handle_count=handle_count+1;
    73. end
    74. end
    75. end
    76. end
    77. end
    78. for n=1:handle_count
    79. if Already_handle_result(n,1)==0
    80. else
    81. Color_N(Already_handle_result(n,1))=6;
    82. temp1=Already_handle_result(n,1);
    83. temp2=Already_handle(n,1);
    84. plot([Posxy(i,1),Posxy(temp1,1)],[Posxy(i,2),Posxy(temp1,2)],'o-.c')
    85. plot([Posxy(temp2,1),Posxy(temp1,1)],[Posxy(temp2,2),Posxy(temp1,2)],'o-.c')
    86. end
    87. end
    88. %%
    89. %node i formulation the 3_hop connected graph
    90. Already_handle2=zeros(Max_Degree*Max_Degree*Max_Degree,1);
    91. handle_count2=0;
    92. Already_handle2_reult=zeros(Max_Degree*Max_Degree*Max_Degree,2);
    93. for n=1:d1(i,1)
    94. if temp_self(n,1)==0;
    95. break;
    96. end
    97. for m=2:Max_Degree+1
    98. if temp_self(n,m)==0
    99. break;
    100. end
    101. for p=1:d1(temp_self(n,m),1)
    102. temp_node=d1(temp_self(n,m),p+1);
    103. if Color_N(temp_node)==2||Color_N(temp_node)==4
    104. state_in=0;
    105. % it is one of 2hops neighboor of nod i if state_in==1;
    106. for n2=1:d1(i,1)
    107. if temp_self(n2,1)==0
    108. break;
    109. end
    110. if temp_self(n2,1)==temp_node
    111. state_in=1;
    112. break;
    113. end
    114. for m2=2:Max_Degree+1
    115. if temp_self(n2,m2)==0
    116. break;
    117. end
    118. if temp_self(n2,m2)==temp_node
    119. state_in=1;
    120. break;
    121. end
    122. end
    123. if state_in==1
    124. break;
    125. end
    126. end
    127. % it is one of 2hops neighboor of nod i if
    128. % state_in==0, then we get the rout from there.
    129. if state_in==0
    130. state_in2=0;
    131. for q=1:handle_count2
    132. if temp_node==Already_handle2(q,1)
    133. state_in2=1;
    134. temp1=Already_handle2_reult(q,1);
    135. temp2=Already_handle2_reult(q,2);
    136. temp3=temp_self(n,1);
    137. temp4=temp_self(n,m);
    138. if temp1==0
    139. break;
    140. %do nothing
    141. else
    142. if Color_N(temp3,1)==2||Color_N(temp3,1)==4||Color_N(temp4,1)==2||Color_N(temp4,1)==4
    143. Already_handle2_reult(q,1)=0;
    144. Already_handle2_reult(q,2)=0;
    145. else
    146. a=d1(temp3,1)+d1(temp4,1);
    147. b=d1(temp1,1)+d1(temp2,1);
    148. if a>b
    149. Already_handle2_reult(q,1)=temp3;
    150. Already_handle2_reult(q,2)=temp4;
    151. elseif a==b
    152. if temp3+temp4
    153. Already_handle2_reult(q,1)=temp3;
    154. Already_handle2_reult(q,2)=temp4;
    155. else
    156. %do nothing
    157. end
    158. end
    159. end
    160. end
    161. end
    162. if state_in2==1
    163. break;
    164. end
    165. end
    166. if state_in2==0;
    167. handle_count2=handle_count2+1;
    168. Already_handle2(handle_count2,1)=temp_node;
    169. temp1=temp_self(n,1);
    170. temp2=temp_self(n,m);
    171. if Color_N(temp1,1)==2||Color_N(temp1,1)==4||Color_N(temp2,1)==2||Color_N(temp2,1)==4
    172. Already_handle2_reult(handle_count2,1)=0;
    173. Already_handle2_reult(handle_count2,2)=0;
    174. else
    175. Already_handle2_reult(handle_count2,1)=temp_self(n,1);
    176. Already_handle2_reult(handle_count2,2)=temp_self(n,m);
    177. end
    178. end
    179. end
    180. end
    181. end
    182. end
    183. end
    184. for n=1:handle_count2
    185. if Already_handle2_reult(n,1)==0
    186. else
    187. Color_N(Already_handle2_reult(n,1),1)=7;
    188. Color_N(Already_handle2_reult(n,2),1)=7;
    189. temp1=Already_handle2_reult(n,1);
    190. temp2=Already_handle2_reult(n,2);
    191. temp3=Already_handle2(n,1);
    192. plot([Posxy(i,1),Posxy(temp1,1)],[Posxy(i,2),Posxy(temp1,2)],'o-.b')
    193. plot([Posxy(temp2,1),Posxy(temp1,1)],[Posxy(temp2,2),Posxy(temp1,2)],'o-.b')
    194. plot([Posxy(temp2,1),Posxy(temp3,1)],[Posxy(temp2,2),Posxy(temp3,2)],'o-.b')
    195. end
    196. end
    197. end
    198. end
    199. A_037

    4.完整MATLAB程序

    matlab源码说明_我爱C编程的博客-CSDN博客

    V

  • 相关阅读:
    [附源码]java毕业设计公益劳动招募管理系统
    深入理解Android音视频同步机制(一)ExoPlayer的avsync逻辑
    R语言使用cut函数进行数据分组(binning):根据指定间隔(breaks)将数据拆分为组、设置labels参数指定分组的标签
    substrate轻松学3:substrate构建一条链的体验
    FFMpeg zoompan 镜头聚焦和移动走位
    Spring MVC记录传入请求
    Python实现多子图绘制系统
    通过此文让你全面了解Thread线程的基本操作
    【爬虫】requests 结合 BeautifulSoup抓取网页数据
    Android 实战项目:简单计算器
  • 原文地址:https://blog.csdn.net/hlayumi1234567/article/details/128003989