Chinaunix首页 | 论坛 | 博客
  • 博客访问: 334212
  • 博文数量: 54
  • 博客积分: 446
  • 博客等级: 下士
  • 技术积分: 821
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-30 17:37
文章分类

全部博文(54)

文章存档

2015年(35)

2014年(19)

我的朋友

分类: 云计算

2015-05-11 21:53:30

最近做网络实验需要用GT-ITM生成拓扑图,搜索了一下网上所有的资料基本都是在谈gt-itm如何与ns2结合生成实验用的拓扑图,而实际上gt-itm是用来生成网络拓扑图的工具,只要了解了gt-itm生成的图的具体结构,自己可以写代码将gt-itm生成的图表示出来,而不一定要借助于ns2工具。
    gt-itm主要生成两种形式的图,Random Graph Models和Transit-Stub Models,关于其生成图的原理,专门有论文论述,这里也不再详述了,简单来说本文的内容是如何根据gt-itm产生的图文件,还原出图的数据结构,因为这也是初学时最困扰我的东西。
    gt-itm的图结构主要是借助Standard GraphBase的形式表示,Standard GraphBase也是个很复杂的东西,好像knuth整整用了一本书 来阐述它,这里仅简单介绍一下要用到的部分。最好的方法就是从源代码入手,先看一下gt-itm中包含的gb_graph.h文件,列一下要用到的数据结构:
       

点击(此处)折叠或打开

  1. typedef union{
  2.      struct vertex_struct *V;
  3.      struct arc_struct *A;
  4.      struct graph_struct *G;
  5.      char *S;
  6.      long I;
  7. }util;

  8. /* 顶点结构 */
  9. typedef struct vertex_struct{
  10.      struct arc_struct *arcs;
  11.      char *name;
  12.      util u,v,w,x,y,z;
  13. }Vertex;

  14. /* 弧结构 */
  15. typedef struct arc_struct{
  16.      struct vertex_struct *tip;
  17.      struct arc_struct *next;
  18.      long len;
  19.      util a,b;
  20. }Arc;

  21. /* 图结构 */
  22. typedef struct graph_struct{
  23.      Vertex*vertices;
  24.      long n;
  25.      long m;
  26.      char id[ID_FIELD_SIZE];
  27.      char util_types[15];
  28.      Area data;
  29.      Area aux_data;
  30.      util uu,vv,ww,xx,yy,zz;
  31. }Graph;
   由此我们知道gt-itm生成的图是用邻接链表的形式表示出来的。
   看一下转换文件代码sgb2alt.c,这段代码的目的,是将由itm命令直接生成的.gb扩展名文件表示的图转换成.alt扩展名文件表示的图,.alt文件非常好理解,就是普通的形式。注意到代码中有这样一个函数:restore_graph,这个函数非常关键,其实也是sgb中定义的函数,它的引用文件是gb_save.h,在gt-itm中只是包含了头文件,没有函数定义,因此只有将sgb的代码下载下来,打开gb_save.w文件仔细阅读,这样所有的关于图生成与保存的全部疑问都解决了,这里仅仅是把其中的关键部分翻译一下,为了清楚的说明,以下面的文件为例,这也是gt-itm自带的样例文件
      

