O problema da diretora do colégio

Geek

Venho por meio deste compartilhar um problema deveras interessante que requereu algumas horas do meu dia para a programação. Escrevi-o há algum tempo a um amigo cursando ciência da computação que, sendo garoto de programa, certamente saberia apreciar o que fiz, e sou carente desse tipo de apreciação. O problema que me foi proposto em meu curso de física estatística foi o da diretora do colégio.

Aconteceu uma vez comigo, recebi, acho que na sexta série, um papel para escrever os nomes dos coleguinhas com que gostaria de estar ano seguinte. Escrevi os dois nomes que queria (era uma criança sozinha e com poucos amigos), entreguei e no ano seguinte estava na sala deles. Ainda, as salas não mudaram muito, o que é razoável, já que as pessoas tendiam a querer ficar com quem já estavam, achei que a diretora havia atendido aos pedidos individualmente, mas hoje penso que não. Vamos tentar entender a razão de, se a diretora fosse realmente levar aqueles papéis a sério, ela teria que aprender um pouco mais de física e informática.

Imagine-se uma diretora de colégio, responsável por preparar as classes para o próximo ano letivo. Como você é boazinha, decide deixar os alunos escolherem com quem eles querem ficar no próximo ano, então dá a possibilidade de eles escreverem em um papel nomes dos coleguinhas que mais querem encontrar no ano seguinte. Mas sendo uma diretora justa, você pergunta aos professores quais alunos seria melhor que não ficassem na mesma turma, uma “lista negra” de duplas que seria melhor que ficassem separados. Com essas duas informações: a preferência dos alunos e a lista negra dos professores, como determinar qual distribuição ideal de alunos?

Esse não é um problema fácil. Podemos pensar em tratar o problema brutalmente: listar todas as possibilidades e verificar qual satisfaz melhor às condições das listas, tanto a de preferência quanto a de exclusão, mas isso, com um número pequeno de alunos, logo atinge limites astronômicos. O número de configurações possíveis de sala será $2^{\text{numero de alunos}}$, com 100 alunos você teria algo perto de $10^{30}$ configurações. Meu processador i5 só aguenta algo perto de 10MIPS, o que me dá o direito de realizar $10^7$ instruções por segundo e eu precisaria de pelo menos $10^{23}$ segundos para fazer qualquer coisa com essas configurações, isso é mais que a idade do universo. Essa conta provavelmente está bem errada, mas acredito no argumento de que, para listar todos os casos possíveis, terei que investir mais que uma tarde em cálculos. Precisamos pensar em um jeito mais malandro.

Primeiro, vamos pensar no quadro teórico do problema e como implementar de maneira adequada. Eu quero um jeito prático de saber quantas condições uma configuração de alunos satisfaz e quantas ele viola. Vou atribuir pesos iguais à preferência dos alunos e à lista dos professores, poderiam ser diferentes, mas sou preguiçoso. Seja n o número de alunos. Tomo um vetor $S_n$ com $n$ coordenadas que podem valer 1 ou -1. Se $S_i=1$, então o aluno $i$ está na sala A. Se $S_i=-1$, o aluno $i$ está na sala B.

Em seguida, defino a matriz $J_{ij}$, que é $n\times n$. Ela contém a seguinte informação: $J_{ij} = 1$ se o aluno $i$ quer ficar com o aluno $j$. $J_{ij} = -1$ se não é legal que o aluno $i$ fique com o aluno $j$ e $J_{ij}=0$ se eles são indiferentes entre si. Eu poderia ter privilegiado a opinião dos professores atribuindo um peso muito negativo ao invés de -1, mas vamos dar uma chance as alunos e atribuir pesos iguais às preferências dos alunos e dos professores. Isso vai servir para calcular o quanto de “felicidade” a configuração gera. Se dois alunos estão na mesma sala e queriam estar na mesma sala, a felicidade aumenta. Se eles não podem estar na mesma sala e estão em salas separadas, a felicidade aumenta. Se estão em salas diferentes e queriam estar juntos, ela diminui. Mas como computar isso? Basta calcular: $J_{ij}\cdot S_i\cdot S_j$.

