ПРИМЕЧАНИЕ : победителем этого конкурса является Джек !!! Больше никаких заявок не будет принято.
Вот чат для этого испытания царя горы . Это мой первый, поэтому я открыт для предложений!
Жнец - это игровая концепция, разработанная «Искусством решения проблем», которая включает терпение и жадность. После внесения изменений в игру, чтобы она соответствовала конкурсу в стиле KOTH (спасибо @NathanMerrill и @dzaima за ваши предложения и улучшения), вот задача.
Игра работает следующим образом: у нас есть значение, известное как Reap, которое умножается на данную константу каждый тик. После каждого тика каждый бот имеет возможность «пожинать», что означает добавление текущего значения Reap к своему счету и уменьшение Reap до 1.
Тем не менее, есть фиксированное количество тиков, которые бот должен ждать между «жатками», и фиксированное количество очков, необходимое для победы в игре.
Достаточно просто? Вот ваши входные данные:
I / O
Вы должны написать функцию в Python 3, которая принимает 3 входа. Первый self
, используется для ссылки на объекты класса (показано позже). Второе - это Reap
текущая стоимость Жатвы, которую вы заработаете, если будете «пожинать». Третий - prevReap
список ботов, которые были получены во время предыдущего тика.
Другие объекты, к которым вы можете получить доступ в своей функции:
self.obj: An object for your use to store information between ticks.
self.mult: The multiplier that Reap is multiplied by each tick
self.win: The score you need to win
self.points: Your current set of points
self.waittime: The amount of ticks that you must wait between reaps during the game
self.time: The number of ticks since your last reap
self.lenBots: The number of bots (including you) in the game.
self.getRandom(): Use to produce a random number between 0 and 1.
Вы НЕ ДОЛЖНЫ редактировать содержимое этих объектов, за исключением self.obj
.
Вы должны выводить, 1
чтобы пожинать, и все остальное (или ничего), чтобы не пожать. Обратите внимание, что если вы пожнете, когда не дождетесь достаточно тиков, я проигнорирую тот факт, что вы решили пожинать.
правила
Параметры я буду использовать это winning_score=10000
, multiplier=1.6-(1.2/(1+sqrt(x)))
, waittime = floor(1.5*x)
где x
это количество ботов в Koth.
- Игра заканчивается, когда игрок (или несколько) достигает выигрышного счета.
- Когда несколько ботов просят пожинать одновременно, приоритет отдается ботам, которые ждали дольше (в случае связей, боты, которые ждали максимальное время, все могут пожинать и получать очки в Жатве)
- Ваш бот должен занять в среднем не более 100 мс на 5 тиков.
- Если вы хотите импортировать библиотеки, спросите! Я попытаюсь добавить любые библиотеки, которые смогу запустить на настольной версии Python (математика уже импортирована: не стесняйтесь ее использовать)
- Все стандартные лазейки для KoTH, такие как боты-дубликаты, боты 1-го уровня и т. Д., Также запрещены.
- Любые боты, которые используют любую случайность, должны использовать предоставленную
getRandom
мной функцию.
Вы можете найти контроллер в ссылке TIO ниже. Чтобы использовать его, добавьте имя вашей функции BotList
в виде строки, а затем добавьте функцию в код. Изменить, multiplier
чтобы изменить то, что Reap умножается на каждый тик, изменить, winning_score
чтобы изменить количество очков, необходимое для завершения игры, и изменить, waittime
чтобы изменить количество тиков, ожидающих между повторениями.
Для вашего удобства, вот несколько примеров (и довольно глупых) ботов. Отправка ботов, подобных этим, не будет разрешена. Тем не менее, они демонстрируют, как работает контроллер.
def Greedybot(self,Reap, prevReap):
return 1
def Randombot(self,Reap, prevReap):
if self.obj == None:
self.obj=[]
self.obj.append(prevReap)
if self.getRandom()>0.5:
return 1
Для тех, кто заинтересован, вот Контроллер с 15 встроенными в него представлениями: Попробуйте онлайн
ЗАКЛЮЧИТЕЛЬНЫЕ РЕЗУЛЬТАТЫ
WOO ОНИ НАКОНЕЦ ЗДЕСЬ! Проверьте ссылку TIO выше, чтобы увидеть, какой код я использовал для генерации итоговых результатов. Результаты не очень интересные. За 1000 прогонов, которые я сделал с разными случайными семенами, результаты были
1000 wins - Jack
0 wins - everyone else
Поздравляем победителя Баунти Джека! (он же @Renzeee)
источник
len(BotList)
?25
ботов в игре. Однако сначала нужно немного подождать, чтобы увидеть ботов других людей. Рашабх Мехта , будет ли крайний срок / окончательная дата, когда будут запущены все боты и определен победитель?Ответы:
Нерешительный Twitchy Mess
Этот бот сначала выполняет обычные проверки (Могу ли я пожинать, могу ли я выиграть?), А затем ищет целевое значение, прежде чем оно получит. Тем не менее, он нерешителен, поэтому, когда он достигает цели, он задается вопросом, сколько еще может ждать, и не пожинает сразу. Кроме того, он дергается, поэтому может случайно «нажать на кнопку» и пожать раньше цели.
Интересный факт: именно так я и играю в жнец как человек.
источник
снайпер
Бот питается от злости. Отслеживает перезарядки и оценки противника. Попытки удержать других от победы. Практически никогда не выигрывает, но делает игру разочаровывающей для других.
РЕДАКТИРОВАТЬ:
Если никто не> = 70% выигравшего счета:
Если по крайней мере половина других пользователей перезаряжается, попытайтесь пожать.Это затрудняет нацеливание на конкретных противников и поэтому было удалено.Если кто-то>> 70% выигравшего счета:
Скучать
Просто для забавы, этот бот был привезен другом и на самом деле не хочет быть здесь. Они бросают d16 до тех пор, пока не получат число от 1 до 9, затем они пытаются пожинать всякий раз, когда число содержит выбранную цифру. (Поиск d10 нарушил бы игру, что грубо, а 0 слишком просто!)
источник
self.obj.opponents[opponent]["time"] += 1
в первом цикле for иself.obj.lastReap
в конце второго цикла for. Кроме того, хорошие идеи. Мне любопытно, как это сработает против многих других ботов. Когда я использую много жадных и случайных ботов, он будет пожинать как можно скорее, потому что большую часть времени половина ботов не может пожать. Но, конечно, это не реалистичные конкуренты.разъем
Это простой бот с 4 правилами:
Я оптимизировал 3 тика по сравнению с текущими существующими ботами (Sniper, grim_reaper, Every50, mess, BetterRandom, Averager и некоторые другие).
Я пытался остаться со своим старым решением (5 тиков), но также пожинаю плоды, если вы не пожинаете дольше, чем X тиков, а затем пожинаете после того, как во время непроигрыша прошло меньше тиков (то есть 5, если вы ждали дольше, чем я) .waittime + 5, также пожинать, если не получено 4 галочки). Но это не улучшилось, просто всегда пожиная после 4 тиков вместо 5.
источник
Каждые 50
Эти боты будут пожинать каждый раз, когда
Reap
сумма превышает 50.Почему 50?
Если я сделаю предположение, что в игре будет 25 ботов, это означает, что
multiplier = 1.6-(1.2/(1+sqrt(25))) = 1.4
иwaittime = floor(1.5*25) = 37
. ПосколькуReap
начинается в1
, он будет расти так:Как вы можете видеть, он достигает уровня выше 50 после 13 тиков. Так как
Reap
будет сброшен на 1 каждый раз , когда бот жмет, аwaittime
для робота , который жмет на 37, вероятность того, бот жмет раньше , чем позже довольно высоко, особенно с ботами , похожими на примерGreedyBot
, который будет жать , как только ихwaittime
IS снова доступно Сначала я хотел сделать 200, что является 17-м тактом, что-то посередине из 37 тиков времени ожидания, но при условии, что в игре 25 ботов, есть довольно высокий шанс, что кто-то другой выхватитReap
до меня. Поэтому я понизил его до 50. Это все еще хорошее округленное число, но особенно потому, что это 13-й тик (с 25 ботами), а 13 и «жатва» также вписываются в тот же «злой» жанр.Код:
Код смехотворно тривиален ..
Примечания:
Этот бот довольно плохой с небольшим количеством ботов в игре. Пока я оставлю это, и я мог бы сделать лучшего бота, фактически вычисляющего лучшее время
Reap
. С очень низким количеством ботов в игре,waittime
конечно, также намного меньше, так что даже онGreedyBot
может легко выиграть от этого бота, еслиwaittime
он достаточно низок.Надеюсь, что больше людей добавят намного больше ботов. ;п
источник
def Every49(self, Reap, prevReap): return Reap > 49
Ваш ход.int
обойти неравенство, так как 1 - это настоящая командаTrue
явный1
. Я подумал, чтоTrue == 1
проверка все равно вернется, еслиTrue
мой бот добавит ее в спискиReapers
вашейnext
функции, но я все равно добавил приведение к int, как вы и предлагали.усреднитель
Этот бот пытается пожинать всякий раз, когда текущее значение Reap превышает среднее значение Reaped.
источник
Смерть с косой
Этот бот сохраняет среднее значение всех предыдущих результатов, а также время ожидания каждого бота. Она пожинает, когда она ждала дольше, чем 3/4 других ботов, и пожинает, по крайней мере, 3/4 размера среднего жатвы, замеченного до сих пор. Цель состоит в том, чтобы получить много разумного размера, с низким риском пожинает плоды.
Редактировать: Исправлены некоторые неловкие синтаксические ошибки.
Попробуйте онлайн
источник
self.obj.reaps
вместоself.reaps
иself.obj
вместоself.object
иprevReap
вместоprevLeap
и добавить () послеself.obj.players.values
дважды. И я думаю,self.obj.reaps = []
что не будет работать, если неself.obj
является объектом. Я не совсем уверен, что тогда все будет работать так, как задумано, и верно ли все, что я сказал, но после этих изменений и использования фиктивного объекта,self.obj
когда его еще нет, ваш код компилируется для меня.class Object(object):
[newline]pass
сверху и использовалself.obj = Object()
вif not hasattr(..)
(если я правильно помню).BetterRandom
Бот основан на предположении, что шанс пожать должен быть пропорционален размеру пожатия, потому что точка - это точка, независимо от того, когда она получена. Всегда есть очень маленький шанс пожать, это сохраняет поведение пригодным для использования. Сначала я подумал, что это будет прямо пропорционально, и предположил, что константа пропорциональности примерно равна
1/mult^waittime
(максимальный доход при условии, что хотя бы один бот играет жадным образом), после запуска некоторых симуляций я обнаружил, что это действительно оптимальная константа. Но бот по-прежнему был лучше, чем рандом, поэтому я пришел к выводу, что отношение не было прямо пропорциональным, и добавил константу, чтобы вычислить, каково это отношение. После некоторых симуляций я обнаружил, что набор ботов для моего теста-1.5
был оптимальным. Это на самом деле соответствует обратно пропорциональной зависимости между шансом пожинать иreap*sqrt(reap)
что удивительно. Поэтому я подозреваю, что это сильно зависит от конкретных ботов, поэтому версия этого бота, которая вычисляет k во время игры, была бы лучше. (Но я не знаю, разрешено ли вам использовать данные предыдущих раундов).РЕДАКТИРОВАТЬ: Я сделал программу, чтобы найти вид пропорциональности автоматически. На тестовом наборе
["myBot("+str(k)+")","Randombot","Greedybot","Every50","Jack","grim_reaper","Averager","mess"]
я нашел новое значение.источник
(reap/self.mult**self.waittime)**-0.810192835
всегда выше 1, то есть self.getRandom () никогда не выше.self.obj
. Чтобы увидеть некоторые примеры того, как его использовать, посмотрите на некоторые другие боты, которые его используют.цель
Мои шансы выиграть в беспорядке практически отсутствуют, поэтому самое время испортить всех остальных ботов как можно больше! :)
Этот бот функционирует подобно снайперу. Всякий раз, когда кто-то пожинает, он выбирает случайную цель от того, кто пожинает. Затем он просто ждет, пока та цель почти не сможет пожать снова, и выстрелит. Тем не менее, это не меняет фокус - как только вы были выбраны и заблокированы, вы не можете убежать :)
источник
EveryN
Я думаю, пришло время для моего второго бота прямо перед крайним сроком.
Этот бот будет:
n
раундов, гдеn
рассчитывается сn = 3 + ceil(self.waittime / self.lenBots)
Код:
Я не программирую на Python очень часто, поэтому, если вы видите какие-либо ошибки, дайте мне знать.
источник
subsequentRoundsWithoutReaps
доroundsWithoutReaps
; используется строчная буква с подчеркиванием для имени метода; и убрал скобки в операторах if. Благодарю.prevReap
и,lenBots
и такие и предполагаемые переменные, как camelCase, как в Java. ;) Ну, в любом случае, мы все равно должны работать. 2 вместо 4 пробелов с отступами, вероятно, вызвали бы некоторые проблемы, так что спасибо в любом случае.Продолжается: Мой проект по расширению T4T до каждого открытого KOTH.
Синица для Тат
Око за п татов
Kevin
Просто чтобы держать тебя в тонусе.
источник
self.last
это не вещь, но вы можете сделатьself.obj.last
вещь! В любом случае, я добавлю всех трех ваших ботов для мемов +1Средний Джо
Я был вдохновлен Averager и создал бота, который вычисляет в среднем, сколько ходов требуется, прежде чем кто-то пожнет и попытается пожинать один ход до этого.
источник
HARDCODED
Да, это так.
Вместо усреднения по прошлым результатам используйте предварительно рассчитанное среднее значение для типичного прогона. В любом случае, со временем не станет лучше.
источник