加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

如何在igraph中提取某些路径类型?

发布时间:2020-12-20 13:28:13 所属栏目:Python 来源:网络整理
导读:TLDR:我想提取igraph中两个顶点之间每条路径的边缘类型.有一个相对理智的方式来做到这一点? 我最近工作的诊所在高中进行了一次相当大(1400人)的结核病接触调查.我有所有学生和老师的班级时间表(!)并将他们放入网络(使用R中的igraph),每个学生和每个房间
TLDR:我想提取igraph中两个顶点之间每条路径的边缘类型.有一个相对理智的方式来做到这一点?

我最近工作的诊所在高中进行了一次相当大(1400人)的结核病接触调查.我有所有学生和老师的班级时间表(!)并将他们放入网络(使用R中的igraph),每个学生和每个房间 – 时期组合作为顶点(例如,期间123室的班级) 1是一个顶点,它有一个有向边到类,它在第123期的房间123中.我也知道哪些房间共用通风系统 – 这是一种看似合理但不太可能的感染机制.该图表是从唯一的源案例中引出的,因此网络中的每个路径中只有两个人 – 源和联系人,由可变数量的房间周期顶点分隔.从概念上讲,有四种路径:

>个人接触曝光(来源 – >仅联系)
>共享课程曝光(来源 – >房间期 – >联系)
>下一期间曝光(来源 – >房间123期间1 – >房间123期间
2 – >联系)
>通风暴露(来源 – > Room 123 Period 1 – > Room 125 Period
1 – >联系)

每条边都有一个属性,表明它是人与人之间的曝光,同房不同时期还是通风边缘.

作为在这个网络上模拟感染的中间步骤,我想简单地计算一个学生每种类型的暴露次数.例如,学生可能与来源共享一个班级,然后在一个房间里已经进入了一个房间,但是过了一段时间,也许第二天一直在通风相邻的房间里.那个学生的指标将是:

personal.contact: 0
shared.class:     1
next.period:      1
vent:             1

我不知道如何最好地获得这种信息 – 我看到了获取最短路径的功能,这使得识别个人联系链接变得容易,但我认为我需要评估所有路径(这似乎是一个疯狂的问题对于一个典型的社交网络,但只有源和时间段有边缘时,并没有这么疯狂.如果我能够达到每个源到接触路径由边缘类型的有序向量表示的点,我想我可以轻松地将它们按照我的标准进行子集化.我只是不知道如何到达那里.如果igraph不是正确的框架,我只需要在学生的日程安排上写一些可怕的循环,就这样吧!但是在我潜入那个洞之前,我会感激一些指导.

以下是三个间接路径中每个路径的联系示例图:

# Strings ain't factors
options(stringsAsFactors = FALSE)  
library(igraph)

# Create a sample case
edgelist <- data.frame(out.id = c("source","source","Rm 123 Period 1","Rm 125 Period 2","Rm 125 Period 3","Rm 127 Period 4","Rm 129 Period 4"),in.id = c("Rm 123 Period 1","contact","Rm 129 Period 4","contact"),edge.type = c("Source in class","Source in class","Student in class","Class-to-class","Vent link","Student in class"
                                     )
)

samp.graph <- graph.data.frame(edgelist,directed = TRUE)

# Label the vertices with meaningful names
V(samp.graph)$label <- V(samp.graph)$name

plot(samp.graph,layout = layout.fruchterman.reingold)

解决方法

我不完全确定我理解你的图模型,但如果问题是:

I have two vertices and I wish to extract every path between them,then extract the edge attributes of those edges.

那么也许这可能会奏效.

使用广度优先搜索. Igraph包含一个,但它很容易滚动你自己,这将为你提供更多的灵活性,你想要获得什么信息.我假设你的图表中没有循环 – 否则你会获得无限数量的路径.我不太了解Python(虽然我在R中使用igraph),所以这里有一些伪代码.

list <- empty

allSimplePaths(u,v,thisPath)
  if (u == v) return
  for (n in neighborhood(u))
    if (n in thisPath)
      next
    if (u == v)
      list <- list + (thisPath + v)
  for (n in neighborhood(u))
    thisPath <- thisPath + n
    allSimplePaths(n,thisPath)
    thisPath <- thisPath - thisPath.end

基本上它说“从每个顶点,尝试所有可能的扩展路径到达终点.”添加另一个thisPathEdges并插入边,将其传递给函数以及顶点是一件简单的事情.当然,如果不是递归的话,这会更好.请注意,因为此算法可能会使您的堆栈充满足够的节点.

您仍然可能想要使用@PaulG的模型,并且在学生的节点之间只有多个边缘.你可以做一些很酷的事情,比如先进行广泛的搜索,看看疾病是如何传播的,或者找一个最小的生成树来估算时间,或者找一个最小限度的隔离来隔离正在进行的感染.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读