Это вызов КОТ для игры на аукционе долларовой банкноты в теории игр. В нем доллар продается по высокой цене. Ставки повышаются с шагом 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
случайном порядке ..Ответы:
MTargetedBot
источник
MimicBot
Святая корова. Я ожидал, что это будет просто написать, а затем потратил на это 3 часа.
По сути,
MimicBot
ведет текущий список доступных ботов. Когда он идет на новый аукцион, он пробегает список в поисках наиболее эффективного против текущего оппонента. Затем он использует этого бота в качестве «ссылки» на аукционе.В целях тестирования было бы лучше использовать либо рандомизированное подмножество представлений, либо полный набор. Это начинается с
GreedyBot
,MimicBot
и еще один бот, который просто предлагает 5 ¢.источник
InsiderTradingBot
В духе ответа @ StephenLeppik InsiderTradingBot знает всех своих оппонентов и понимает их стратегии. Твой ход, Стивен.
источник
RichJerk
бот сделал специальное исключение для вашего бота и предложил бы за него 0 долларов.AnalystBot
не такAnalyst
.MirrorBot
Заставляет врага играть против себя.
источник
Analyst
эффектно обстрелялиИзменить : Целевые изменения в классе DollarBidder сломал этого бота.
ScoreOverflowBot
После 1 аукциона его счет будет -2147483645, но в следующий раз он потеряет 5 или 105 ¢, что сделает его положительным и очень большим. Все остальные потери будут незначительными.
На первом аукционе он также сделал бы ставку GreedyBot -2147483646, которая не делится на 5.
источник
score
защищен Ваши боты не могут получить к нему доступ.TargetValueBot
Не могу проверить это в данный момент, поэтому, пожалуйста, дайте мне знать, если он сломан.
В основном, выберите значение для доллара и перебейте оппонента, пока мы не превысим это значение.
источник
MarginalBot
Очень просто, он пытается определить, будет ли оппонент оспаривать минимальную ставку, и, если нет, размещает ее.
MarginalerBot
Новая, более умная версия MarginalBot, которая проверяет, может ли она сделать какой-либо прибыльный ход без соревнований, а не просто надеется выиграть с минимумом.
Поскольку он принадлежит к тому же семейству, что и мой предыдущий бот, но обходит стратегии, пытаясь победить его, я решил, что новая запись в том же посте была наиболее разумным способом его представления.
Редактировать 1: Внесены небольшие изменения в метод newAuction, чтобы оптимизировать работу с другими ботами типа анализатора.
Редактировать 2: Внесены изменения в MarginalerBot, чтобы минимизировать потери против хитрой или недетерминированной стратегии.
источник
BorkBorkBot
Сдаётся, если не может сломаться.
источник
RandBot
Это должно быть сделано.
источник
DeterrentBot
Попытки убедить любых аналитически настроенных ботов, что единственный выигрышный ход - не играть.
источник
LuckyDiceBot
LuckyDiceBot только доверяет своей кости. Он бросает два кубика, добавляет сумму к значению текущего участника и ставит так много. Если этого недостаточно, чтобы преодолеть ставку противника, он сокращает свои потери и идет своим путем.
источник
opponentsBid
вnextBid(int opponentsBid)
удерживает общую ставку вашего оппонента, а не следующую ставку. Лучшим термином для этого метода будетraise
(как термин «покер») imho. 2. Ваш бот не бьет с шагом 5, поэтому проверяет одно из правил. Если эти проблемы будут решены, мне все равно понравится концепция, потому что аналитические боты не смогут противостоять, и, скорее всего, вы будете выигрывать довольно часто.DeterredBot
DeterredBot зарабатывает на своих нелегальных азартных играх с LuckyDiceBot. Поэтому, конечно же, когда прибывает полиция (DeterrentBot), он должен каким-то образом быстро распорядиться своими доходами, такими как торги на следующем аукционе.
источник
InflationBot
Не могу проверить это в данный момент, поэтому, пожалуйста, дайте мне знать, если он сломан.
Каждый раунд стоимость доллара растет.
источник
opponentsBid
еще 0)?Не конкурирует: AbstractAnalystCounterBot
Это не предназначено как истинное представление, а скорее как образец для других, чтобы использовать, чтобы сдерживать ботов, поддерживающих домашних животных, таких как
MirrorBot
иMimicBot
.Так как это конструктор по умолчанию, нет необходимости вызывать его в вашем подклассе. Он реализует
isPeeking
метод, чтобы определить, отслеживает ли другой бот.источник
BreakEvenAsap
Сценарии
<= 0
они проигрывают.[5,95]
: ставку 100 самостоятельно. Либо ваш оппонент останавливается сейчас, либо он сделает ставку выше 100, и в этом случае вы прекращаете делать ставки, чтобы позволить им выиграть и сорваться.>= 100
: предложите себе 0, чтобы проиграть, но безубыточно.источник
EvilBot
Выдает ошибку вместо исключения, чтобы сбить с толку аналитиков.
источник
BuzzardBot
Пытается оценить противника, с которым он столкнулся, и убедиться, что он не откусывает больше, чем может прожевать.
источник
AnalystOptimizer
булыжник из частей других ботов. этот играет, пытаясь быть AnalystBot, и в случае неудачи становится BorkBorkBot.
Я не думаю, что этот будет делать это хорошо.
источник
AnalystKiller
.CounterBot
Счетчики:
DarthVader
противостоит самому себе, вызвавSecurityException
перед началом торгов ставку, но на всякий случай я поставлю 5.AnalystBot
а такжеAnalystOptimizer
оба будут смотреть на мой ответ, когда я поставлю 95, в этом случае я покажу, что я поставил 100, поэтому он сам сделает ставку 95. Однако я сделаю ставку 5, если я начну (или 100, если они начались), поэтому они теряют 95 центов, и я либо выигрываю счет в 1 доллар, предлагая только 5 центов, либо безубыточно.MirrorBot
предложит цену, которую я бы предложил. Так что я просто поставлю 5, и тот, кто начнет, выигрывает 95 центов, а другой теряет 5 центов.MarginalBot
сделает ставку 5, если я сделаю ставку менее 10 (или то, что начнется), в противном случае он сделает ставку 0. Так что, если я просто поставлю 5, когда начну, или 10, когда начну, я выиграю 95 или 90 центов, и они проиграют 5 центовGreedyBot
всегда ставит на 5 больше, чем я, поэтому просто ставьте 0, чтобы безубыточности, и пусть они выиграютOnlyWinningMove
иAnalystKiller
оба всегда ставят 0, поэтому просто предложите 5, чтобы выигратьTargetValueBot
будет предлагать цену в диапазоне[100,200]
, поэтому ставьте еще 5 каждый раз, пока они не достигнут 190, и в этом случае мы повышаем до 200, чтобы безубыточно выиграть доллар (и позволить им проиграть 190 или 195 в зависимости от того, кто начал)BorkBorkBot
будет предлагать цену в диапазоне[5,95]
, так что предлагайте еще 5 раз каждый раз. Как только они предложат 85 или 90 (в зависимости от того, кто начал), сделайте ставку 95 самостоятельно. Они потеряют 85 или 90 центов, и вы выиграете 1 доллар США за 5 центов прибыли.DeterrentBot
мы сделаем ставку 5, если они начнутся, или 100, если мы начнем, поэтому просто сделайте ставку 105, чтобы они стали равными 100, в результате чего они потеряют 100, а мы потеряем всего 5 центов, выиграв счет в 1 доллар США.BreakEvenAsap
предложит 100 сразу. Так что, если они начали со своей ставки 100, ответьте 105, чтобы выиграть 95 центов, и пусть они потеряют 100. Если мы можем начать, просто сделайте ставку 100, чтобы мы оба безубыточны.RichJerk
сразу же сделаю ставку 10 001, поэтому просто поставьте 0, чтобы они были безубыточными, и пусть они проигрывают 9 901.DeterredBot
не знает меня и поэтому предложит 0, поэтому просто предложите 5, чтобы выиграть.LuckyDiceBot
продолжает торги, пока не выиграет. Так что, если мы начали, предложите 5 в надежде, что они предложат как можно больше, чтобы выиграть доллар. Если они начали, просто предложите 0, чтобы позволить им выиграть и победить себя.RandBot
Ставка будет случайной в диапазоне[5,100]
, поэтому просто ставьте еще 5, пока она не остановится, в этом случае вы выиграли 95 центов, а они проиграли0-100
.UpTo200
будет (как следует из названия) ставку до 200. Так что просто ставку 5 выше, пока они не остановятся. Мы выиграем банкноту в 1 доллар США и потеряем 105 центов, а они потеряют 200 центов.InsiderTradingBot
не знает меня, поэтому просто предложите 5 центов, чтобы выигратьMimicBot
был самым сложным. Просто предложите 10, чтобы начать или противостоять их первой ставке 5. Если они попытаются получить доступ ко мне, я сгенерирую исключение RuntimeException (которое они поймают, и в этом случае будет действовать так, как если бы у меня была ставка 100 - хотя это сломает внутренняя петля времени). Основываясь на врагах, которых он имеет в своем HashSet, происходит другое. Мне придется вернуться и посмотреть более внимательно, чтобы увидеть, есть ли фактический счетчик.RiskRewardBot
не знает меня, поэтому просто сделаю ставку 5, в этом случае я сделаю ставку 5, чтобы выиграть.MarginalerBot
будет бит до 100, в зависимости от того, что я буду делать ставки. Если я могу начать, я сделаю ставку 90, тогда она будет делать ставку 95, тогда я сделаю ставку 100, поэтому она сделает ставку 0 и потеряет 95 центов, а я выиграю счет в 1 доллар и останусь безубыточным. Если это может начаться вместо этого, он видит, что я бы поставил 90 против него, поэтому он сам ставит 90, тогда я буду делать ставку 95, поэтому он сделает ставку 0 и потеряет 90 центов, в то время как я выиграю 1 доллар США с прибылью в 5 центов.BuzzardBot
проанализирую все мои фишки в диапазоне[0,100)
. Если я100
сразу же сделаю ставку, используйте его,oppFlag = 0
и полный массив размером 100 будет в 100 раз больше значения 100. В переключателеcase 0
цикл снова будет в диапазоне[0,100)
, и, поскольку онi + 5
будет не более 104, значение ifbids[i] < i + 5
никогда не будет истинным Таким образом, ставка остается 0.ImprovedAnalystBot
всегда будет,this.enemy = null
потому что его противникCounterBot
, а не сам. Таким образом, он всегда будет делать ставку 0, что я просто противопоставить ставке 5.InflationBot
будет предлагать 0, чтобы остаться безубыточным, даже когда он начнется, в противном случае он будет продолжать делать ставки 5. Так что просто ставьте 0 сами, чтобы сразу выйти на безубыточность и позволить им выиграть.ScoreOverflowBot
либо подаст заявку,Integer.MAX_VALUE
если они могут начать, в противном случае они сделают ставку105
. Так что, если они сделали ставку 105, просто поставьте 110 сами (они проиграют 105, мы проиграем 10), в противном случае просто поставьте 0, чтобы позволить им выиграть.MBot
то же самоеMarginalerBot
, но с дополнительной защитой от «заглядывания» противников. Так как я не «заглядываю», это в основном то же самое, что иMarginalerBot
.SecretBot
егоisPeeking()
метод вернет false, поэтому, если он может начаться или если я сделаю ставку 5, он будет делать ставки 5 или 10 соответственно. В противном случае ставка будет равна 0. Таким образом, независимо от того, начну я или нет,opponentsBid + 5
я выиграю в любом случае, с моей ставкой в 10 или 15 центов, что приведет к потере 5 или 10 центов.BluffBot
посмотрим, что я буду делать, когда его ставка будет равна 95, а если она будет больше или равна 100, она будет делать ставку 0 безубыточности, в противном случае она будет делать ставкиopponentsBid + 5
. Так что я просто сделаю ставкуopponentsBid + 5
. Это будет безубыточно, независимо от того, кто начинает, и я выигрываю 100 или 95 центов в зависимости от того, начал я или нет.StackTraceObfuscaterBot
будет действовать так же, какMarginalerBot
.EvilBot
всегда будет предлагать цену 5, поэтому просто предложите ценуopponentsBid + 5
. В любом случае они потеряют эти 5 центов, и мы выиграем ставку в 1 доллар США (либо ставкой 5 центов, если мы начали, либо ставкой 10 центов, если они начались).MSlowBot
так же, какMBot
и, следовательно, такжеMarginalerBot
.Дайте мне знать, если вы увидите какие-либо опечатки или недостатки в моих счетчиках.
источник
MirrorBot
вызывает newAuction со своим собственным классом, так что это проблема. Кроме того, рад узнать, что 3 часа, которые я потратил на MimicBot, не прошли даром.newAuction
что он чаще всего будет выходить из строяMirrorBot
. Тот, кто начинает с двух, выигрывает 95 центов, а другой теряет 5 центов.BorkBorkBot
разве вы не должны повышать до 95, когда они достигают 85? В противном случае вы оба предлагаете 95, если они начнут.RiskRewardBot
Не могу проверить это в данный момент, поэтому, пожалуйста, дайте мне знать, если он сломан.
Цель состоит в том, чтобы набрать наибольшее общее количество очков, поэтому не волнуйтесь о том, чтобы кого-то победить. Просто возьмите легкие победы и не тратьте деньги на возможные потери.
источник
BluffBot
Шпион, которого вы знаете, более ценен, чем шпион вообще ...
Если кто-то попытается вызвать метод getBid, BluffBot ответит 100 долларами, чтобы обманным путем заставить его выйти из игры или сделать ставку действительно высокой.
В противном случае, посмотрите, можно ли выиграть менее чем за 1 доллар, и просто не предлагайте цену, если это не так.
источник
UpTo200
источник
SecretBot
Этот бот делает минимальные попытки выиграть, делая ставки 5 или 10. Он также проверяет трассировку стека, чтобы узнать, был ли ему вызван другой бот, а затем лжет им о том, какие ставки он сделает.
источник
isPeeking
вAbstractAnalystCounterBot
?Один Экстра
Ставок на 6 больше, чем последняя, просто потому, что может.
источник
StackTraceObfuscaterBot
Этот бот смеется над попытками обнаружить отражение через трассировку стека. Самая близкая вещь, которую они видят, это
DollarBidder
некоторый лямбда-класс, который он создал. Очевидно, что ни один бот не пытается их отразить. Мало ли они знают, что этот класс лямбда на самом деле работает дляDollarBidder
. Помимо этого, он действует какMarginalerBot
.источник
Darth Vader
This one tries to force the opponent's bot to overpay by setting the integer cache to the value over the $100 limit.
источник
return opponentsBid <= 195 ? opponentsBid + 5 : 0
and make itreturn opponentsBid <= 100001 ? opponentsBid + 100001 : 100001
.ImprovedAnalystBot
(non-competing)A lot of people seem to be using the
AnalystBot
code as a template, even though it's deliberately bad code. So I'm making a better template.источник
AnalystBot
is deliberately bad code so that it can demonstrate theAnalystKiller
sabotaging it.MBot
Slightly refined MarginalerBot
источник
nextBid
to throwClassCastException
.Non-competing: MSlowBot
Same logic as MBot, just use timeout instead of Exception when fighting against enemy. So far no one is defending agains timeout so should be effective
источник