From 57952d817ae7fcd16af728d9f9eede5a263f268a Mon Sep 17 00:00:00 2001 From: senft-desktop Date: Fri, 30 Nov 2012 15:13:24 +0100 Subject: [PATCH] Added another (static) random generator and a class that dumps a graph (in dot-format) to a file --- .../P2P/uebungen/4/src/RandomGenerator2.java | 99 +++++++++++++++++++ .../4/src/analysis/NetworkDumper.java | 83 ++++++++++++++++ 2 files changed, 182 insertions(+) create mode 100644 ws2012/P2P/uebungen/4/src/RandomGenerator2.java create mode 100644 ws2012/P2P/uebungen/4/src/analysis/NetworkDumper.java diff --git a/ws2012/P2P/uebungen/4/src/RandomGenerator2.java b/ws2012/P2P/uebungen/4/src/RandomGenerator2.java new file mode 100644 index 00000000..5cf038f0 --- /dev/null +++ b/ws2012/P2P/uebungen/4/src/RandomGenerator2.java @@ -0,0 +1,99 @@ + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.logging.LogManager; + +import analysis.NetworkDumper; + +import node.Node; + +public class RandomGenerator2 { + + private int ROUNDS = 100; + + public static double BIRTH_RATE = 0.80; + + public static List nodes = new ArrayList(); + public static Random gen = new Random(); + + private int maxNodes = 0; + private int numSpawned = 0; + private int numKilled = 0; + + private Node firstNode; + + public RandomGenerator2() { + firstNode = new Node(); + nodes.add(firstNode); + new NetworkDumper(firstNode); + + for (int i = 0; i < ROUNDS - 1; i++) { + + if (gen.nextDouble() > 1 - BIRTH_RATE) { + spawn(); + } else { + kill(); + } + + try { + Thread.sleep(10); + } catch (InterruptedException e) { + } + } + + System.out.println("Executed " + ROUNDS + + " rounds (with a spawn rate of " + BIRTH_RATE + "). " + + numSpawned + " nodes were spawned, " + numKilled + + " nodes were killed. Currently " + "there are " + + nodes.size() + " nodes remaining. At one point we had" + + " a maximum of " + maxNodes + " nodes."); + } + + private void spawn() { + try { + if (nodes.isEmpty()) { + nodes.add(new Node()); + } else { + Node randomNode = getRandomNode(); + Node newNode = randomNode.spawn(); + nodes.add(newNode); + } + numSpawned++; + if (maxNodes < nodes.size()) { + maxNodes = nodes.size(); + } + } catch (IOException e) { + } + } + + private void kill() { + if (nodes.isEmpty()) + return; + Node randomNode; + while ((randomNode = getRandomNode()) == firstNode) { + // Dont kill first node + } + randomNode.leave(); + numKilled++; + } + + private Node getRandomNode() { + return nodes.get(gen.nextInt(nodes.size())); + } + + public static void main(String args[]) { + System.setProperty("java.util.logging.config.file", + "logging.properties"); + + try { + LogManager.getLogManager().readConfiguration(); + } catch (Exception e) { + e.printStackTrace(); + } + + new RandomGenerator2(); + } + +} diff --git a/ws2012/P2P/uebungen/4/src/analysis/NetworkDumper.java b/ws2012/P2P/uebungen/4/src/analysis/NetworkDumper.java new file mode 100644 index 00000000..573c926c --- /dev/null +++ b/ws2012/P2P/uebungen/4/src/analysis/NetworkDumper.java @@ -0,0 +1,83 @@ +package analysis; + +import java.io.BufferedWriter; +import java.io.FileWriter; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import node.Node; + +public class NetworkDumper implements Runnable { + + Node node = null; + private boolean running = true; + + public NetworkDumper(Node n) { + this.node = n; + + new Thread(this).start(); + } + + public String networkToDot(Map> network) { + StringBuilder result = new StringBuilder(512); + result.append("graph g{\n"); + + Set alreadyIn = new HashSet(); + + for (Map.Entry> entry : network.entrySet()) { + + for (String s : entry.getValue()) { + String nodeA = getName(entry.getKey()); + String nodeB = getName(s); + + if (!alreadyIn.contains(nodeB + nodeA)) { + + result.append("\t"); + result.append(nodeA).append(" -- ").append(nodeB); + result.append(";\n"); + + alreadyIn.add(nodeA + nodeB); + } + } + } + result.append("}\n"); + return result.toString(); + } + + private String getName(String s) { + return s.split(":")[1]; + } + + private void write(String s) { + try { + // Create file + FileWriter fstream = new FileWriter("graph.dot"); + BufferedWriter out = new BufferedWriter(fstream); + out.write(s); + // Close the output stream + out.close(); + } catch (Exception e) {// Catch exception if any + System.err.println("Error: " + e.getMessage()); + } + } + + @Override + public void run() { + while (running) { + try { + node.gatherInformationOfNetwork(); + + // Wait 1s to broadcast to network + Thread.sleep(1000); + + write(networkToDot(node.getNetwork())); + + // Wait 10s for update + Thread.sleep(10000); + } catch (InterruptedException e) { + } + } + } +}