._site

(Arne Babenhauserheide)
2012-07-25: initial working version with folding. tip

initial working version with folding.

diff --git a/sim.py b/sim.py
--- a/sim.py
+++ b/sim.py
@@ -19,14 +19,13 @@ def generateflat(nodes, connectionsperno
     """generate a randomly connected network with the given connectionspernode."""
     net = defaultdict(list)
     for node in nodes:
-        connections = []
         for n in range(connectionspernode - len(net[node])):
             conn = choice(nodes)
             while (conn == node or 
                    node in net[conn] or 
-                   net[conn][connectionspernode-1:]):
+                   net[conn][connectionspernode:]):
                 conn = choice(nodes)
-            connections.append(conn)
+            net[node].append(conn)
             net[conn].append(node)
     for node, conns in net.items():
         net[node] == sorted(conns)
@@ -52,17 +51,61 @@ def findroute(target, start, net):
     while not best == target:
         prev = best
         best = closest(target, net[prev])
-        # never repeat a route
+        # never repeat a route deterministically
         if best in seen:
             best = choice(net[prev])
         route.append(best)
         seen.add(best)
     return route
 
+def checkfold(target, prev, net, probability=0.07):
+    """switch to the target location with some probability"""
+    if random() > probability:
+        return
+    # do not switch to exactly the target to avoid duplicate entries
+    # (implementation detail)
+    while target in net:
+        target = (target + (random()-0.5)*1.e-9) % 1
+    conns = net[prev]
+    # never switch with a neighbour
+    if target in conns:
+        return
+    net[target] = conns
+    del net[prev]
+    for conn in conns:
+        net[conn].remove(prev)
+        net[conn] = sorted(net[conn] + [target])
+
+def fold(net, num=10):
+    """do num path foldings."""
+    for i in range(num):
+        nodes = list(net.keys())
+        start = choice(nodes)
+        target = choice(nodes)
+        while target == start:
+            target = choice(nodes)
+            
+        route = findroute(target, start, net)
+        for prev in route:
+            checkfold(target, prev, net)
+
+def linklengths(net):
+    """calculate the lengthsof all links"""
+    lengths = []
+    for node, targets in net.items():
+        for t in targets:
+            lengths.append(abs(t-node))
+    return lengths
+
 if __name__ == "__main__":
+    import numpy as np
     nodes = randomnodes()
     net = generateflat(nodes)
-    start = choice(nodes)
-    target = choice(nodes)
-    route = findroute(target, start, net)
-    print (route)
+    print (np.mean(linklengths(net)))
+    fold(net)
+    print (np.mean(linklengths(net)))
+    fold(net)
+    print (np.mean(linklengths(net)))
+    fold(net)
+    print (np.mean(linklengths(net)))
+