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