Create ReadMe.md
This commit is contained in:
275
Vickrey Clark Grove Auction/ReadMe.md
Normal file
275
Vickrey Clark Grove Auction/ReadMe.md
Normal file
@@ -0,0 +1,275 @@
|
||||
# How To Run
|
||||
1. Install dotnet3.0 on your machine.
|
||||
1. Navigate inside the release folder and launch a command/terminal window. Enter the following command
|
||||
```dotnet '.\Vickery Clark Grove Auction.dll'```
|
||||
|
||||
# What I have learned
|
||||
|
||||
I have a much better understanding of the VCG auction. Figuring out a concise reusable algorithm to calculate the total price per bidder was very enlightning.
|
||||
|
||||
# Interesting Simulations
|
||||
|
||||
1. Given parameters in assignment.
|
||||
|
||||
```Please input the auctions parameters in the form <number of bidders> <number of advertising slots>:
|
||||
5 3
|
||||
|
||||
Enter number of clicks for each Ad placement 0 being the top:
|
||||
Ad Placement 0:
|
||||
500
|
||||
Ad Placement 1:
|
||||
300
|
||||
Ad Placement 2:
|
||||
100
|
||||
|
||||
Enter bids for each bidder:
|
||||
A0's bid amount:
|
||||
.5
|
||||
A1's bid amount:
|
||||
.4
|
||||
A2's bid amount:
|
||||
.3
|
||||
A3's bid amount:
|
||||
.2
|
||||
A4's bid amount:
|
||||
.1
|
||||
|
||||
A0 pays: $160.00
|
||||
A1 pays: $80.00
|
||||
A2 pays: $20.00
|
||||
A3 pays: $0.00
|
||||
A4 pays: $0.00
|
||||
```
|
||||
|
||||
2. Interesting because 2 bidders have the same bid.
|
||||
|
||||
```
|
||||
Please input the auctions parameters in the form <number of bidders> <number of advertising slots>:
|
||||
3 1
|
||||
|
||||
Enter number of clicks for each Ad placement 0 being the top:
|
||||
Ad Placement 0:
|
||||
150
|
||||
|
||||
Enter bids for each bidder:
|
||||
A0's bid amount:
|
||||
200
|
||||
A1's bid amount:
|
||||
1
|
||||
A2's bid amount:
|
||||
200
|
||||
|
||||
A2 pays: $30,000.00
|
||||
A0 pays: $0.00
|
||||
A1 pays: $0.00
|
||||
```
|
||||
|
||||
3. This one is interesting as the third bidder gets it for free. This could be beneficial if you were bidding as two seperate entities.
|
||||
You could bid the same price multiple times and get free ad space.
|
||||
|
||||
```
|
||||
Please input the auctions parameters in the form <number of bidders> <number of advertising slots>:
|
||||
3 3
|
||||
|
||||
Enter number of clicks for each Ad placement 0 being the top:
|
||||
Ad Placement 0:
|
||||
300
|
||||
Ad Placement 1:
|
||||
200
|
||||
Ad Placement 2:
|
||||
150
|
||||
|
||||
Enter bids for each bidder:
|
||||
A0's bid amount:
|
||||
.5
|
||||
A1's bid amount:
|
||||
.75
|
||||
A2's bid amount:
|
||||
.75
|
||||
|
||||
A2 pays: $100.00
|
||||
A1 pays: $25.00
|
||||
A0 pays: $0.00
|
||||
|
||||
```
|
||||
|
||||
4. More advertisement spaces than bidders
|
||||
|
||||
```
|
||||
Please input the auctions parameters in the form <number of bidders> <number of advertising slots>:
|
||||
3 4
|
||||
|
||||
Enter number of clicks for each Ad placement 0 being the top:
|
||||
Ad Placement 0:
|
||||
200
|
||||
Ad Placement 1:
|
||||
100
|
||||
Ad Placement 2:
|
||||
50
|
||||
Ad Placement 3:
|
||||
25
|
||||
|
||||
Enter bids for each bidder:
|
||||
A0's bid amount:
|
||||
25
|
||||
A1's bid amount:
|
||||
.5
|
||||
A2's bid amount:
|
||||
.3
|
||||
|
||||
A0 pays: $65.00
|
||||
A1 pays: $15.00
|
||||
A2 pays: $0.00
|
||||
```
|
||||
|
||||
5. Bidders dont win in order.
|
||||
```
|
||||
Please input the auctions parameters in the form <number of bidders> <number of advertising slots>:
|
||||
4 4
|
||||
|
||||
Enter number of clicks for each Ad placement 0 being the top:
|
||||
Ad Placement 0:
|
||||
500
|
||||
Ad Placement 1:
|
||||
400
|
||||
Ad Placement 2:
|
||||
200
|
||||
Ad Placement 3:
|
||||
75
|
||||
|
||||
Enter bids for each bidder:
|
||||
A0's bid amount:
|
||||
.75
|
||||
A1's bid amount:
|
||||
.77
|
||||
A2's bid amount:
|
||||
.56
|
||||
A3's bid amount:
|
||||
.80
|
||||
|
||||
A3 pays: $297.00
|
||||
A1 pays: $220.00
|
||||
A0 pays: $70.00
|
||||
A2 pays: $0.00
|
||||
```
|
||||
|
||||
# Code
|
||||
```using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
|
||||
namespace Vickrey_Clark_Grove_Auction
|
||||
{
|
||||
internal static class VCGAuction
|
||||
{
|
||||
public static void Main(string[] args)
|
||||
{
|
||||
var parameters = GetAuctionParameters();
|
||||
CalculateAgentCost(parameters);
|
||||
}
|
||||
|
||||
private static List< Tuple<int, double>> GetBids(int biddersCount)
|
||||
{
|
||||
Console.WriteLine("\nEnter bids for each bidder: ");
|
||||
var bids = new List< Tuple<int, double>>();
|
||||
for (var i = 0; i < biddersCount; i++)
|
||||
{
|
||||
var success = false;
|
||||
while(!success)
|
||||
{
|
||||
Console.WriteLine($"A{i}'s bid amount: ");
|
||||
var input = Console.ReadLine()?.Split().Select(x => double.TryParse(x, out var i) ? i : -1).ToList();
|
||||
if (input == null || input.Count != 1)
|
||||
Console.WriteLine("Enter correct number of integers!");
|
||||
else if (Math.Abs(input[0] - (-1)) < 0)
|
||||
Console.WriteLine("Enter valid input!");
|
||||
else
|
||||
{
|
||||
success = true;
|
||||
bids.Add(new Tuple<int, double>(bids.Count, input[0]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return bids;
|
||||
}
|
||||
|
||||
private static Tuple<int, int> GetBidderCountAdvertisingCount()
|
||||
{
|
||||
var success = false;
|
||||
var biddersAndSlots = new List<int>();
|
||||
while (!success)
|
||||
{
|
||||
Console.WriteLine(
|
||||
$"Please input the auctions parameters in the form <number of bidders> <number of advertising slots>: ");
|
||||
biddersAndSlots = Console.ReadLine()?.Split().Select(x => Int32.TryParse(x, out var i) ? i : -1).ToList();
|
||||
if (biddersAndSlots == null || biddersAndSlots.Count != 2)
|
||||
Console.WriteLine("Enter correct number of integers!");
|
||||
else if (biddersAndSlots.Contains(-1))
|
||||
Console.WriteLine("Enter valid input!");
|
||||
else
|
||||
success = true;
|
||||
}
|
||||
|
||||
var bidderCount = biddersAndSlots[0];
|
||||
var advertisingCount = biddersAndSlots[1];
|
||||
var bidderAndAdvertisingCount = new Tuple<int, int>(bidderCount, advertisingCount);
|
||||
return bidderAndAdvertisingCount;
|
||||
}
|
||||
|
||||
private static Tuple<List<int>, List<Tuple<int, double>>> GetAuctionParameters()
|
||||
{
|
||||
var (bidCount, adCount) = GetBidderCountAdvertisingCount();
|
||||
var slotClickCount = GetAdClickCount(adCount);
|
||||
var bids = GetBids(bidCount);
|
||||
var info = new Tuple<List<int>, List<Tuple<int, double>>>(slotClickCount, bids);
|
||||
return info;
|
||||
}
|
||||
|
||||
private static List<int> GetAdClickCount(int slotCount)
|
||||
{
|
||||
Console.WriteLine("\nEnter number of clicks for each Ad placement 0 being the top: ");
|
||||
var clickCounts = new List<int>();
|
||||
for (var i = 0; i < slotCount; i++)
|
||||
{
|
||||
var success = false;
|
||||
while(!success)
|
||||
{
|
||||
Console.WriteLine($"Ad Placement {i}: ");
|
||||
var input = Console.ReadLine()?.Split().Select(x => Int32.TryParse(x, out var i) ? i : -1).ToList();
|
||||
if (input == null || input.Count != 1)
|
||||
Console.WriteLine("Enter correct number of integers!");
|
||||
else if (input[0] == -1)
|
||||
Console.WriteLine("Enter valid input!");
|
||||
else
|
||||
{
|
||||
success = true;
|
||||
clickCounts.Add(input[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return clickCounts;
|
||||
}
|
||||
|
||||
private static void CalculateAgentCost(Tuple<List<int>, List<Tuple<int, double>>> parameters)
|
||||
{
|
||||
Console.WriteLine();
|
||||
var ci = new CultureInfo("en-us");
|
||||
var (clicks, bids) = parameters;
|
||||
bids.OrderBy(x => x.Item2);
|
||||
bids.Reverse();
|
||||
for (var i = 0; i < bids.Count; i++)
|
||||
{
|
||||
var total = 0.0;
|
||||
for (var j = i; j < clicks.Count && j + 1 < bids.Count; j++)
|
||||
{
|
||||
total += bids[j+1].Item2 * (clicks[j] - (j + 1 == clicks.Count? 0 : clicks[j + 1]));
|
||||
}
|
||||
Console.WriteLine($"A{bids[i].Item1} pays: {total.ToString("C2",ci)}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
Reference in New Issue
Block a user