/timm's /charming /python /tricks

search.py

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.