Author: vive
Date: 2007-06-15 23:30:08 +0000 (Fri, 15 Jun 2007)
New Revision: 13620

Added:
   trunk/apps/load-balancing-sims/phase7/sim/SimpleGraph.java
Log:
Generating Kleinberg small-worlds with SimpleNodes


Added: trunk/apps/load-balancing-sims/phase7/sim/SimpleGraph.java
===================================================================
--- trunk/apps/load-balancing-sims/phase7/sim/SimpleGraph.java                  
        (rev 0)
+++ trunk/apps/load-balancing-sims/phase7/sim/SimpleGraph.java  2007-06-15 
23:30:08 UTC (rev 13620)
@@ -0,0 +1,97 @@
+/*
+ * Graph of SimpleNodes 
+ */
+
+package sim;
+
+import java.util.Random;
+
+class SimpleGraph {
+
+    SimpleNode[] nodes;
+    private Random rand;
+
+    public SimpleGraph(int n) {
+       nodes = new SimpleNode[n];
+       for (int i=0; i<n; i++) {
+           nodes[i] = new SimpleNode((double)i/n);
+       }
+       rand = new Random((int) (System.currentTimeMillis() % 10000));
+    }
+
+    /*
+     * Generating a Kleinberg small-world graph with shortcuts proportional to 
1/d
+     *
+     * @avgdeg: average degree of nodes
+     * @directed: if to have directed edges
+     * @local: if to have local edges (to nearest-neighbors in the lattice)
+     */
+
+    public void CreateKleinbergGraph(double avgdeg, boolean directed, boolean 
local) {
+
+       double degree;
+       if(directed) {
+           degree = avgdeg;
+       } else {
+           degree = avgdeg/2;
+       }
+
+       if(local) {
+           for(int i=0; i<nodes.length; i++) {
+               SimpleNode src = nodes[i];
+               SimpleNode dst = nodes[(i+1)%nodes.length];
+               src.connect(dst);
+               dst.connect(src);
+           }
+       }
+
+       for(int i=0; i<nodes.length; i++) {
+           SimpleNode src = nodes[i];
+
+           for(int j=0; j<degree; j++) {
+
+               boolean found = false;
+               while(!found) {
+
+                   // assuming nodes are equally spaced out in [0,1] we can 
use integers as offsets
+                   // fixme: option for sampling directly in [0,1]
+                   double r = rand.nextFloat();
+                    int d = (int) Math.floor (Math.exp (r*Math.log 
(nodes.length/2.0)));
+                   int destpos;
+
+                   if (rand.nextFloat()<0.5) {
+                       destpos = i - d;
+                   } else {
+                       destpos = i + d;
+                   }
+
+                   if (destpos>=nodes.length) {
+                       destpos = destpos - nodes.length;
+                   } else if (destpos<0) {
+                       destpos = destpos + nodes.length;
+                   }
+
+                   SimpleNode dst = nodes[destpos];
+
+                   if (directed) {
+                       if (!src.hasNeighbor(dst)) {
+                           found = true;
+                           src.connect(dst);
+                       }
+                   } else {
+                       if (!src.hasNeighbor(dst) && !dst.hasNeighbor(src)) {
+                           found = true;
+                           src.connect(dst);
+                           dst.connect(src);
+                       }
+                   }
+                   
+                   
+               }
+           }
+
+       }
+    }
+
+
+}


Reply via email to