上一篇文章介绍了如何构建Space L实体网络的模型,这一篇是对上一篇文章的一个补充优化。
以下部分摘自上一篇文章:
邢八宝:如何建立复杂网络实体网络的Space L模型?zhuanlan.zhihu.com地铁网络,一般都有三四百个节点,线路十几条左右,看地铁图的是一个眼花缭乱。若是人工统计出来数据也是一项大工程。看着就想放弃,但其实掌握一定的方法并没有那么的费劲。
按线路进行节点的统计,先编号,然后去除掉重合的节点
统计连接关系时有一定的规则:比如从左往右统计、从上往下统计,这样可以避免重复统计
不要直接列出邻接矩阵,先统计出连接关系生成邻接表,然后再转成邻接矩阵
关于邻接表,最好再检查一遍
以上工作最好分成数天进行,否则负荷工作效率低且出错率较高
可以看到,建模时候最头疼的就是数据的处理问题,运用以上的经验可以提升我们的效率,但是治标不治本,依旧会浪费掉我们大量的时间。其实,如果不考虑换乘站(重复节点),连接关系还是比较好统计的,比如一条线路有10个站点,按顺序分别为a、b、c….j,那么连接关系可以表示为下图的1-9列:
最近有一个需求,要统计某市的公交网络,有300多条线路,大概有3000多节点。如果此时还按之前的办法:人工统计线路中的站点,然后进行编号的话,那整个工程量不仅巨大,并且在统计过程中也很容易出错。
所以可以让程序帮助我们去识别站点名称,然后依次给它们编号,这样就可以生成直接使用邻接表。
具体处理方式,可以大概分为以下几个步骤:
% 1.从xls文件中,读取数据(或者直接新建数据)% rawDataNum是读取到的数值,可以是权重,数据类型:double% rawDataStr是读取到的字符串,是邻接表,数据类型:cell% 2.用b接收rawDataStr中的所有不重复的字符串,数据类型 cell% 3.因为cell类型矩阵中存储的是字符串数据,不好处理% 所以需要把b和rawDataStr转换为string数组b_str和raw_str% 注意这里可以检查一下b_str中的字符串%4.进行数据处理test = [];for i = 1:length(b_str)for j = 1:length(raw_str)%判断条件if(raw_str(j,1) == b_str(i,1))test(j,1) = i;end%判断条件if(raw_str(j,2) == b_str(i,1))test(j,2) = i;endendend%这时就可以得到邻接表test%判断是否为无权网络,判断标准rawDataNum是否为空,这与你的初始数据有关if(length(rawDataNum) ~= 0)test = [test rawDataNum];elsedisp('无权网络') end%这一步就是把邻接表test直接转换为邻接矩阵A,%可以参照:如何建立复杂网络实体网络的Space L模型中的函数A = ainc2adj( test );% 判断是否有孤立节点if(length(find(~sum(A))))disp('存在孤立节点') end
测试邻接表:
结果:
节点编号与名称对应关系:
可以看到效果还是不错的,而且不仅限于交通网络。对于一些较大型的实体网络,比如作者合作网络、社交网络,应该也会有不错的效果。欢迎大家与我进行交流。
给大家推荐一个非常好的科研网站,可以使用免费Web of Science、zhi网、IEEE、EI等账号。亲测好用。这个网站拥有众多的数据库,法律的、医学的、工科的,等等。【亲测好用!】2020中国知网免费入口_知网免费账号_Web of Science免费入口 - 80图书馆
该文章首发于:
XuXing’s blogxuxing0430.github.io复杂网络相关内容可以访问:
复杂网络xuxing0430.github.io