Questa è una sfida KOTH per il gioco di aste di banconote da un dollaro nella teoria dei giochi. In esso, un dollaro viene venduto al miglior offerente. Le offerte aumentano con incrementi di 5 ¢ e anche il perdente paga la propria offerta. L'idea è che entrambi i giocatori intensifichino la guerra delle offerte ben oltre il valore di un dollaro per ridurre le loro perdite.
Speriamo che i tuoi robot siano più intelligenti di così.
Creerai un bot per giocare estendendo la net.ramenchef.dollarauction.DollarBidder
classe. È necessario implementare il nextBid
metodo che restituisce la prossima offerta del proprio bot data l'offerta precedente dell'altro bot. Se necessario, puoi anche usare il newAuction
metodo per resettare per ogni asta con la classe del bot dell'avversario.
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);
}
L'offerta è valida fino a quando si verifica una delle seguenti condizioni:
nextBid
genera un'eccezione. In questo caso, il bot che ha generato l'eccezione paga la sua offerta precedente e l'altro bot ottiene il dollaro gratis.- Entrambi i bot non pagano abbastanza per completare l'offerta precedente. Se ciò accade, entrambi i robot pagano le loro offerte (il perdente paga la loro offerta precedente) e il vincitore riceve un dollaro.
- Entrambi i robot offrono oltre $ 100. Se ciò accade, entrambi i robot pagano $ 100 e nessuno dei due bot ottiene il dollaro.
Si svolgono 2 aste per ogni combinazione di robot. I bot vengono assegnati in base al profitto totale realizzato in tali aste. Vince il punteggio più alto.
Esempi
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
Non usarlo come modello per i robot con mentalità analitica; usa ImprovedAnalystBot
invece.
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;
}
}
Regole aggiuntive
- Sono vietate le scappatoie standard .
- È consentito sabotare altri robot, ma tentare di alterare la visibilità del campo / metodo si tradurrà in misteriosi messaggi di posta
SecurityException
elettronica. Un'eccezione sta facendo sì che un altro bot rompa il limite di 500ms. - I robot non possono accedere al pacchetto runner se non per estendere la
DollarBidder
classe. - Tutti i metodi dovrebbero tornare in 500ms o meno.
- I robot non devono essere deterministici.
- La tua offerta non deve essere un multiplo di 5 ¢.
- $ 1 = 100 ¢
- I risultati saranno pubblicati il 24 aprile 2018.
risultati
Visualizza i singoli round qui.
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
Congratulazioni a MTargetedBot
con un profitto di $ 14,30!
LuckyDiceBot
per esempio offerte in incrementi di 2-12
casualmente ..