To wyzwanie KOTH dla gry aukcyjnej za dolary w teorii gier. W nim dolar jest sprzedawany oferentowi, który zaoferował najwyższą cenę. Oferty rosną w krokach co 5 centów, a przegrany płaci również swoją ofertę. Chodzi o to, że obaj gracze eskalują wojnę przetargową znacznie przekraczającą wartość dolara, aby zmniejszyć straty.
Miejmy nadzieję, że twoje boty są mądrzejsze.
Będziesz tworzyć bota, aby zagrać w tę grę, rozszerzając net.ramenchef.dollarauction.DollarBidder
klasę. Musisz wdrożyć nextBid
metodę, która zwraca następną ofertę twojego bota, biorąc pod uwagę poprzednią ofertę innego bota. W razie potrzeby możesz także użyć newAuction
metody resetowania dla każdej aukcji z klasą bota przeciwnika.
public abstract class DollarBidder {
/**
* Used by the runner to keep track of scores.
*/
long score = 0;
/**
* (Optional) Prepare for the next auction.
*
* @param opponent The class of the opponent's bot.
*/
public void newAuction(Class<? extends DollarBidder> opponent) {}
/**
* Bid on the dollar. Bidding ends if the bid is
* not enough to top the previous bid or both bids
* exceed $100.
*
* @param opponentsBid How much money, in cents,
* that the opponent bid in the previous round. If
* this is the first round in the auction, it will
* be 0.
* @return How much money to bid in this round, in
* cents.
*/
public abstract int nextBid(int opponentsBid);
}
Licytacja trwa do momentu spełnienia jednego z poniższych warunków:
nextBid
zgłasza wyjątek. Jeśli tak się stanie, bot, który zgłosił wyjątek, płaci swoją poprzednią ofertę, a drugi bot dostaje dolara za darmo.- Żaden bot nie płaci wystarczająco dużo, aby przewyższyć poprzednią ofertę. Jeśli tak się stanie, oba boty płacą swoje oferty (przegrany płaci poprzednią ofertę), a zwycięzca dostaje dolara.
- Oba boty licytują ponad 100 $. Jeśli tak się stanie, oba boty płacą 100 USD, a żaden bot nie dostaje dolara.
Dla każdej kombinacji botów odbywają się 2 aukcje. Boty są oceniane na podstawie całkowitego zysku, jaki osiągnęły na tych aukcjach. Najwyższy wynik wygrywa.
Przykłady
GreedyBot
import net.ramenchef.dollarauction.DollarBidder;
public class GreedyBot extends DollarBidder {
@Override
public int nextBid(int opponentsBid) {
return opponentsBid + 5;
}
}
OnlyWinningMove
import net.ramenchef.dollarauction.DollarBidder;
public class OnlyWinningMove extends DollarBidder {
@Override
public int nextBid(int opponentsBid) {
return 0;
}
}
AnalystBot
Nie używaj tego jako szablonu dla analitycznie nastawionych botów; użyj ImprovedAnalystBot
zamiast tego.
import net.ramenchef.dollarauction.DollarBidder;
// yes, this is a poor implementation, but I'm not
// going to waste my time perfecting it
public class AnalystBot extends DollarBidder {
private DollarBidder enemy;
@Override
public void newAuction(Class<? extends DollarBidder> opponent) {
try {
enemy = opponent.newInstance();
enemy.newAuction(this.getClass());
} catch (ReflectiveOperationException e) {
enemy = null;
}
}
@Override
public int nextBid(int opponentsBid) {
if (enemy == null)
return 0;
return enemy.nextBid(95) >= 100 ? 0 : 95;
}
}
AnalystKiller
import net.ramenchef.dollarauction.DollarBidder;
public class AnalystKiller extends DollarBidder {
private static int instances = 0;
private final boolean tainted;
public AnalystKiller() {
this.tainted = instances++ != 0;
}
@Override
public int nextBid(int opponentsBid) {
if (tainted)
throw new RuntimeException("A mysterious error occurred! >:)");
return 0;
}
}
Dodatkowe zasady
- Standardowe luki są zabronione.
- Sabotowanie innych botów jest dozwolone, ale próba zmiany widoczności pola / metody spowoduje tajemnicze
SecurityException
s. Wyjątek powoduje, że inny bot przekroczy limit 500ms. - Boty nie mogą uzyskać dostępu do pakietu runnera, z wyjątkiem rozszerzenia
DollarBidder
klasy. - Wszystkie metody powinny zostać zwrócone w ciągu 500 ms lub mniej.
- Boty nie muszą być deterministyczne.
- Twoja oferta nie musi być wielokrotnością 5 ¢.
- 1 USD = 100 ¢
- Wyniki zostaną opublikowane 24 kwietnia 2018 r.
Wyniki
Zobacz poszczególne rundy tutaj.
MTargetedBot: $14.30
BuzzardBot: $9.83
BluffBot: $9.40
RiskRewardBot: $9.35
SecretBot: $8.50
LuckyDiceBot: $7.28
CounterBot: $6.05
MBot: $5.40
StackTraceObfuscaterBot: $5.20
EvilBot: $4.80
MarginalBot: $4.60
TargetValueBot: $4.59
InflationBot: $4.27
UpTo200: $4.20
InsiderTradingBot: $1.90
MimicBot: $1.50
BorkBorkBot: $1.22
DeterrentBot: $0.95
MarginalerBot: $0.00
RandBot: $-4.45
BreakEvenAsap: $-7.00
AnalystOptimizer: $-13.95
DeterredBot: $-1997.06
ScoreOverflowBot: $-21474844.15
MirrorBot: $-21475836.25
Gratulacje MTargetedBot
z zyskiem 14,30 $!
LuckyDiceBot
na przykład oferty w przyrostach 2-12
losowych ..