In [1]:
# Task: Guess an integer between 0-X
# guessing the number v costs v
# after each guess we are told if the answer is bigger or smaller
# goal: minimize total cost of guess
In [12]:
import math
import pylab
In [20]:
max_val = 100
In [21]:
def CST_binary(target_val=50, max_val=100, ratio=0.5, verbose=False):
# simple binary search by ratio, returns the cost
if ratio > 1:
return None
floor = 0
ceil = max_val
if floor == ceil:
cur_guess = floor
else:
cur_guess = math.floor(float(ratio)*(ceil-floor))
cost = cur_guess
nb_guesses = 1
if verbose:
print floor, ceil, cur_guess, cost, nb_guesses
while cur_guess != target_val:
if cur_guess > target_val:
ceil = cur_guess-1
if cur_guess < target_val:
floor = cur_guess+1
if floor == ceil:
cur_guess = floor
else:
cur_guess = floor + math.floor(float(ratio)*(ceil-floor))
cost += cur_guess
nb_guesses +=1
if verbose:
print floor, ceil, cur_guess, cost, nb_guesses
if nb_guesses>max_val+1:
print target_val, ratio
return None
return cost
In [22]:
print CST_binary(target_val=99, max_val=100, ratio=0.1, verbose=True)
In [23]:
import matplotlib.pyplot as plt
%matplotlib inline
pylab.rcParams['figure.figsize'] = (20.0, 8.0) #adjust to your screen
In [28]:
# plot CST binary distribution
steps = 100
ratios = [x/float(steps) for x in range(steps+1)]
# print ratios
# CST_bin_dists = [[CST_binary(x, max_val, y) for x in range(max_val+1)] for y in ratios]
CST_bin_dists = {ratio: {x:CST_binary(x, max_val, ratio) for x in range(max_val+1)} for ratio in ratios}
# stats:
CST_bin_dists_averages = {ratio: sum(CST_bin_dists[ratio].values())/float(max_val) for ratio in ratios}
In [29]:
for ratio in ratios:
plt.plot(CST_bin_dists[ratio].keys(), CST_bin_dists[ratio].values(), label="ratio: "+ str(ratio))
plt.xlim(0,max_val)
if steps <= 10:
plt.legend()
plt.show()
In [30]:
plt.plot(sorted(CST_bin_dists_averages.keys()), [CST_bin_dists_averages[ratio] for ratio in sorted(CST_bin_dists_averages.keys())])
plt.xlim(-0.1,1.1)
plt.show()
In [31]:
# worst cases
CST_bin_worst = {ratio: max(CST_bin_dists[ratio].values()) for ratio in ratios}
plt.plot(sorted(CST_bin_worst.keys()), [CST_bin_worst[ratio] for ratio in sorted(CST_bin_worst.keys())])
plt.xlim(0,1)
plt.show()
In [ ]:
steps = 10
ratios = [x/float(steps) for x in range(steps+1)]
print ratios
In [ ]:
In [ ]: