Merge branch 'feature-adjustment-formula' into develop

This commit is contained in:
LSaldyt
2017-11-01 11:09:42 -07:00
4 changed files with 54 additions and 15 deletions

View File

@ -5,6 +5,9 @@ from .temperature import Temperature
from .workspace import Workspace from .workspace import Workspace
from .gui import GUI from .gui import GUI
from pprint import pprint
class Reporter(object): class Reporter(object):
"""Do-nothing base class for defining new reporter types""" """Do-nothing base class for defining new reporter types"""
def report_answer(self, answer): def report_answer(self, answer):
@ -88,6 +91,7 @@ class Copycat(object):
self.gui.update(self) self.gui.update(self)
self.gui.refresh() self.gui.refresh()
answers = {} answers = {}
self.temperature.useAdj('pbest')
while True: while True:
if self.check_reset(): if self.check_reset():
answers = {} answers = {}
@ -108,26 +112,34 @@ class Copycat(object):
for answer, d in answers.items(): for answer, d in answers.items():
d['avgtemp'] = d.pop('sumtemp') / d['count'] d['avgtemp'] = d.pop('sumtemp') / d['count']
d['avgtime'] = d.pop('sumtime') / d['count'] d['avgtime'] = d.pop('sumtime') / d['count']
pprint(answers)
return answers
def run(self, initial, modified, target, iterations): def run(self, initial, modified, target, iterations):
self.temperature.useAdj('best') self.temperature.useAdj('best')
self.gui.app.reset_with_strings(initial, modified, target) self.gui.app.reset_with_strings(initial, modified, target)
self.workspace.resetWithStrings(initial, modified, target) self.workspace.resetWithStrings(initial, modified, target)
answers = {} answers = {}
for i in range(iterations): for formula in ['original', 'best', 'sbest', 'pbest']:
answer = self.runTrial() self.temperature.useAdj(formula)
d = answers.setdefault(answer['answer'], { answers = {}
'count': 0, for i in range(iterations):
'sumtemp': 0, # TODO: use entropy answer = self.runTrial()
'sumtime': 0 d = answers.setdefault(answer['answer'], {
}) 'count': 0,
d['count'] += 1 'sumtemp': 0, # TODO: use entropy
d['sumtemp'] += answer['temp'] # TODO: use entropy 'sumtime': 0
d['sumtime'] += answer['time'] })
d['count'] += 1
d['sumtemp'] += answer['temp'] # TODO: use entropy
d['sumtime'] += answer['time']
for answer, d in answers.items():
d['avgtemp'] = d.pop('sumtemp') / d['count']
d['avgtime'] = d.pop('sumtime') / d['count']
print('The formula {} provided:'.format(formula))
pprint(answers)
for answer, d in answers.items():
d['avgtemp'] = d.pop('sumtemp') / d['count']
d['avgtime'] = d.pop('sumtime') / d['count']
return answers return answers
def run_forever(self, initial, modified, target): def run_forever(self, initial, modified, target):

View File

@ -2,6 +2,8 @@ import matplotlib.pyplot as plt; plt.rcdefaults()
import numpy as np import numpy as np
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
plt.style.use('dark_background')
def plot_imbedded(answers, status): def plot_imbedded(answers, status):
answers = sorted(answers.items(), key=lambda kv : kv[1]['count']) answers = sorted(answers.items(), key=lambda kv : kv[1]['count'])
objects = [t[0] for t in answers] objects = [t[0] for t in answers]

View File

@ -24,7 +24,7 @@ def _entropy(temp, prob):
f = (c + 1) * prob f = (c + 1) * prob
return -f * math.log2(f) return -f * math.log2(f)
def _weighted(temp, prob, s, u): def _weighted(temp, prob, s, u, alpha=1, beta=1):
weighted = (temp / 100) * s + ((100 - temp) / 100) * u weighted = (temp / 100) * s + ((100 - temp) / 100) * u
return weighted return weighted
@ -56,12 +56,31 @@ def _averaged_alt(temp, prob):
u = prob ** 2 if prob < .5 else math.sqrt(prob) u = prob ** 2 if prob < .5 else math.sqrt(prob)
return _weighted(temp, prob, s, u) return _weighted(temp, prob, s, u)
def _working_best(temp, prob): def _working_best(temp, prob):
s = .5 # convergence
r = 2 # power
u = prob ** r if prob < .5 else prob ** (1/r)
return _weighted(temp, prob, s, u)
def _soft_best(temp, prob):
s = .5 # convergence s = .5 # convergence
r = 1.05 # power r = 1.05 # power
u = prob ** r if prob < .5 else prob ** (1/r) u = prob ** r if prob < .5 else prob ** (1/r)
return _weighted(temp, prob, s, u) return _weighted(temp, prob, s, u)
def _parameterized_best(temp, prob):
# (D$66/100)*($E$64*$B68 + $G$64*$F$64)/($E$64 + $G$64)+((100-D$66)/100)*IF($B68 > 0.5, $B68^(1/$H$64), $B68^$H$64)
# (T/100) * (alpha * p + beta * .5) / (alpha + beta) + ((100 - T)/100) * IF(p > .5, p^(1/2), p^2)
alpha = 5
beta = 1
s = .5
s = (alpha * prob + beta * s) / (alpha + beta)
r = 1.05
u = prob ** r if prob < .5 else prob ** (1/r)
return _weighted(temp, prob, s, u)
class Temperature(object): class Temperature(object):
def __init__(self): def __init__(self):
self.reset() self.reset()
@ -75,7 +94,9 @@ class Temperature(object):
'weighted_soft' : _weighted_soft_curve, 'weighted_soft' : _weighted_soft_curve,
'alt_fifty' : _alt_fifty, 'alt_fifty' : _alt_fifty,
'average_alt' : _averaged_alt, 'average_alt' : _averaged_alt,
'best' : _working_best} 'best' : _working_best,
'sbest' : _soft_best,
'pbest' : _parameterized_best}
def reset(self): def reset(self):
self.actual_value = 100.0 self.actual_value = 100.0

4
gui.py
View File

@ -4,6 +4,10 @@ import logging
from copycat import Copycat, Reporter from copycat import Copycat, Reporter
import matplotlib.pyplot as plt
plt.style.use('dark_background')
class SimpleReporter(Reporter): class SimpleReporter(Reporter):
def report_answer(self, answer): def report_answer(self, answer):
print('Answered %s (time %d, final temperature %.1f)' % ( print('Answered %s (time %d, final temperature %.1f)' % (