Это вызов КОТ для игры на аукционе долларовой банкноты в теории игр. В нем доллар продается по высокой цене. Ставки повышаются с шагом 5 ¢, и проигравший также оплачивает их. Идея состоит в том, что оба игрока наращивают войну торгов намного выше стоимости доллара, чтобы сократить свои потери.
Будем надеяться, что ваши боты умнее этого.
Вы будете создавать бота, чтобы играть в эту игру, расширяя net.ramenchef.dollarauction.DollarBidder
класс. Вы должны реализовать nextBid
метод, который возвращает следующую ставку вашего бота с учетом предыдущей ставки другого бота. При необходимости вы также можете использовать newAuction
метод сброса для каждого аукциона с классом бота противника.
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);
}
Торги продолжаются до тех пор, пока не произойдет одно из следующих действий:
nextBid
бросает исключение. В этом случае бот, выдавший исключение, оплачивает свою предыдущую ставку, а другой бот получает доллар бесплатно.- Любой бот не платит достаточно, чтобы превысить предыдущую ставку. Если это произойдет, оба бота оплачивают свои ставки (проигравший оплачивает их предыдущую ставку), и победитель получает доллар.
- Оба бота предлагают более 100 долларов. Если это произойдет, оба бота платят 100 долларов, и ни один бот не получает доллар.
2 аукциона проводятся для каждой комбинации ботов. Боты оцениваются по общей прибыли, полученной на этих аукционах. Самый высокий балл побеждает.
Примеры
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
Не используйте это как шаблон для аналитически настроенных ботов; используйте ImprovedAnalystBot
вместо
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;
}
}
Дополнительные правила
- Стандартные лазейки запрещены.
- Разрешается саботировать других ботов, но попытка изменить видимость поля / метода приведет к таинственному
SecurityException
s. Исключение заставляет другого бота нарушать ограничение в 500 мс. - Боты не могут получить доступ к пакету бегуна, кроме как для расширения
DollarBidder
класса. - Все методы должны возвращаться через 500 мс или меньше.
- Боты не должны быть детерминированными.
- Ваша ставка не должна быть кратна 5 ¢.
- $ 1 = 100 ¢
- Результаты будут опубликованы 24 апреля 2018 года.
Полученные результаты
Посмотреть отдельные раунды здесь.
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
Поздравляем MTargetedBot
с прибылью в $ 14.30!
LuckyDiceBot
например, ставки с приращениями в 2-12
случайном порядке ..