Dies ist eine KOTH-Herausforderung für das Auktionsspiel für Dollarnoten in der Spieltheorie. Darin wird ein Dollar an den Meistbietenden verkauft. Die Gebote steigen in Schritten von 5 ¢, und der Verlierer zahlt auch sein Gebot. Die Idee ist, dass beide Spieler den Bieterkrieg weit über den Wert eines Dollars hinaus eskalieren, um ihre Verluste zu reduzieren.
Hoffen wir, dass Ihre Bots schlauer sind.
Sie werden einen Bot erstellen, um dieses Spiel zu spielen, indem Sie die net.ramenchef.dollarauction.DollarBidder
Klasse erweitern. Sie müssen die nextBid
Methode implementieren, die das nächste Gebot Ihres Bots zurückgibt, wenn das vorherige Gebot des anderen Bots vorliegt. Bei Bedarf können Sie die newAuction
Methode auch verwenden , um für jede Auktion die Klasse des gegnerischen Bots zurückzusetzen.
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);
}
Das Bieten dauert so lange, bis eine der folgenden Bedingungen erfüllt ist:
nextBid
wirft eine Ausnahme. In diesem Fall zahlt der Bot, der die Ausnahme ausgelöst hat, sein vorheriges Gebot und der andere Bot erhält den Dollar kostenlos.- Beide Bot zahlen nicht genug, um das vorherige Gebot zu übertreffen. In diesem Fall zahlen beide Bots ihre Gebote (der Verlierer zahlt das vorherige Gebot), und der Gewinner erhält einen Dollar.
- Beide Bots bieten über 100 $. In diesem Fall zahlen beide Bots 100 USD und keiner der Bots erhält den Dollar.
Für jede Bots-Kombination finden 2 Auktionen statt. Bots werden anhand des Gesamtgewinns bewertet, den sie in diesen Auktionen erzielt haben. Die höchste Punktzahl gewinnt.
Beispiele
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
Verwenden Sie dies nicht als Vorlage für analytisch denkende Bots. Verwenden Sie ImprovedAnalystBot
stattdessen.
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;
}
}
Zusätzliche Regeln
- Standardlücken sind verboten.
- Das Sabotieren anderer Bots ist zulässig, aber der Versuch, die Sichtbarkeit von Feldern / Methoden zu ändern, führt zu mysteriösen
SecurityException
s. Eine Ausnahme führt dazu, dass ein anderer Bot die Grenze von 500 ms überschreitet. - Bots können nur zur Erweiterung der
DollarBidder
Klasse auf das Runner-Paket zugreifen . - Alle Methoden sollten in 500 ms oder weniger zurückkehren.
- Bots müssen nicht deterministisch sein.
- Ihr Gebot muss kein Vielfaches von 5 ¢ sein.
- 1 $ = 100 ¢
- Die Ergebnisse werden am 24. April 2018 veröffentlicht.
Ergebnisse
Sehen Sie sich hier die einzelnen Runden an.
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
Herzlichen Glückwunsch zu MTargetedBot
einem Gewinn von 14,30 $!
LuckyDiceBot
2-12