Ceci est un défi KOTH pour le jeu d' enchères d' un billet d'un dollar dans la théorie des jeux. Dans ce document, un dollar est vendu au plus offrant. Les offres augmentent par incréments de 5 ¢, et le perdant paie également leur offre. L'idée est que les deux joueurs intensifient la guerre des enchères bien au-delà de la valeur d'un dollar afin de réduire leurs pertes.
Espérons que vos robots sont plus intelligents que cela.
Vous allez créer un bot pour jouer à ce jeu en prolongeant la net.ramenchef.dollarauction.DollarBidder
classe. Vous devez implémenter la nextBid
méthode qui renvoie la prochaine enchère de votre bot compte tenu de la précédente enchère. Si nécessaire, vous pouvez également utiliser la newAuction
méthode pour réinitialiser chaque vente aux enchères avec la classe du bot de l'adversaire.
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);
}
Les enchères vont jusqu'à ce que l'une des situations suivantes se produise:
nextBid
jette une exception. Si cela se produit, le bot qui a lancé l'exception paie son enchère précédente et l'autre bot reçoit le dollar gratuitement.- Les deux robots ne paient pas assez pour dépasser l'enchère précédente. Si cela se produit, les deux robots paient leurs enchères (le perdant paye leur offre précédente) et le gagnant reçoit un dollar.
- Les deux robots ont offert plus de 100 $. Si cela se produit, les deux robots paient 100 $ et aucun des deux ne récupère le dollar.
2 enchères sont organisées pour chaque combinaison de robots. Les bots sont évalués en fonction du bénéfice total qu'ils ont réalisé sur ces enchères. Le score le plus élevé gagne.
Exemples
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
Ne l'utilisez pas comme modèle pour les robots dotés d'un esprit d'analyse; utiliser à la ImprovedAnalystBot
place.
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;
}
}
Règles additionnelles
- Les échappatoires standard sont interdites.
- Saboter d'autres robots est autorisé, mais tenter de modifier la visibilité du champ / de la méthode donnera lieu à des
SecurityException
s mystérieux . Une exception provoque un autre bot pour dépasser la limite de 500 ms. - Les robots ne peuvent pas accéder au package du coureur, sauf pour étendre la
DollarBidder
classe. - Toutes les méthodes doivent revenir dans 500 ms ou moins.
- Les robots n'ont pas besoin d'être déterministes.
- Votre enchère n'a pas besoin d'être un multiple de 5 ¢.
- 1 $ = 100 ¢
- Les résultats seront affichés le 24 avril 2018.
Résultats
Voir les tours individuels ici.
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
Félicitations à MTargetedBot
avec un bénéfice de 14,30 $!
LuckyDiceBot
exemple, des enchères par incréments d' 2-12
au moins ..