Merge branch 'feature-adjustment-formula' into develop
This commit is contained in:
@ -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,12 +112,17 @@ 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 formula in ['original', 'best', 'sbest', 'pbest']:
|
||||||
|
self.temperature.useAdj(formula)
|
||||||
|
answers = {}
|
||||||
for i in range(iterations):
|
for i in range(iterations):
|
||||||
answer = self.runTrial()
|
answer = self.runTrial()
|
||||||
d = answers.setdefault(answer['answer'], {
|
d = answers.setdefault(answer['answer'], {
|
||||||
@ -128,6 +137,9 @@ 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']
|
||||||
|
print('The formula {} provided:'.format(formula))
|
||||||
|
pprint(answers)
|
||||||
|
|
||||||
return answers
|
return answers
|
||||||
|
|
||||||
def run_forever(self, initial, modified, target):
|
def run_forever(self, initial, modified, target):
|
||||||
|
|||||||
@ -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]
|
||||||
|
|||||||
@ -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
4
gui.py
@ -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)' % (
|
||||||
|
|||||||
Reference in New Issue
Block a user