В имперском Китае звания в обществе определялись не рождением или богатством, а способностью человека преуспеть в экзаменах императора. Нефритовый император, божественный правитель Небес, призвал всех своих подданных осмотреть, чтобы определить их ценность, и кому в дальнейшем дать Божественный мандат на управление Китаем.
Правила бюрократии:
- Божественная бюрократия состоит из неотрицательных целочисленных рангов, начиная с 0. Каждый член (бот) бюрократии принадлежит одному рангу. Каждый ранг может содержать произвольно много членов, но не может быть пустым, если все ранги выше не пусты
- В начале игры все участники имеют ранг 0
- Каждый ход, каждый член бюрократии должен ответить на экзамен. Экзамен состоит из правильного угадывания логических значений списка. Длина списка - это номер ранга над членом.
- Экзаменационные вопросы подготовлены случайным членом ранга выше. Члены высшего ранга получают свои вопросы непосредственно от
JadeEmperor
(см. Ниже) - Участник, набравший не менее 50% на экзамене, имеет право на повышение. Участник, набравший менее 50% на экзамене, может быть понижен в должности.
- У участника, имеющего право на понижение в должности, его ранг уменьшается на единицу только в том случае, если на его место претендует участник, имеющий право на повышение в звании ниже.
- Всем участникам, имеющим право на повышение по службе, свой ранг повышается на единицу до тех пор, пока это положение не оставляет пустым.
- Если не все правомочные участники могут быть понижены в должности или повышены в должности, предпочтение отдается тем, кто имеет наименьшее значение (для понижения в должности), соответственно. наивысший (для продвижения) балл. Галстуки рвутся случайно.
- Ранг участника может меняться не более чем на 1 каждый ход.
Правила игры:
- Каждому боту будет случайным образом присвоен идентификатор в начале игры, который не изменится в течение его хода.
JadeEmperor
Имеет идентификатор -1, а все остальные имеют последовательные идентификаторы неотрицательных, начиная с 0. - Все боты соревнуются одновременно
- Игра длится 100 ходов, оценка бота - это его среднее звание за все время.
- Общий балл получается путем запуска 1000 игр и усреднения результатов.
- Каждый бот представляет собой класс Python 3, реализующий следующие четыре функции:
ask(self,n,ID)
, который делает экзамен, возвращаяlist
логическое значение длины n. ID - это идентификатор бота, который должен угадать этот список.ask()
может быть вызван много раз в течение одного раунда для любого бота, но также и вовсе.answer(self,n,ID)
, которая является попыткой ответить на экзамен, возвращаяlist
логическое значение длины n. ID - это идентификатор бота,ask()
сгенерировавшего экзамен.answer()
вызывается ровно один раз за раунд для каждого бота.update(self,rankList,ownExam,otherExams)
вызывается после того, как контроллер выполнил все про- и понижения. Его аргументы: список целых чисел, перечисляющий все ранги по идентификатору всех ботов; кортеж, состоящий из двух списков, сначала экзаменационные вопросы, затем ответы, которые дал бот (на случай, если он забыл); затем список кортежей, аналогично состоящих из пар экзамен-ответ, на этот раз для всех экзаменов, которые раздает бот.__init__(self, ID, n)
передает боту свой собственный идентификатор и количество конкурирующих ботов.
- Классы могут реализовывать другие функции для частного использования.
- Определение дополнительных переменных и их использование для хранения данных о прошедших экзаменах разрешено в явном виде.
- Запрещены метаэффекты программирования, то есть любые попытки прямого доступа к коду других ботов, к коду контроллера, вызывающие исключения или аналогичные. Это конкурс стратегий для экзаменов, а не взлома кода.
- Боты, пытающиеся помочь друг другу, явно разрешены, если они делают это не через метаэффекты, а исключительно посредством информации, передаваемой через
update()
- Другие языки разрешены только в том случае, если они могут быть легко преобразованы в Python 3.
- Библиотека NumPy будет импортирована как
np
. Версия 1.6.5 означает, что она использует старую случайную библиотеку. Если у вас numpy 1.7, старые функции доступныnumpy.random.mtrand
для тестирования. Пожалуйста, не забудьте убрать mtrand для отправки. - Если бот вызывает исключение во время выполнения, он дисквалифицируется. Любой бот, код которого настолько запутан, что невозможно определить, генерирует ли он список длины n, когда
ask()
илиanswer()
вызван, также будет дисквалифицирован. Бот, принуждающий меня к глубокому копированию, получает -1 на счету. - Имена классов должны быть уникальными
- Допускается использование нескольких ботов на человека, но из итеративно обновленных ботов будет взята только последняя версия.
- Поскольку, похоже, существует некоторая путаница в отношении сходства ботов:
- Вы не можете опубликовать копию другого бота. Это единственная стандартная лазейка, которая действительно применяется в этой задаче.
- Вам разрешено делиться кодом с другими ботами, включая ботов других людей.
- Вам не разрешено представлять бота, который отличается от другого только тривиальным изменением стратегии (например, изменением начального числа для генерации вопроса), если вы не можете доказать, что количество таких копий-ботов является минимально необходимым для успешного выполнения. принятие их стратегии (обычно это два бота для сотрудничества).
Пример ботов:
JadeEmperor
Всегда является частью игры, но не конкурирует; он служит генератором для экзаменов ботов высшего ранга. Его экзамены являются случайными, но не единообразными, чтобы позволить умным ботам продвигаться вперед.
class JadeEmperor:
def __init__(self):
pass
def ask(self,n,ID):
num=min(np.random.exponential(scale=np.sqrt(np.power(2,n))),np.power(2,n)-1)
bi=list(np.binary_repr(int(num),width=n))
return [x=='0' for x in bi]
Пьяница производит экзамены и ответы совершенно случайно. Он будет частью игры.
class Drunkard:
def __init__(self,ID,n):
pass
def ask(self,n,ID):
return list(np.random.choice([True,False],size=n,replace=True))
def answer(self,n,ID):
return list(np.random.choice([True,False],size=n,replace=True))
def update(self,rankList,ownExam,otherExams):
pass #out
Плагиатор только копия предыдущих экзаменов. Он также будет частью игры.
class Plagiarist:
def __init__(self,ID,n):
self.exam=[True]
def ask(self,n,ID):
return (self.exam*n)[0:n]
def answer(self,n,ID):
return (self.exam*n)[0:n]
def update(self,rankList,ownExam,otherExams):
self.exam=ownExam[0]
Код контроллера доступен здесь . Для тестирования вы можете поместить свой собственный класс в файл Contestants.py в той же папке, и они будут импортированы.
Чат можно найти здесь .
Экзамены начинаются!
Текущий счет с высокой точностью (10000 пробежек) за 20 октября:
Конкурсы будут проводиться с каждой новой записью в обозримом будущем.
ID, n
а другие аргументы метода n, ID
?