# sellers = removeSeconds(sellers, reduce_number) # mediators = removeSeconds(mediators, reduce_number) # mediatorsB = removeSeconds(mediatorsB, reduce_number) # # random.shuffle(buyers) # random.shuffle(sellers) # random.shuffle(mediators) # random.shuffle(mediatorsB) market = Market([ AgentCategory("buyer", buyers), AgentCategory("seller", sellers), AgentCategory("mediator", mediators), AgentCategory("mediatorB", mediatorsB), ]) without_gft0 = budget_balanced_trade_reduction(market, recipe, False) with_gft0 = budget_balanced_trade_reduction(market, recipe, True) print(without_gft0) print(with_gft0) without_count = without_gft0.num_of_deals() with_count = with_gft0.num_of_deals() without_gft = without_gft0.gain_from_trade() with_gft = with_gft0.gain_from_trade() print('Compare: Without:', without_gft, "With:", with_gft) print('Compare: Without:', without_count, "With:", with_count) break # print(" buyers =", buyers) # print(" sellers =", sellers) # print(" mediators =", mediators)
def experiment(results_csv_file: str, recipes: tuple, value_ranges: list, nums_of_agents: list, num_of_iterations: int): """ Run an experiment similar to McAfee (1992) experiment on the given auction. :param recipes: list of recipes. :param nums_of_agents: a list of the numbers of agents with which to run the experiment. :param value_ranges: for each category, a pair (min_value,max_value). The value for each agent in this category is selected uniformly at random between min_value and max_value. :param num_of_iterations: how many times to repeat the experiment for each num of agents. """ results_table = TeeTable(TABLE_COLUMNS, results_csv_file) for recipe in recipes: recipe_str = ":".join(map(str, recipe)) num_of_categories = len(recipe) external_wins_gft = tie_gft = ascending_wins_gft = 0 external_wins_k = tie_k = ascending_wins_k = 0 for num_of_agents_per_category in nums_of_agents: external_sum_auction_count = ascending_sum_auction_count = 0 # count the number of deals done the ascending auction. external_sum_auction_gft = ascending_sum_auction_gft = 0 agents_recipe_values = [sum(recipe) - recipe[0]] + [ recipe[0] for _ in range(1, len(recipe)) ] for _ in range(num_of_iterations): market = Market([ AgentCategory.uniformly_random( "agent", num_of_agents_per_category * recipe[category], value_ranges[category][0] * agents_recipe_values[category], value_ranges[category][1] * agents_recipe_values[category]) for category in range(num_of_categories) ]) (optimal_trade, _) = market.optimal_trade(recipe) external_auction_trade = budget_balanced_trade_reduction( market, recipe) ascending_auction_trade = budget_balanced_ascending_auction( market, recipe) external_sum_auction_count += external_auction_trade.num_of_deals( ) ascending_sum_auction_count += ascending_auction_trade.num_of_deals( ) external_sum_auction_gft += external_auction_trade.gain_from_trade( ) ascending_sum_auction_gft += ascending_auction_trade.gain_from_trade( ) if external_sum_auction_count > ascending_sum_auction_count: external_wins_k += 1 elif external_sum_auction_count == ascending_sum_auction_count: tie_k += 1 else: ascending_wins_k += 1 if external_sum_auction_gft > ascending_sum_auction_gft: external_wins_gft += 1 elif external_sum_auction_gft == ascending_sum_auction_gft: tie_gft += 1 else: ascending_wins_gft += 1 num_agents = len(nums_of_agents) results_table.add( OrderedDict(( ("recipe", recipe), ("external_wins_gft", int(external_wins_gft * 100 / num_agents)), ("tie_gft", int(tie_gft * 100 / num_agents)), ("ascending_wins_gft", int(ascending_wins_gft * 100 / num_agents)), ("external_wins_k", int(external_wins_k * 100 / num_agents)), ("tie_k", int(tie_k * 100 / num_agents)), ("ascending_wins_k", int(ascending_wins_k * 100 / num_agents)), ("external_wins", external_wins_gft), ("tie", tie_gft), ("ascending_wins", ascending_wins_gft), ))) results_table.done()
print( "\n\n###### RUNNING EXAMPLE FROM THE PAPER FOR TYPE (1,1,1): buyers-sellers-mediators" ) buyers = [17, 14, 13, 9, 6] sellers = [-1, -4, -5, -8, -11] mediators = [-1, -3, -4, -7, -10] recipe = [1, 1, 1] market = Market([ AgentCategory("buyer", buyers), AgentCategory("seller", sellers), AgentCategory("mediator", mediators), ]) print(budget_balanced_trade_reduction(market, recipe)) print("\n\n###### SAME EXAMPLE WITH DIFFERENT ORDER: buyers-mediators-sellers") market = Market([ AgentCategory("buyer", buyers), AgentCategory("mediator", mediators), AgentCategory("seller", sellers), ]) print(budget_balanced_trade_reduction(market, recipe)) print("\n\n###### SAME EXAMPLE WITH DIFFERENT ORDER: sellers-buyers-mediators") market = Market([ AgentCategory("seller", sellers), AgentCategory("buyer", buyers), AgentCategory("mediator", mediators), ])
print("\n\n###### RUNNING mcafee_trade_reduction") market = Market([ AgentCategory("buyer", [1, 1, 1]), AgentCategory("seller", [-1, -1, -0.5]), ]) print(mcafee_trade_reduction(market, [1, 1])) print("\n\n###### RUNNING budget_balanced_trade_reduction") market = Market([ AgentCategory("buyer", [1, 1, 1]), AgentCategory("seller", [-1, -1, -0.5]), ]) print(budget_balanced_trade_reduction(market, [1, 1], True)) print("\n\n###### RUNNING EXPERIMENT FOR DEMO OF TYPE (1,1)") ascending_auction_protocol.logger.setLevel(logging.ERROR) prices.logger.setLevel(logging.ERROR) results_file = "results/ascending_auction_demo_11.csv" SBB_ASCENDING_STOCKS = "SBB Ascending Prices" experiment(results_file, mcafee_trade_reduction, "McAfee Stock", (1, 1), value_ranges=[(1, 2), (-1, -2)], nums_of_agents=(50, 50), num_of_iterations=1)