Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Little eBay auction simulation using simpy.
"""
Simulate listing items on ebay
"""
import simpy, random, math
NUMBER_OF_ITEMS = 3000 # Number of items available to be acutioned
AUCTION_DURATION = 7 * 24 * 60 # One week of minutes
SIM_TIME = AUCTION_DURATION * 3 # Number of auction durations to run the sim
REVENUE = 0 # Running count of revenue
env = simpy.Environment()
items = simpy.Resource(env, NUMBER_OF_ITEMS)
MEDIAN_TIME_TO_LIST = 20
def list(env):
for i in range(1, NUMBER_OF_ITEMS + 1):
with items.request() as item:
timeToCreateListing = int(math.floor(random.lognormvariate(0.2, 0.5) * 10))
print("Current time: %s: Listing item %d taking %d minutes to list." % (format_time(env.now), i, timeToCreateListing))
yield env.timeout(timeToCreateListing)
env.process(sell(env, i))
def sell(env, item):
global REVENUE
price = math.floor(random.lognormvariate(2, 0.5)) * 10
yield env.timeout(env.now + AUCTION_DURATION)
REVENUE+=price
print("Current time: %s: Item %d sold for $%d" % (format_time(env.now), item, price))
print("Current time: %s: Total revenue = $%d" % (format_time(env.now), REVENUE))
## Helper functions
def minToDays(m):
return math.floor(m / (60 * 24))
## These functions have confusing names. They return the current hour
## or minute of the day, independent of the day..
def minToHours(m):
return math.floor(m / 60) % 24
def minToMin(m):
return m % 60
def format_time(m):
return "Day %d %02d:%02d" % (minToDays(env.now), minToHours(env.now), minToMin(env.now))
## Begin simulation
def main(n, d, t):
"""Run simulation with n items for d durtation per auction, for t
total time.
"""
print("\nSimulation starting:\n")
env.process(list(env))
env.run(until=t)
main(NUMBER_OF_ITEMS, AUCTION_DURATION, SIM_TIME)
## Tests
assert minToDays(1440) == 1
assert minToHours(1500) == 1
assert minToMin(1501) == 1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.