搜索
人大经济论坛 附件下载

附件下载

所在主题:
文件名:  netE.rar
资料下载链接地址: https://bbs.pinggu.org/a-3431052.html
本附件包括:
  • netE.csv
附件大小:
190 Bytes   举报本内容
这个问题是前几天论坛wushibuzhi同学提出来的( https://bbs.pinggu.org/thread-10540615-1-1.html )本来可以直接回复他,后来考虑内容比较多,而且为更方便其他同学利用,因此这里新开一贴。

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

为此做了一个示例数据,如下:
[hide][/hide]

  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. )
复制代码



不考虑时间约束的网络图


使问题复杂化的是,从一个节点到下一个节点的行程时间如果超过下一个节点的出发时间,需要等一天,也就是相应的形成时间增加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. )
复制代码


调整后的网络图如下:



经过上述调整,我们可以计算最短路径
  1. shortest_paths(net_n,"A","E")[[1]]
  2. #最优路径的结果如下
  3. #[1] AA2 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、这种方式的缺点是,如果节点太多,可能会极大地增加计算量。



    熟悉论坛请点击新手指南
下载说明
1、论坛支持迅雷和网际快车等p2p多线程软件下载,请在上面选择下载通道单击右健下载即可。
2、论坛会定期自动批量更新下载地址,所以请不要浪费时间盗链论坛资源,盗链地址会很快失效。
3、本站为非盈利性质的学术交流网站,鼓励和保护原创作品,拒绝未经版权人许可的上传行为。本站如接到版权人发出的合格侵权通知,将积极的采取必要措施;同时,本站也将在技术手段和能力范围内,履行版权保护的注意义务。
(如有侵权,欢迎举报)
二维码

扫码加我 拉你入群

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

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

GMT+8, 2026-1-29 19:24