/timm's /charming /python /tricks
Download
search.py.
Read more on How to be Charming (in Python).
001: import sys
002: sys.dont_write_bytecode=True # no .pyc files
003: from models import *
004: from do import *
005:
006: def saSchaffer():
007: sa(model=Schaffer,p=1,kmax=100)
008: def saKursawe():
009: "Controller for sa for Kursawe."
010: sa(model=Kursawe,p=0.33,kmax=1000)
011: def saKursaweSlow():
012: "Controller for sa for Kursawe."
013: sa(model=Kursawe,p=0.1,kmax=1000)
014:
015: def sa(model=Kursawe, p=The.sa.p, kmax=The.sa.kmax,
016: epsilon=The.sa.epsilon, seed=The.math.seed,
017: runs=The.sa.runs,
018: stagger=The.sa.stagger,era=The.sa.era):
019: "Simulated annealing."
020: def baseline():
021: for _ in range(100): m.any()
022: def maybe(old,new,t):
023: return math.e**((old - new)*1.0/max(1,t)) < rand()
024: def neighbor(lst):
025: for h in m.t.nums:
026: if rand() < p:
027: lst[h.pos] = any(h.lo,h.hi)
028: if m.valid(lst):
029: return m.seen(lst)
030: else:
031: return lst
032: #--------------------
033:
034: resetSeed(seed)
035: for run,outer in do(range(runs)):
036: say('.')
037: m = model()
038: baseline()
039: sb = s = m.any()
040: eb = e = fromhell(s, m.t)
041: for k,inner in do(range(kmax),
042: epsilon,"best",era,also=outer):
043: sn = neighbor(s[:])
044: en = fromhell(sn,m.t)
045: if en > eb:
046: sb,eb = sn,en
047: if en > e:
048: s,e = sn,en
049: elif maybe(e, en, k*1.0/kmax**stagger) :
050: s,e = sn,en
051: inner.seen(k, best=eb, every=e)
052: done(outer, 0,1,
053: key = lambda z: '%2d' % z,
054: value = lambda z: '%4.2f' % z)
055:
056: def bias(model=Kursawe,
057: seed = The.math.seed,
058: bins = The.issamp.bins,
059: era = The.issamp.era):
060: def num2bin(n,about):
061: return int((n - about.lo)*1.0/about.div)
062: def range2num(r):
063: return any(r[0], r[1])
064: def theDivs(model):
065: tmp = model()
066: for _ in range(era): tmp.any()
067: out = {}
068: for h in tmp.t.nums:
069: div = (h.hi - h.lo)*1.0/bins
070: breaks = {}
071: for bin in range(bins):
072: lo = h.lo + bin*div
073: breaks[bin] = (lo, lo+div)
074: out[h.pos] = Thing(div=div,lo=h.lo,
075: hi=h.hi,breaks=breaks)
076: return out
077: #--------------------
078: #resetSeed(seed)
079: divs = theDivs(model)
080: m = model()
081: bias = {}
082: for _ in range(era):
083: m.any()
084: old = m.t.rows[-1]
085: s = old.score()
086: for h in m.t.nums:
087: pos = h.pos
088: n = old.cells[pos]
089: bin = num2bin(n,divs[pos])
090: key = (pos,bin)
091: bias[key] = bias.get(key,0) + s
092: ordered = []
093: for k in bias:
094: ordered += [(bias[k],k)]
095: ordered = sorted(ordered,reverse=True)
096: for score,(pos,bin) in ordered[:5]:
097: print "best",score,':pos',pos,':bin',bin
098: for score,(pos,bin) in ordered[-5:]:
099: print "worst",score,':pos',pos,':bin',bin
100: plot2d([x for x in range(len(ordered))],
101: [x[0] for x in ordered],
102: xlabel="bins",
103: ylabel="scores",
104: title=m.name(),
105: file="/home/timm/tmp/%s.png" % m.name())
106:
107: @demo2
108: def scored():
109: "show some scorings"
110: resetSeed(1)
111: m = Kursawe()
112: for _ in range(30): m.any()
113: out=[]
114: for _ in range(20):
115: s = m.any()
116: e = fromhell(s,m.t)
117: out += [(e,gs(s))]
118: for one in sorted(out): print one
119:
120: if __name__ == '__main__' :
121: eval(cmd('copyleft()'))
122:
This file is part of Timm's charming Python tricks.
© 2014, Tim Menzies:
tim.menzies@gmail.com,
http://menzies.us.
Timm's charming Python tricks are free software: you can redistribute it and/or modify it under the terms of the GNU Lesser Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
Timm's charming Python tricks are distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU Lesser Public License along with Foobar. If not, see http://www.gnu.org/licenses.