Na China Imperial, as fileiras da sociedade não eram decididas por nascimento ou riqueza, mas pela capacidade de uma pessoa se destacar nos Exames Imperiais. O Imperador Jade, governante divino dos Céus, pediu que todos os seus súditos fossem examinados para determinar seu valor e a quem, em seguida, atribuir o mandato divino para governar a China.
Regras da burocracia:
- A Burocracia Divina consiste em classificações com número inteiro não negativas, começando com 0. Cada membro (bot) da burocracia pertence a uma classificação. Cada classificação pode conter muitos membros arbitrários, mas não pode estar vazia, a menos que todos os níveis acima estejam vazios
- No início do jogo, todos os membros têm classificação 0
- A cada turno, cada membro da burocracia deve responder a um exame. O exame consiste em adivinhar corretamente os valores booleanos de uma lista. O comprimento da lista é o número da classificação acima do membro.
- As perguntas do exame são preparadas por um membro aleatório da classificação acima. Os membros do mais alto nível recebem suas perguntas diretamente do
JadeEmperor
(veja abaixo) - Um membro que pontua pelo menos 50% em seu exame é elegível para Promoção. Um membro com pontuação inferior a 50% no exame é elegível para o Demotion.
- Um membro elegível para o Demotion tem sua classificação reduzida em um somente se houver um membro qualificado para Promoção na classificação abaixo para ocupar o seu lugar.
- Todos os membros elegíveis para a promoção têm sua classificação aumentada em um, desde que isso não a deixe vazia.
- Se nem todos os membros elegíveis puderem ser rebaixados ou promovidos, a preferência será para os de menor valor (para rebaixamento). pontuação mais alta (para Promoção). Os laços são quebrados aleatoriamente.
- A classificação de um membro só pode mudar em no máximo 1 a cada turno.
Regras do jogo:
- Cada bot receberá um ID aleatoriamente no início do jogo, que não será alterado ao longo do curso. A
JadeEmperor
tem o ID-1, todos os outros têm identificações não-negativos consecutivos, começando com 0. - Todos os bots competem ao mesmo tempo
- O jogo dura 100 turnos, a pontuação do bot é a sua classificação média ao longo desse tempo.
- A pontuação total é adquirida executando 1000 jogos e calculando a média dos resultados.
- Cada bot é uma classe Python 3 implementando as quatro funções a seguir:
ask(self,n,ID)
, que faz um exame retornando umlist
dos booleanos de comprimento n. ID é o ID do bot que precisa adivinhar essa lista.ask()
pode ser chamado várias vezes durante uma única rodada para qualquer bot, mas também não.answer(self,n,ID)
, que é uma tentativa de responder a um exame retornando umlist
dos booleanos de comprimento n. ID é o ID do bot queask()
gerou o exame.answer()
é chamado exatamente uma vez por rodada para cada bot.update(self,rankList,ownExam,otherExams)
é chamado assim que o Controlador executa todas as Pro e Demotions. Seus argumentos são: Uma lista de números inteiros, listando todas as classificações por ID de todos os bots; uma tupla, composta por duas listas, primeiro as perguntas do exame, depois as respostas que o bot deu (caso se tenha esquecido); em seguida, uma lista de tuplas, consistindo igualmente em pares de respostas para exames, desta vez para todos os exames que o bot distribuiu.__init__(self, ID, n)
passa ao bot seu próprio ID e o número de bots concorrentes.
- As classes têm permissão para implementar outras funções para uso privado
- Definir explicitamente outras variáveis e usá-las para armazenar dados sobre exames anteriores é explicitamente permitido.
- Os meta-efeitos de programação são proibidos, significando qualquer tentativa de acessar diretamente o código de outros bots, o código do Controlador, causando Exceções ou similares. Este é um concurso de estratégias para os exames, não de hackers de código.
- Bots que tentam ajudar um ao outro são explicitamente permitidos, desde que não o façam por meio de efeitos, mas apenas pelas informações passadas
update()
- Outros idiomas são permitidos apenas no caso de serem facilmente convertidos para Python 3.
- O numpy da biblioteca será importado como
np
. A versão é 1.6.5, o que significa que usa a antiga biblioteca aleatória. Se você possui o numpy 1.7, as funções antigas estão disponíveis emnumpy.random.mtrand
para teste. Lembre-se de remover o mtrand para envio. - Se um bot causa uma exceção durante o tempo de execução, é desqualificado. Qualquer bot cujo código seja tão ofuscado que seja impossível dizer se gera uma lista de comprimento n quando
ask()
ouanswer()
é chamado também será desqualificado preventivamente. Um bot que me obriga a copiar cópias em profundidade recebe -1 na pontuação. - Os nomes das classes precisam ser exclusivos
- São permitidos vários bots por pessoa, mas apenas a versão mais recente será obtida dos bots atualizados iterativamente.
- Como parece haver alguma confusão sobre a semelhança do bot:
- Você não tem permissão para publicar uma cópia de outro bot. Essa é a única brecha padrão que realmente se aplica a esse desafio.
- Você tem permissão para compartilhar código com outros bots, incluindo bots de outras pessoas.
- Você não tem permissão para enviar um bot que difere de outro apenas por uma alteração trivial na estratégia (como uma alteração na semente para a geração de perguntas), a menos que você possa provar que o número desses bots de cópia carbono é o mínimo necessário para obter êxito. promulgação de sua estratégia (geralmente serão dois bots para uma cooperação).
Bots de exemplo:
O JadeEmperor
é sempre parte do jogo, mas não compete; ele serve como gerador para exames de bots de classificação mais alta. Seus exames são aleatórios, mas não uniformes, para permitir aos robôs inteligentes uma maneira de avançar.
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]
O Bêbado produz exames e respostas de forma completamente aleatória. Ele fará parte do jogo.
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
O plágio apenas copia os exames anteriores. Ele também fará parte do jogo.
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]
Código do controlador disponível aqui . Para testar, você pode colocar sua própria classe em um arquivo Contestants.py na mesma pasta e eles serão importados.
O Chatroom pode ser encontrado aqui .
Os exames começam!
Pontuação atual, em maior precisão (10.000 execuções) para 20 de outubro:
Os concursos serão realizados com cada nova inscrição no futuro próximo.
ID, n
do outro método n, ID
?