点击(此处)折叠或打开

  1. * GraphBase graph (util_types ZZZIIZIZIZZZZZ,14V,102A)
  2. "geo(0,{10,10,3,0.200,0.000,0.000})",10,28,10
  3. * Vertices
  4. "0",A4,3,4
  5. "1",A6,8,6
  6. "2",A8,7,6
  7. "3",A14,6,0
  8. "4",A18,8,1
  9. "5",A22,0,3
  10. "6",A17,4,0
  11. "7",A24,3,6
  12. "8",A26,1,5
  13. "9",A27,7,2

  14. * Arcs
  15. V2,0,4,0
  16. V0,0,4,0
  17. V4,A0,6,0
  18. V0,0,6,0
  19. V9,A2,4,0
  20. V0,0,4,0
  21. V8,0,7,0
  22. V1,0,7,0
  23. V6,A1,7,0
  24. V2,0,7,0
  25. V5,0,7,0
  26. V3,0,7,0
  27. V8,A10,7,0
  28. V3,A7,7,0
  29. V9,A12,2,0
  30. V3,A5,2,0
  31. V6,A3,4,0
  32. V4,A9,4,0
  33. V7,A16,7,0
  34. V4,0,7,0
  35. V7,A11,4,0
  36. V5,A19,4,0
  37. V9,A20,7,0
  38. V5,A15,7,0
  39. V9,A21,6,0
  40. V7,A23,6,0
  41. V9,A13,7,0
  42. V8,A25,7,0
   假设定义一个指向图结构的指针Graph *g, 则这里的g->util_types的值是ZZZIIZIZIZZZZZ,前六个对应的是Vertex结构中的util型变量,后面两个对应的是Arc结构中的util型变量,最后六个对应的是Graph结构中的util型变量,Z表明忽略此变量的值,用具体的例子来说,"ZZZIIZ"表明Vertex结构的util变量只有x, y有效,共用体取值均为变量I,至于util这个变量究竟有什么用,如果我们只是要使用图的拓扑结构,其实没有必要了解。后面的14V,102A表明图最多有14个顶点,102条边,同样也没有很大的意义。
   再看第二行,"id"字段标示图的生成规则,可以不用管,后面的三个变量10, 28, 10分别说一下,它们分别对应于g->n, g->m,    g->uu.I变量,表示生成的图有10个顶点,28条边,最后的util结构同样不需要理解,说明一下,如果util_types的最后六位是这种形式“SZZZZZ”,则对应变量是g->uu.S, 则最后一个10的值有可能要换成字符。
   下面就是顶点与弧的描述,可以回忆一下数据结构中图的邻接链表存储形式,当前定义的图结构与此非常类似,具体看一下文件中的Vertices表示,假设有Vertex变量v, 则从左到右依次是v->name, v->arcs(文件中是顶点指向的第一条弧), v->x.I, v->y.I, 后面两个变量同样不样管它。再看Arcs结构,我们看定义知道,所有弧结构均是用链表串联起来的,文件中从左到右依次是弧的tip结点,弧所指向的下一条结点(为0表示下一条结点为空),弧长,最后一个字段是arc->a.I,例子中都是0.
    这样说可能仍然难以理解,下面就将示例中的图用简单的图结构表示出来(图比较简略,看图时大家尽量回忆图的邻接链表存储形式,如果我有空再画更清晰的图)以便于理解:
    结点 "0":  A4
     0 ----> 9 ----> 4 ----> 2     A4: 0 ----> 9   A2: 0 ----> 4  A0: 0 ----> 2
    结点 "1":  A6
     1 ----> 8    A6: 1 ----> 8
    结点 "2":  A8
     2 ----> 6 ----> 0        A8: 2 ----> 6  A1: 2 ----> 0
    结点 "3":  A14
     3 ----> 9 ----> 8 ----> 5     A14: 3 ----> 9    A12: 3 ----> 8    A10: 3 ----> 5
    结点 "4":  A18
     4 ----> 7 ----> 6 ----> 0     A18: 4 ----> 7    A16: 4 ----> 6    A3: 4 ----> 0
    结点 "5":  A22
     5 ----> 9 ----> 7 ----> 3     A22: 5 ----> 9    A20: 5 ----> 7    A11: 5 ----> 3
    结点 "6":  A17
     6 ----> 4 ----> 2        A17: 6 ----> 4     A9:  6---->2
    结点 "7":  A24
     7 ----> 9 ----> 5 ----> 4       A24: 7 ----> 9    A21: 7 -----> 5   A19: 7 ----> 4
    结点 "8":  A26
     8 ----> 9 ----> 3 ----> 1      A26: 8 ----> 9   A13: 8 ----> 3    A7: 8 ----> 1
    结点 "9":  A27
     9 ----> 8 ----> 7 ----> 5 ----> 3 ----> 0   A27: 9 ----> 8  A25: 9 ----> 7   A23: 9 ----> 5  A15: 9 ----> 3   A5: 9 ----> 0
   以上内容其实是解释了.gb文件的内容,顺带了解一下standard graphbase的存储结构,其实最简单的得到拓扑的方法是用.alt文件中的内容,看一下以上拓扑图对应的.alt文件内容:
      

点击(此处)折叠或打开

  1. GRAPH (#nodes #edges id uu vv ww xx yy zz):
  2. 10 28 geo(0,{10,10,3,0.200,0.500,0.500}) 10

  3. VERTICES (index name u v w x y z):
  4. 0 0 3 4
  5. 1 1 8 6
  6. 2 2 7 6
  7. 3 3 6 0
  8. 4 4 8 1
  9. 5 5 0 3
  10. 6 6 4 0
  11. 7 7 3 6
  12. 8 8 1 5
  13. 9 9 7 2

  14. EDGES (from-node to-node length a b):
  15. 0 9 4 0
  16. 0 4 6 0
  17. 0 2 4 0
  18. 1 8 7 0
  19. 2 6 7 0
  20. 3 9 2 0
  21. 3 8 7 0
  22. 3 5 7 0
  23. 4 7 7 0
  24. 4 6 4 0
  25. 5 9 7 0
  26. 5 7 4 0
  27. 7 9 6 0
  28. 8 9 7 0
   这个理解起来可谓是一目了然,由于是无向图,所以EDGES只有14行。
   注意:gt-itm代码只能在i386操作系统上运行, 具体使用方法README文件中说得已经很清楚了。

      

      
阅读(5395) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~