one script to rule them all

This commit is contained in:
Johann Dreo 2014-03-20 23:31:21 +01:00
commit c4dd110d23

93
run_all.py Executable file
View file

@ -0,0 +1,93 @@
#!/usr/bin/env python
import sys
import turtle
import lindenmayer
import graph
import ant_colony
import path
import uberplot
import matplotlib.pyplot as plot
depth = 1
if len(sys.argv) > 1:
depth = int( sys.argv[1] )
print "depth",depth
print "Draw the penrose tesselation"
segment_size = 10
float_rounding = 10
ttl = turtle.Turtle()
ttl.speed('fastest')
penrose = lindenmayer.DumpTurtleLSystem(ttl,
axiom="[X]++[X]++[X]++[X]++[X]",
rules={
'F': "",
'W': "YF++ZF----XF[-YF----WF]++",
'X': "+YF--ZF[---WF--XF]+",
'Y': "-WF++XF[+++YF++ZF]-",
'Z': "--YF++++WF[+ZF++++XF]--XF"
},
angle=36, heading=0, size=segment_size, rounding=float_rounding )
# actually do something
penrose.draw( depth )
print "segments",len(penrose.segments)
with open("penrose_%i.segments" % depth, "w") as fd:
fd.write( str(penrose) )
print "Convert the segment list into an adjacency list graph"
G = graph.graph( penrose.segments )
print "Solve the TSP with an Ant Colony Algorithm"
max_it = 10
num_ants = 10 #* depth
decay = 0.1
w_heur = 2.5
w_local_phero = 0.1
c_greed = 0.9
w_history = 1.0
best,phero = ant_colony.search( G, max_it, num_ants, decay, w_heur, w_local_phero, w_history, c_greed, cost_func = ant_colony.graph_distance )
print "Transform the resulting nodes permutation into a path on the graph"
# by finding the shortest path between two cities.
traj = []
for start,end in ant_colony.tour(best["permutation"]):
p,c = path.astar( G, start, end )
traj += p
print "traj",len(traj)
print "Plot the resulting tour"
fig = plot.figure()
ax = fig.add_subplot(111)
maxph=0
for i in phero:
maxph = max( maxph, max(phero[i].values()))
# ant colony
# pheromones
for i in phero:
for j in phero[i]:
if i == j:
continue
nph = phero[i][j]/maxph
seg = [(i,j)]
# print nph,seg
uberplot.plot_segments( ax, seg, edgecolor="red", alpha=0.03*nph, linewidth=7*nph )
# uberplot.scatter_segments( ax, seg, color="red", alpha=0.5, linewidth=nph )
# tour
uberplot.plot_segments( ax, ant_colony.tour(traj), color="green", alpha=0.9, linewidth=4 )
# tesselation
uberplot.plot_segments( ax, penrose.segments, edgecolor="black", alpha=0.9, linewidth=1 )
uberplot.scatter_segments( ax, penrose.segments, color="black", alpha=0.9, linewidth=1 )
plot.show()