Se eles estão na mesma sala, o produto $ S_i\cdot S_j$ será 1 e, se querem estar na mesma sala, $J_{ij}$ será 1, então o resultado será 1. Se não podem e estão na mesma sala, o resultado será -1. Se não estão na mesma sala, o produto $S_i\cdot S_j$ é -1. Deu para entender que esse produto representa bem a “felicidade” gerada pelo estudo de um par de alunos. Precisamos, então somar $J_{ij}\cdot S_i\cdot S_j$ para todos os $i$’s e $ j$’s e isso dará a felicidade da configuração.

Mais uma vez, isso exige produtos e somas com $2^n$ configurações possíveis, é absolutamente impossível resolver esse problema na força bruta para mais de 50 alunos. Para tal, precisamos de um método mais eficiente, e eu escolho Monte Carlo.

O método de Monte Carlo é um dos mais poderosos e usados na física estatística para resolver esse tipo de problema impossível. Tomamos uma configuração inicial de classes aleatória (um vetor $S$ aleatório) e procedemos da seguinte forma:

  • Trocamos um aluno de sala (tiramos $i$ aleatório e fazemos $S_i\to -S_i$)
  • Checamos a felicidade da nova configuração.
  • Se aumentou, ele fica nessa sala nova.
  • Se diminuiu, ele volta para a primeira sala.

Você ficaria impressionado em saber que, com 50 alunos, eu consigo a configuração certa de $S$ em menos de 1000 iterações. Claro, tomei um $J$ agradável o suficiente para que eu soubesse qual a configuração certa e esse $J$ em particular provavelmente facilitou minha vida. Tomei a sala em panelinha: metade dela quer ficar entre si e não pode ficar com a outra metade. Eu esperava um S da forma $(1,1,\ldots ,1,-1,-1,\ldots ,-1)$, e o tenho rapidamente com esse algoritmo.

Sabendo um pouco mais de física, eu poderia te contar que os átomos possuem uma propriedade chamada spin, que pode apontar para cima (1) ou para baixo (-1). Em uma rede cristalina, os spins interagem e são capazes de definir muita coisa, como, por exemplo, se a rede será um imã ou não. O que acontece é que os spins sempre atingem uma configuração que minimiza a energia da rede, e essa energia é calculada se o material é antiferromagnético (os spins gostam de ficam em direções opostas) ou ferromagnético (eles preferem se alinhar). Em algumas redes, você até mistura esses dois tipos e calcular a magnetização total (o conjunto de todos os spins) pode parecer um inferno.

Mas a energia total é calculada da seguinte forma: você multiplica os spins para saber se estão alinhados ou não, se estão, o produto será positivo, se estão invertidos, o produto será negativo. E então você multiplica pelo fator $J_{ij}$, que vale 1 se o material é ferromagnético ou -1 se é antiferromagnético (ou 0 se os spins estão longe e não interagem). A energia total será a soma para todos os i’s e j’s de $J_{ij}\cdot S_i\cdot S_j$ onde $S_i$ é o spin da partícula $i$. A magnetização do sistema será a configuração de spins que minimiza essa energia. Ora, é difícil não ver que a magnetização de um material misto entre dia e ferromagnetismo é o exato mesmo problema que uma diretora de escola enfrenta ao escolher quais alunos ficarão em qual sala.

Esse método, Monte Carlo, parece quase milagroso, mas possui um problema grave. Não é o caso da matriz $J$ que escolhi, que é extremamente agradável, mas com algum outro $ J$ eu poderia ter um sério problema. Eu poderia atingir uma configuração em que trocar qualquer aluno de sala causaria uma queda na felicidade, mas que, se eu trocasse dois ou três, poderia ter um ganho. Esse tipo de situação é um “mínimo local” da felicidade, um defeito sério em Monte Carlo, que não pode escapar de um mínimo local e atingir a verdadeira configuração ideal de salas, pois ele só aceita ganhos reais e imediatos. Como podemos nos livrar disso? Ah, precisamos de uma adaptação de Monte Carlo, chamada “Algoritmo de Metrópolis”, mas isso fica para outro dia, a diretora da minha sétima série, pelo que escrevi, já terá bastante trabalho pela frente.

Uma ideia sobre “O problema da diretora do colégio

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *