Este es un KOTH desafío para el juego de subasta de billetes de un dólar en teoría de juegos. En él, se vende un dólar al mejor postor. Las ofertas aumentan en incrementos de 5 ¢, y el perdedor también paga su oferta. La idea es que ambos jugadores intensifiquen la guerra de ofertas mucho más allá del valor de un dólar para reducir sus pérdidas.
Esperemos que tus bots sean más inteligentes que eso.
Creará un bot para jugar este juego ampliando la net.ramenchef.dollarauction.DollarBidder
clase. Debe implementar el nextBid
método que devuelve la próxima oferta de su bot dada la oferta anterior del otro bot. Si es necesario, también puede usar el newAuction
método para reiniciar para cada subasta con la clase del bot del 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);
}
La licitación continúa hasta que ocurre uno de los siguientes:
nextBid
lanza una excepción. Si esto sucede, el bot que lanzó la excepción paga su oferta anterior, y el otro bot obtiene el dólar gratis.- Cualquiera de los bot no paga lo suficiente para superar la oferta anterior. Si esto sucede, ambos robots pagan sus ofertas (el perdedor paga su oferta anterior) y el ganador recibe un dólar.
- Ambos bots ofertaron más de $ 100. Si esto sucede, ambos bots pagan $ 100 y ninguno de ellos recibe el dólar.
Se realizan 2 subastas por cada combinación de bots. Los bots se puntúan según el beneficio total que obtuvieron en esas subastas. El puntaje más alto gana.
Ejemplos
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
No use esto como plantilla para bots con mentalidad analítica; utilizar ImprovedAnalystBot
en su lugar.
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;
}
}
Reglas Adicionales
- Las lagunas estándar están prohibidas.
- Se permite sabotear otros bots, pero intentar alterar la visibilidad del campo / método dará como resultado misteriosos
SecurityException
s. Una excepción está causando que otro bot rompa el límite de 500 ms. - Los bots no pueden acceder al paquete del corredor excepto para extender la
DollarBidder
clase. - Todos los métodos deben regresar en 500 ms o menos.
- Los bots no necesitan ser deterministas.
- Su oferta no necesita ser un múltiplo de 5 ¢.
- $ 1 = 100 ¢
- Los resultados se publicarán el 24 de abril de 2018.
Resultados
Ver las rondas individuales aquí.
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
¡Felicitaciones a MTargetedBot
con una ganancia de $ 14.30!
LuckyDiceBot
por ejemplo, ofertas en incrementos 2-12
aleatorios ...