""" Simulator for greedy boss scenario """ #http://www.codeskulptor.org/#user43_0qlLMcnaGRs6Bb7_1.py import simpleplot import math import codeskulptor codeskulptor.set_timeout(50) STANDARD = True LOGLOG = False # constants for simulation INITIAL_SALARY = 100 SALARY_INCREMENT = 100 INITIAL_BRIBE_COST = 1000 def greedy_boss(days_in_simulation, bribe_cost_increment, plot_type = STANDARD): """ Simulation of greedy boss """ # initialize necessary local variables current_day = 0 salary = 100 bribe = 100 bribe_cost = 1000 total_salary = 0 net_worth = 0 # define list consisting of days vs. total salary earned for analysis days_vs_earnings = [] # Each iteration of this while loop simulates one bribe while current_day <= days_in_simulation: # update list with days vs total salary earned days_vs_earnings.append((current_day, total_salary/(math.e**(0.095*current_day)))) # use plot_type to control whether regular or log/log plot # check whether we have enough money to bribe without waiting while net_worth >= bribe_cost: #print "Bribing boss with ", bribe_cost, " on day ", current_day net_worth -= bribe_cost #print "net worth: ", net_worth #print salary += 100 bribe_cost += bribe_cost_increment # advance current_day to day of next bribe (DO NOT INCREMENT BY ONE DAY) days_until_bribe = math.ceil(float(bribe_cost-net_worth)/salary) current_day += int(days_until_bribe) # update state of simulation to reflect bribe check = int(days_until_bribe) * salary net_worth += check total_salary += check #print "Jumping ", days_until_bribe, "days at salary ", salary, "Made ", check, " Net worth: ", net_worth, " Total Earned ", total_salary return days_vs_earnings def exponential(x1, x2, increment, a): """ returns a list of values for y = e^ax from x= x1 to x=x2 """ ans = [] x = x1 while x <= x2: ans.append((x, math.e**(a*x))) x+= increment return ans def polynomial(x1, x2, increment, a, b): ans = [] x = x1 while x <= x2: ans.append((x, a*x**b)) x+= increment return ans def run_simulations(): """ Run simulations for several possible bribe increments """ plot_type = STANDARD days = 50 inc_0 = greedy_boss(days, 0, plot_type) inc_500 = greedy_boss(days, 500, plot_type) inc_1000 = greedy_boss(days, 1000, plot_type) inc_2000 = greedy_boss(days, 2000, plot_type) exp_9_5 = exponential(0,50,1,9.5) exp__095 = exponential(0,50,1,0.095) poly_95_2 = polynomial(0,50,1,95,2) poly_9_5_4 = polynomial(0,50,1,9.5,4) simpleplot.plot_lines("Greedy boss", 600, 600, "days", "total earnings", [inc_0], False, ["Bribe increment = 0", "Bribe increment = 500", "Bribe increment = 1000", "Bribe increment = 2000"]) # simpleplot.plot_lines("Greedy boss vs exponentials", 600, 600, "x", "y", [inc_0, exp_9_5, exp__095], False,["Bribe increment = 0", # "Bribe increment = 500", "Bribe increment = 1000", "Bribe increment = 2000"]) run_simulations() #print greedy_boss(35, 100) # should print [(0, 0), (10, 1000), (16, 2200), (20, 3400), (23, 4600), (26, 6100), (29, 7900), (31, 9300), (33, 10900), (35, 12700)] #print greedy_boss(35, 0) # should print [(0, 0), (10, 1000), (15, 2000), (19, 3200), (21, 4000), (23, 5000), (25, 6200), (27, 7600), (28, 8400), (29, 9300), (30, 10300), (31, 11400), (32, 12600), (33, 13900), (34, 15300), (34, 15300), (35, 16900)] #print exponential(0,50,1,0.095)