Eu tenho bots em uma formação retangular com linhas e colunas. Um problema surge quando um bot é adicionado ou removido da formação. Quando isso acontece, os robôs precisam se reorganizar para que a formação retangular ainda tenha aproximadamente a mesma proporção e seja o mais retangular possível. Como fazer isso?
Algumas ideias:
Quando um bot é adicionado ou removido, use o novo número total de bots e a proporção desejada desejada para calcular a nova largura e altura da formação que melhor se encaixa nessa proporção. De alguma forma, reorganize os robôs para se ajustarem às novas dimensões.
Quando um bot é removido, mova o bot que estava atrás dele para o seu lugar e continue até chegar ao final da formação. Então, mesmo fora da classificação traseira, tanto quanto possível, de alguma forma embaralhando os bots na classificação traseira.
Outra idéia que é completamente diferente é imitar a maneira como as estruturas das moléculas permanecem juntas. Faça com que cada bot queira estar cercado por outros quatro bots, atraindo os quatro bots mais próximos e repelindo o resto. Repelir todos os bots (incluindo os quatro) que estão muito próximos para garantir a separação usando a lei do quadrado inverso. Você também precisaria de uma força adicional para moldar toda a estrutura. Mas isso parece muito caro computacionalmente.
ATUALIZAÇÃO : Então, analisando a resposta de sarahm, criei uma boa função geral que fornece boas dimensões.
Primeiro resolvi a equação simultânea abaixo para largura e altura e depois arredondei as respostas.
width/height=aspect ratio of your choice
width*height=number of bots
Isso fornece o retângulo inteiro mais próximo dessa proporção para o seu número de bots. O retângulo mais próximo será na metade do tempo muito grande e na metade do tempo será muito pequeno (é claro que às vezes será correto, mas quem se importa com isso). Nos casos em que o retângulo é um pouco grande demais, nada precisa ser feito. O ranking traseiro acaba ficando quase cheio, o que é ideal. Nos casos em que o retângulo é um pouco pequeno demais, você tem problemas, porque esse pequeno excesso de excesso terá que ir para sua própria classificação, criando uma classificação com apenas alguns bots, o que não parece bonito. Há também casos em que a diferença é grande(maior que a metade da largura); nesse caso, adicione ou subtraia uma classificação para diminuir a diferença. Em seguida, quando o retângulo for muito pequeno, adicione uma coluna para torná-lo um pouco maior. Depois de fazer isso, parece que o back rank sempre terá pelo menos metade do número de bots que os outros.
ATUALIZAR
Depois de obter as dimensões, compare-as com as dimensões atuais. Se a fachada da nova dimensão for maior, para cada classificação, solte bots da classificação abaixo e empurre-os para a classificação atual até que o número de bots nessa classificação seja igual à fachada. Continue esse algoritmo até chegar à classificação de trás. Usando esse algoritmo, os bots se moverão para caber na nova dimensão com eficiência. Depois disso, eu simplesmente empurro o novo velho para a fila de trás. O algoritmo é um pouco diferente para os casos em que a nova fachada é menor, mas você pode descobrir!
Há mais dois problemas a seguir. Exclusão e um método de adição mais flexível, em que novos bots não são necessariamente atribuídos ao back rank, mas a posição mais próxima deles no momento em que são adicionados.