R语言-关键节点问题-方案二

来源:互联网 发布:php代码开元 编辑:程序博客网 时间:2024/05/22 12:34

紧接方案一

由于方案一每次输出一个权重最高结点,然原始网络规模达100W,到假设一秒输出一个结点也约需要277小时,到中间阶段,有很多结点具有相同的权重。

因此做性能优化,每次输出权重最大的全部结点,预计可以吧时间缩短在3小时以内。

缺点是同属最大权重的结点间可能相关,导致结果不是特别精准,尤其随着权重变小,规模变大,尤其明显,所以设置当最大权重为5的时候停止输出。

实现代码:

library(dplyr)library(RMySQL)                       # 载入RMySQL包conn <- dbConnect(MySQL(),dbname = "NETWORKS",username = "root") # 建立数据库连接dbSendQuery(conn, "SET @@sql_mode=ANSI;") # 启动非严格模式dbSendQuery(conn, "SET NAMES GBK")    # win7环境下如果汉字乱码,就运行这条命令res <- dbSendQuery(conn, "SELECT * FROM NODEWeight1")dat <- dbFetch(res, n=-1)             #n=-1表示取所有数据,n=2表示取2条数据res1 <- dbSendQuery(conn, "SELECT * FROM NODEMap1")dat1 <- dbFetch(res1, n=-1)           #n=-1表示取所有数据,n=2表示取2条数据output <- data.frame(nodeID = 0,Weight = 0,seq = 0)        #建立空的输出序列output <- output[-1,]                                      #清空数据node_cnt <- 0                                              #已经输出的结点数量for (i in 1:nrow(dat)) {   print(Sys.time())   max_Weight <- max(dat$Weight)   if (max_Weight < 5)                             #当最大权重小于5时,退出循环     {       #打印剩余的结点       file.path <- paste("E:/PACT-上海/私の稿/比赛/大师赛-挖掘复杂网络中的关键节点/方案一/output_",last,".csv",sep="")       write.table(dat,file.path, col.names=T,row.names = F, quote = F, sep=",")       break     }   node_del <- dat$nodeID[dat$Weight==max_Weight]            #权重最大的结点编号,有多个全部输出   node_rel <- data.frame(nodeID = 0,Weight = 0) #初始化   node_rel <- node_rel[-1,]      #循环删除最大权重结点信息   for (m in 1:length(node_del))     {       node_del_tmp <- node_del[m]       node_rel <- rbind(node_rel,cbind(nodeID=dat1[which(dat1$nodeID1==node_del_tmp),2],Weight=0))   #追加node_del_tmp相连接的结点       dat1 <- dat1[-which(dat1$nodeID1==node_del_tmp),]  #删除node_del_tmp的数据       dat1 <- dat1[-which(dat1$nodeID2==node_del_tmp),]  #删除连接node_del_tmp的数据       dat <- dat[-which(dat$nodeID==node_del_tmp),]      #删除node_del_tmp的数据     }   node_rel <- summarise(group_by(node_rel, nodeID),count = n())  #group by      #循环更新关联结点权重   for (n in 1:length(node_rel))     {       x <- which(dat$nodeID==node_rel$nodeID[n])       dat$Weight[x] <- dat$Weight[x] -node_rel$count[n]  #关联结点权重-1  效率不高     }      output <- rbind(output, cbind(nodeID=node_del, Weight=max_Weight, seq=i) )     #输出本轮最大结点信息   node_cnt = node_cnt+m   cat("Weight:",max_Weight,"\tnode number:",m,"\tnode count:",node_cnt,"\tnode release:",nrow(dat),"\n")     #页面输出      if (max_Weight <= 35)                             #当权重小于35时才存储文件     {       file.path <- paste("E:/PACT-上海/私の稿/比赛/大师赛-挖掘复杂网络中的关键节点/方案一/output_",max_Weight,".csv",sep="")       write.table(output,file.path, col.names=T,row.names = F, quote = F, sep=",")     } }


原创粉丝点击