Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- """
- 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)
Advertisement
Add Comment
Please, Sign In to add comment