diff --git a/src/algoritmos/GreedyIC.java b/src/algoritmos/GreedyIC.java new file mode 100644 index 0000000000000000000000000000000000000000..e4ba4c0f6316f5a6f084fb962e68986acafedfea --- /dev/null +++ b/src/algoritmos/GreedyIC.java @@ -0,0 +1,95 @@ +package algoritmos; + +import java.util.HashSet; + +import geradores.SocialNetworkGenerate; +import grafos.Actor; +import grafos.DirectedSocialNetwork; +import interfaces.SeedChooser; + +/** + * GeneralGreedy: algoritmo guloso proposto inicialmente + * por Kempe et. al. 2003 (extraido de outro artigo) + * @author Renato Melo +*/ +public class GreedyIC implements SeedChooser<Actor> { + private DirectedSocialNetwork grafo = null; + + public GreedyIC(DirectedSocialNetwork grafo) { + super(); + this.grafo = grafo; + } + + @Override + public HashSet<Actor> escolher(int k) { + HashSet<Actor> semente = new HashSet<>(); + + while (semente.size() < k) { + Actor max = MaxSpread(semente); + semente.add(max); + } + clearActive(); + return semente; + } + + private Actor MaxSpread(HashSet<Actor> semente) { + Actor max = null; + int repeticoes = 100; + double spread = 0; + + for (Actor v : grafo.vertexSet()) { + if (!v.isActive()) { + int soma = 0; + for (int i = 0; i < repeticoes; i++) { + + soma += cascata(v, semente); + } + double media = soma / repeticoes; + + if (media > spread) { + spread = media; + max = v; + } + } + } + System.out.println("spread: " + spread); + return max; + } + + private int cascata(Actor v, HashSet<Actor> semente) { + HashSet<Actor> ativados = grafo.activate(semente); + grafo.activate(v); + ativados.add(v); + + ativados.addAll(grafo.indepCascadeDiffusion(ativados)); + + int tamanho = ativados.size(); + grafo.deactivate(ativados); + + return tamanho; + } + + public void clearActive() { + for (Actor v : grafo.vertexSet()) { + v.setActive(false); + } + } + + public static void main(String[] args) { + DirectedSocialNetwork g; + g = new SocialNetworkGenerate().gerarGrafo(850, 2.8); + long startTime = 0; + + startTime = System.nanoTime(); + HashSet<Actor> seed2 = new OriginalGreedy(g).escolher(20); + System.out.println("OriginalGreedy = "+g.overageDiffusion(seed2, true)+", tempo: "+(System.nanoTime() - startTime)/1000); + + startTime =System.nanoTime(); + HashSet<Actor> seed1 = new GreedyIC(g).escolher(20); + System.out.println("GeneralGreedy = "+g.overageDiffusion(seed1, true)+", tempo: "+(System.nanoTime() - startTime)/1000); + +// g.activate(seed); +// g.visualize(); + } + +} diff --git a/src/algoritmos/GreedyLT.java b/src/algoritmos/GreedyLT.java new file mode 100644 index 0000000000000000000000000000000000000000..3c465781ea4877fb1a6efb25b4c6850632a4c917 --- /dev/null +++ b/src/algoritmos/GreedyLT.java @@ -0,0 +1,90 @@ +package algoritmos; + +import java.util.HashSet; + +import geradores.SocialNetworkGenerate; +import grafos.Actor; +import grafos.DirectedSocialNetwork; +import interfaces.SeedChooser; + +/** + * GeneralGreedy: algoritmo guloso proposto inicialmente + * por Kempe et. al. 2003 (extraido de outro artigo) + * @author Renato Melo +*/ +public class GreedyLT implements SeedChooser<Actor> { + private DirectedSocialNetwork grafo = null; + + public GreedyLT(DirectedSocialNetwork grafo) { + super(); + this.grafo = grafo; + } + + @Override + public HashSet<Actor> escolher(int k) { + HashSet<Actor> semente = new HashSet<>(); + + while (semente.size() < k) { + Actor max = MaxSpread(semente); + semente.add(max); + } + clearActive(); + return semente; + } + + private Actor MaxSpread(HashSet<Actor> semente) { + Actor max = null; + double spread = 0; + + for (Actor v : grafo.vertexSet()) { + if (!v.isActive()) { + + double media = cascata(v, semente); + + if (media > spread) { + spread = media; + max = v; + } + } + } + System.out.println("spread: " + spread); + return max; + } + + private double cascata(Actor v, HashSet<Actor> semente) { + HashSet<Actor> ativados = grafo.activate(semente); + grafo.activate(v); + ativados.add(v); + + return grafo.overageDiffusion(ativados, false); + } + + public void clearActive() { + for (Actor v : grafo.vertexSet()) { + v.setActive(false); + } + } + + public static void main(String[] args) { + DirectedSocialNetwork g; + g = new SocialNetworkGenerate().gerarGrafo(500, 2.8); + long startTime = 0; + + startTime = System.nanoTime(); + HashSet<Actor> seed2 = new OriginalGreedy(g).escolher(15); + System.out.println("OriginalGreedy = "+g.overageDiffusion(seed2, true)+", tempo: "+(System.nanoTime() - startTime)/1000); + + startTime =System.nanoTime(); + HashSet<Actor> seed1 = new GreedyIC(g).escolher(20); + System.out.println("GreedyIC = "+g.overageDiffusion(seed1, true)+", tempo: "+(System.nanoTime() - startTime)/1000); + startTime =System.nanoTime(); + + startTime =System.nanoTime(); + HashSet<Actor> seed = new GreedyIC(g).escolher(20); + System.out.println("GreedyLT = "+g.overageDiffusion(seed, false)+", tempo: "+(System.nanoTime() - startTime)/1000); + +// g.activate(seed); +// g.visualize(); + } + +}