Este é um desafio KOTH para o jogo de leilão de notas de dólar na teoria dos jogos. Nele, um dólar está sendo vendido pelo maior lance. Os lances aumentam em incrementos de 5 ¢ e o perdedor também paga o lance. A idéia é que ambos os jogadores escalem a guerra de lances muito além do valor de um dólar para reduzir suas perdas.
Vamos torcer para que seus bots sejam mais inteligentes que isso.
Você criará um bot para jogar este jogo, estendendo a net.ramenchef.dollarauction.DollarBidder
classe. Você deve implementar o nextBid
método que retorna o próximo lance do seu bot, considerando o lance anterior do outro bot. Se necessário, você também pode usar o newAuction
método para redefinir para cada leilão a classe do bot do oponente.
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);
}
Os lances vão até que aconteça um dos seguintes:
nextBid
lança uma exceção. Se isso acontecer, o bot que lançou a exceção paga o lance anterior e o outro bot recebe o dólar de graça.- Qualquer bot não paga o suficiente para cobrir o lance anterior. Se isso acontecer, ambos os bots pagam seus lances (o perdedor paga seu lance anterior) e o vencedor recebe um dólar.
- Ambos os bots oferecem lances acima de US $ 100. Se isso acontecer, ambos os bots pagam US $ 100 e nenhum bot recebe o dólar.
São realizados 2 leilões para cada combinação de bots. Os robôs são pontuados pelo lucro total que obtiveram nesses leilões. A pontuação mais alta vence.
Exemplos
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
Não use isso como modelo para bots com análise analítica; use em ImprovedAnalystBot
vez disso.
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;
}
}
Regras adicionais
- As brechas padrão são proibidas.
- É permitido sabotar outros bots, mas tentar alterar a visibilidade do campo / método resultará em
SecurityException
s misteriosos . Uma exceção está fazendo com que outro bot ultrapasse o limite de 500ms. - Os robôs não podem acessar o pacote do corredor, exceto para estender a
DollarBidder
classe. - Todos os métodos devem retornar em 500 ms ou menos.
- Bots não precisam ser determinísticos.
- Seu lance não precisa ser múltiplo de 5 ¢.
- $ 1 = 100 ¢
- Os resultados serão publicados em 24 de abril de 2018.
Resultados
Veja as rondas individuais aqui.
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
Parabéns MTargetedBot
com um lucro de $ 14,30!
LuckyDiceBot
Por exemplo, lances em incrementos 2-12
aleatórios.