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)))