|
From: | giorgio delzeri |
Subject: | Re: [igraph] How to avoid indexing issues with "which" fuction |
Date: | Mon, 5 Jun 2017 12:48:23 +0200 |
Below, the first "edition" of my algorithm:nb: note that the "IMMUNE" nodes rest in the same compartment (same label) during the whole process.END OF THE ALGORITHM.(END OF THE WHILE CYCLE).It select a given percentage (for example 12%) of the nodes that are "SPREADER" (the whole "SPREADER" compartment, not only the ones that are JUST become "SPREADER") and change their label to "STIFLER" (stiflers are the nodes that were spreader of the innovation, and now they stop spreading).It select a given percentage (for example 15%) of the "IGNORANT" nodes that are adjacent to "SPREADER" , and changes their label (compartment) from "IGNORANT" to "SPREADER" (this is the innovation spreading).Now, it starts a while cycle (the cycle stops if there are no more vertices "IGNORANT" and/or there are no more vertices "SPREADER").It randomly select 1 node among the IGNORANT ones, and changes its label in "SPREADER". (so far its all ok with the algorithm, I think).The rest of vertices are, instead, IGNORANT.It randomly select a given percentage (10%) of the whole vertices ad assign them the label (or "compartment") IMMUNE.Hi, I already wrote part of the igraph algorithm which should do this (it is a simulation of a contagion process, but in a positive sense: innovation spreading)It starts from a scale-free graph.
"
g <- sample_pa(n=100, power=1, m=1, directed= F)V(g)$compartment <- “IGNORANT”
x <- sample(vcount(g), round(vcount(g)*0.1))
V(g)[x]$compartment <- “IMMUNI”
y <- sample(which(V(g)$compartment=
=”IGNORANT”), 1) V(g)[y]$compartment <- “SPREADER”
p <- 0.15
r <- 0.12
while (sum(V(g)$compartment==”SPREAD
ER”) >0) { w <- unique(unlist(adjacent_vertice
s(g, which(V(g)$compartment==”SPREA DER”)))) z <- sample(which(V(g)[w]$compartme
nt==”IGNORANT”), ceiling(p*sum(V(g)[w]$compartm ent==”IGNORANT”))) V(g)[z]$compartment <- “SPREADER”
k <- sample(which(V(g)$compartment=
=”SPREADER”), ceiling(r*sum(V(g)$ compartment==”SPREADER”))) V(g)[k]$compartment <- “STIFLER”
}.
"A friend advised me to change from the first version to the version just below:
"g <- sample_pa(n=100, power=1, m=1, directed= F)V(g)$compartment <- "IGNORANT"x <- sample(vcount(g), round(vcount(g)*0.1))V(g)[x]$compartment <- "IMMUNI"y <- sample(which(V(g)$compartment=="IGNORANT"), 1) V(g)[y]$compartment <- "SPREADER"degree(g,which(V(g)$compartment=="SPREADER")) p <- 0.15r <- 0.12while (sum(V(g)$compartment=="SPREADER") >0) { w <- unique(unlist(adjacent_vertices(g, which(V(g)$compartment=="SPREA DER")))) dummy_1 <- which(V(g)[w]$compartment=="IGNORANT") z <- sample(w[dummy_1], ceiling(p*length(dummy_1)))V(g)[z]$compartment <- "SPREADER"dummy_2 <- which(V(g)$compartment=="SPREADER") k <- sample(dummy_2, ceiling(r*length(dummy_2)))V(g)[k]$compartment <- "STIFLER"}"I have 3 problem I can't solve:1) The while cycle, and the algorithm, must stops if there are no more nodes in the "IGNORANT" compartment and/or there are no more nodes in the "SPREADER" compartment.2) I already tried the algorithm, and the number of the nodes that are "IMMUNE", decreases after a certain number of the while cycle. But that vertices must remain in the same compartment during the whole process!Maybe an issue in the while cycle, i think the problem is the indexing of nodes when it chooses the vertices to change from "IGNORANT" to "SPREADER", and/or the ones to change from "SPREADER" to "STIFLER".3) I have to revise the algorithm, because I want to obtain, at the and of the process, a print of a matrix that tell me about the number of "IGNORANT", "SPREADER" and "STIFLER" nodes in EACH iteration of the while cycle.Does anyone know the way to solve these 3 problems?Thank you in advance!!Giorgio
[Prev in Thread] | Current Thread | [Next in Thread] |