._site

(Arne Babenhauserheide)
2012-07-25: It runs through, now - and optimizes most of the time. But it can tip

It runs through, now - and optimizes most of the time. But it can get stuck.

diff --git a/sim.py b/sim.py
--- a/sim.py
+++ b/sim.py
@@ -5,7 +5,7 @@
 from random import random, choice
 import numpy as np
 
-def randomnodes(num=800):
+def randomnodes(num=8000):
     """Generate num nodes with locations between 0 and 1."""
     nodes = set()
     for n in range(num):
@@ -62,7 +62,11 @@ def findroute(target, start, net):
         best = closest(target, net[prev])
         # never repeat a route deterministically
         if best in seen:
-            best = choice(net[prev])
+            possible = [node for node in net[prev] if not node in seen]
+            if not possible:
+                print ("all routes already taken from", start, "to", target, "over", prev)
+                return [] # can’t reach the target from here: all routes already taken
+            best = choice(possible)
         route.append(best)
         seen.add(best)
     return route
@@ -81,10 +85,10 @@ def dofold(target, prev, net):
     realtarget = target
     while realtarget in net or realtarget == prev:
         realtarget = (realtarget + (random()-0.5)*1.e-9) % 1
-    conns = net[prev]
-    net[realtarget] = conns
+    connections = net[prev]
+    net[realtarget] = connections
     del net[prev]
-    for conn in conns:
+    for conn in connections:
         net[conn] = sorted([c for c in net[conn] if not c == prev] + [realtarget])
 
 def checkfold(target, prev, net, probability=0.7):
@@ -103,8 +107,13 @@ def fold(net, num=10):
             target = choice(nodes)
             
         route = findroute(target, start, net)
-        for prev in route[:-1]:
-            pnet = net[prev]
+        # fold all on the route except for the start and the endpoint
+        for prev in route[1:-1]:
+            try:
+                pnet = net[prev]
+            except KeyError:
+                idx = route.index(prev)
+                print (route[idx:], prev, target, idx, prev in route[:idx])
             checkfold(target, prev, net)
             
 
@@ -121,6 +130,6 @@ if __name__ == "__main__":
     nodes = randomnodes()
     net = generateflat(nodes)
     print (np.mean(linklengths(net)))
-    for i in range(1000):
-        fold(net)
+    for i in range(100):
+        fold(net, 10)
         print (np.mean(linklengths(net)))