如何对复杂网络建模所需要的数据进行预处理

上一篇文章介绍了如何构建Space L实体网络的模型,这一篇是对上一篇文章的一个补充优化。

以下部分摘自上一篇文章:如何建立复杂网络实体网络的Space L模型

地铁网络,一般都有三四百个节点,线路十几条左右,看地铁图的是一个眼花缭乱。若是人工统计出来数据也是一项大工程。看着就想放弃,但其实掌握一定的方法并没有那么的费劲。

  1. 按线路进行节点的统计,先编号,然后去除掉重合的节点
  2. 统计连接关系时有一定的规则:比如从左往右统计、从上往下统计,这样可以避免重复统计
  3. 不要直接列出邻接矩阵,先统计出连接关系生成邻接表,然后再转成邻接矩阵
  4. 关于邻接表,最好再检查一遍
  5. 以上工作最好分成数天进行,否则负荷工作效率低且出错率较高

可以看到,建模时候最头疼的就是数据的处理问题,运用以上的经验可以提升我们的效率,但是治标不治本,依旧会浪费掉我们大量的时间。其实,如果不考虑换乘站(重复节点),连接关系还是比较好统计的,比如一条线路有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;
    end

   end
end
%这时就可以得到邻接表test

%判断是否为无权网络,判断标准rawDataNum是否为空,这与你的初始数据有关
if(length(rawDataNum) ~= 0)
    test = [test rawDataNum];
else
    disp('无权网络') 
end

%这一步就是把邻接表test直接转换为邻接矩阵A,
%可以参照:如何建立复杂网络实体网络的Space L模型中的函数
A  = ainc2adj( test );
% 判断是否有孤立节点
if(length(find(~sum(A))))
   disp('存在孤立节点') 
end

测试邻接表:

结果:

节点编号与名称对应关系

可以看到效果还是不错的,而且不仅限于交通网络。对于一些较大型的实体网络,比如作者合作网络、社交网络,应该也会有不错的效果。欢迎大家与我进行交流,

完整代码地址请参考–如何对复杂网络进行建模?

欢迎大家加入我的社群:复杂网络仿真社群)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值