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

来源:互联网 发布:锐捷mac地址绑定错误 编辑:程序博客网 时间:2024/05/01 23:42
问题说明:社交网络以及其他各种各样的网络,在社会经济、自然科学等领域中发挥着越来越大的作用,而其中一个很核心的问题是了解一个节点在网络中发挥的作用。比如SARS的传播,可能香港一个超级传播者带来的影响比其他100甚至1000个人还多;一条谣言的传播,一个核心大号的转发可能带来巨大的影响。
因此需要我们有一种能力,可以从生物的大规模基因调控网络中,找到导致疾病的重要基因;从大规模的社交网络中,找到传播谣言/疾病的最重要的节点;从大规模的企业投资关系网络中,找到可能导致金融风险的重要企业。

这些零零总总都可以划归为一类问题:如何寻找网络中的关键节点,这实际上是从现在到未来最有可能导致商业模式革新的一个重要方向。这个问题,也叫做复杂网络最优渗流,是网络科学领域的一个经典问题。本次大赛聚焦于此,邀请国内外ABM学者合作指导,以期获得精准的算法结果和优美的解决方案。


方案说明:由于是无向图,无法使用PageRank和HITS算法。先按照结点权重,无脑排序。


R语言实现:

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,]                                      #清空数据for (i in 1:nrow(dat)) {   print(Sys.time())   node_del <- dat[which.max(dat$Weight),1]            #权重最大的结点编号,只会输出一个   node_rel <- dat1[which(dat1$nodeID1==node_del),2]   #node_del相连接的结点      dat[dat$nodeID==node_del,] <- c(node_del,0,i)   #权重置0   for (j in 1:length(node_rel))     {       n <- which(dat$nodeID==node_rel[j])       dat$Weight[n] <- dat$Weight[n] -1  #关联结点权重-1  效率不高     }   dat1 <- dat1[-which(dat1$nodeID1==node_del),]  #删除node_del的数据   dat1 <- dat1[-which(dat1$nodeID2==node_del),]  #删除连接node_del的数据      output[i,] <- c(node_del,length(node_rel),i)  #输出node_del结点信息   print(output[i,])                             #页面输出      if (i%%500 == 0)                             #每500个结点保存一次文件     {       file.path <- paste("E:/PACT-上海/私の稿/比赛/大师赛-挖掘复杂网络中的关键节点/方案一/output_",i,".csv",sep="")       write.table(output,file.path, col.names=T,row.names = F, quote = F, sep=",")     } }


原创粉丝点击