楼主: llb_321
1739 3

[实际应用] 【独家发布】用igraph包做有时限条件的路径分析 [推广有奖]

  • 3关注
  • 49粉丝

教授VIP

已卖:595份资源

学科带头人

9%

还不是VIP/贵宾

-

TA的文库  其他...

LATEX & R 模板和代码

威望
2
论坛币
28191 个
通用积分
1739.6743
学术水平
410 点
热心指数
421 点
信用等级
355 点
经验
2099 点
帖子
1410
精华
1
在线时间
1035 小时
注册时间
2010-6-18
最后登录
2023-8-18

初级热心勋章 初级信用勋章 中级热心勋章 中级信用勋章 初级学术勋章

楼主
llb_321 在职认证  发表于 2021-4-9 09:53:43 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
这个问题是前几天论坛wushibuzhi同学提出来的( https://bbs.pinggu.org/thread-10540615-1-1.html )本来可以直接回复他,后来考虑内容比较多,而且为更方便其他同学利用,因此这里新开一贴。

问题:计算从A到Z之间的最优时效路径

为此做了一个示例数据,如下:

本帖隐藏的内容

netE.rar (190 Bytes) 本附件包括:
  • netE.csv


  1. #读入数据
  2. edges <- read.csv("netE.csv", header=T,stringsAsFactors = FALSE)

  3. #不考虑时间约束的网络图
  4. net_g <- graph_from_data_frame(d = edges[,-3], directed = TRUE)

  5. l1 <- layout_on_grid(net_g)
  6. plot(net_g,
  7. vertex.size = 24,
  8. vertex.label.cex = 1.2,
  9. vertex.label.dist = 3,
  10. edge.color = "tomato",
  11. edge.arrow.size = 0.3,
  12. layout = l1
  13. )
复制代码



不考虑时间约束的网络图
n1.png

使问题复杂化的是,从一个节点到下一个节点的行程时间如果超过下一个节点的出发时间,需要等一天,也就是相应的形成时间增加24小时,导致上面这个网络里的每条边的耗时是不确定的。

思路是这样的,针对有向网络,如果A出发可以去n个节点,比如可以去B,也可以去C,则将A拆成n个,A1去节点B,A2去节点C;其他节点同样处理,比如B1可以去C,B2可以去D。节点拆分后,edge也增加了,比如A1-B1, A1-B2 。这样处理后,我们就可以根据约束条件计算每一条edge的耗时,或者是标准时间,或者是标准时间+24 。然后即可以用igraph生成网络,并计算节点之间的最短路径。

  1. #考虑时间约束
  2. edges <- edges %>% arrange(from,to)
  3. branches <- table(edges[,1])
  4. f<-levels(as.factor(edges[,1]))

  5. #调整from
  6. nf<-NULL
  7. for (i in 1:length(f)) {nf<-append(nf,paste(f[i],1:branches[f[i]],sep=""))}
  8. edges[,1]<-nf

  9. #调整to
  10. nedge<- data.frame()

  11. for (j in 1:dim(edges)[1]) {
  12.   if (edges[j,2]!="E"){
  13.   tmp<-NULL
  14.   k=1
  15.   repeat {
  16.     tmp<-rbind(tmp,edges[j,])
  17.     k=k+1
  18.     if (k>branches[edges[j,2]]) break
  19.   }
  20.   tmp[,2]<-paste(edges[j,2],1:branches[edges[j,2]],sep="")
  21.   nedge <- rbind(nedge,tmp)
  22.   }
  23.   else
  24.     nedge <- rbind(nedge,edges[j,])
  25. }

  26. #调整weight

  27. nedge[,3]<-parse_date_time(nedge[,3],"%H:%M",exact = TRUE)
  28. for (i in 1:dim(nedge)[1]) {
  29.   if (nedge[i, 2] != "E") {
  30.     if (nedge[i, 3] + 3600 * nedge[i, 4] >= (nedge[which(nedge[, 1] == nedge[i, 2]), ])[1, 3])
  31.       nedge[i, 4] <- nedge[i, 4] + 24
  32.   }
  33. }


  34. #增加A
  35. nedge<-nedge[,-3]
  36. nedge<-rbind(nedge,data.frame(from=rep("A",branches["A"]),to=paste("A",1:branches["A"],sep=""),weight=rep(0,4)))


  37. #调整后的网络
  38. net_n <- graph_from_data_frame(d = nedge,directed = TRUE)

  39. l2 <- layout_on_grid(net_n)
  40. plot(net_n,
  41. vertex.size = 24,
  42. vertex.label.cex = 1.2,
  43. vertex.label.dist = 3,
  44. edge.color = "tomato",
  45. edge.arrow.size = 0.3,
  46. layout = l2
  47. )
复制代码


调整后的网络图如下:


n2.png
经过上述调整,我们可以计算最短路径
  1. shortest_paths(net_n,"A","E")[[1]]
  2. #最优路径的结果如下
  3. #[1] A  A2 C1 D1 E  

  4. #解读为ACDE是耗时最短的方案

  5. shortest.paths(net_n,"A","E") #计算该路径的最短耗时

  6. #3.5

  7. shortest.paths(net_n) #生成每个节点之间的最短耗时矩阵
复制代码


提醒:
1、上述网络是有向的;
2、上述代码只计算了从A到E的路径,计算其他区间点,需要对代码略作调整;

3、这种方式的缺点是,如果节点太多,可能会极大地增加计算量。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:GRAPH GRAP 路径分析 APH RAP 网络路径优化

已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
tulipsliu + 3 + 3 + 3 精彩帖子
cheetahfly + 30 精彩帖子

总评分: 论坛币 + 30  学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

本帖被以下文库推荐

沙发
llb_321 在职认证  发表于 2021-4-9 10:38:57
上述代码使用的包
library(dplyr)
library(lubridate)
library(igraph)
已有 1 人评分论坛币 收起 理由
owenqi + 5 很好的教程

总评分: 论坛币 + 5   查看全部评分

藤椅
owenqi 在职认证  学生认证  发表于 2021-4-9 13:06:07
支持一下,周末可以学习。

板凳
llb_321 在职认证  发表于 2021-4-9 14:01:52
owenqi 发表于 2021-4-9 13:06
支持一下,周末可以学习。
特殊问题,不具普遍性

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-29 14:48