/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.