Compreendendo os requisitos
- Todos os jogadores têm um número limitado de inimigos adjacentes.
Primeiro, estamos falando sobre os pontos de reprodução dos jogadores, não sobre a posição atual dos jogadores em um determinado ponto do jogo. Apenas tirando isso do caminho.
Adjacente é bem definido quando falamos de um gráfico. Podemos pensar em um mapa que representa a navegabilidade no mapa - a partir de agora "o gráfico".
Se o nó can pode ter no máximo um ponto de desova, então falar sobre eles serem "adjacentes" faz sentido. Nota: Não restringirei os nós a terem no máximo um único ponto de desova, por motivos que serão aparentes posteriormente.
Para construir o gráfico, precisaremos considerar coisas como paredes, pontes, escadas, pontos de teletransporte ou até mesmo espaço de voo, se houver um jogador que possa voar. Cada nó representa um local que pode ser percorrido; cada conexão representa um movimento possível.
Nota: saiba o tamanho e a forma dos nós e trabalhe com nós realmente adjacentes. Não considere os nós um ponto. Não considere as conexões como tendo comprimento. Além disso, use nós convexos.
O gráfico poderia ter sido pré-compilado (o mapa foi criado por um designer); caso contrário, ele poderá ser criado rapidamente se o mapa for gerado aleatoriamente.
- Todos os jogadores têm chances iguais de encontrar inimigos adjacentes.
Vou assumir que os inimigos são outros jogadores. Novamente, apenas tirando isso do caminho.
Supondo que cada jogador faça um passeio aleatório, a probabilidade de encontrar um jogador em um determinado ponto - em um espaço plano, livre de obstáculos - será dada por uma função (gaussiana) da distância até o ponto de desova - a partir de agora "o função".
Como estamos trabalhando no gráfico, anotamos os valores no gráfico.
- O tamanho do mapa não precisa aumentar proporcionalmente ao número de jogadores.
Se tivéssemos a restrição de ter um único ponto de reprodução por nó, para adicionar mais jogadores, precisaríamos de nós menores. Se decidirmos o gráfico antes de sabermos quantos jogadores teremos, talvez tenhamos que subdividir nós para o jogo em particular.
- Essas limitações não são impostas com espaços intransitáveis arbitrários.
Não pretendo adicionar obstáculos para resolver o problema. Ao contrário , preciso trabalhar em torno dos obstáculos. Se eles não estivessem lá, a implementação seria mais simples.
Solução
Estamos tentando colocar N pontos de desova, de modo que a chance de encontrar outro jogador em todos esses pontos de desova seja igual.
Podemos obter uma medida do erro como a soma das diferenças das chances com a média das chances. Estamos tentando minimizar isso (na verdade, queremos torná-lo 0).
Para fazer isso, precisamos saber a chance de encontrar um jogador em cada nó do gráfico.
Para calcular essa chance, comece com zero. Como a chance de encontrar um jogador em qualquer nó, quando não há jogadores, é zero. E então, para cada ponto de desova, siga o gráfico adicionando à chance anotada o valor da função para o atual ponto de desova.
Nota 1: Adicionar ou mover um ponto de desova afetará a chance de encontrar um jogador em todo o mapa.
Nota 2: Manter o controle de quanto cada ponto de desova afeta a chance, facilitará as coisas.
Nota 3: Como os nós têm tamanho, o quão perto você pode chegar ao erro = zero depende do tamanho dos nós. Você pode ser mais preciso trabalhando com faixas de valores (chance mínima e máxima, dependendo da posição específica dos pontos de reprodução dentro do nó).
Coloque os pontos de reprodução aleatoriamente e comece a movê-los de maneira que o erro se torne menor (considere um movimento possível e, se o erro diminuir, mantenha-o, caso contrário, reverta-o). E continue fazendo isso até que não possamos melhorar mais (muitas iterações sem melhoria ou o erro é zero).
Nota 4: Ao mover um ponto de desova, você pode usar a chance de encontrar um jogador (excluindo o ponto de desova que você moverá) para selecionar aleatoriamente uma nova posição para um ponto de desova, para que a posição que tenha a chance de encontrar um jogador mais próximo a média é mais provável. Lembro que mover o ponto de desova afetará a média.
O comportamento esperado é que os pontos de desova muito próximos se afastem e os pontos de desova muito próximos se aproximem. Até que eles atinjam o equilíbrio.
Se, em qualquer iteração, você tiver vários pontos de geração em um nó (o que é improvável, pois eles tendem a se separar, mas possível se você tiver nós grandes o suficiente), divida o nó e continue resolvendo. Qualquer divisão do nó é válida.
A solução acima abordará error = zero, mas não é garantido que chegue a zero. Você pode executá-lo até atingir o mínimo local ... Em teoria, você pode dividir os nós para torná-lo exatamente zero ... No entanto, isso equivale a ajustar as coordenadas do ponto de reprodução!
Tente recozimento simulado para mover o ponto de desova dentro do nó. Embora, honestamente, provavelmente não valha a pena se preocupar com esse nível de detalhe.
Quero deixar claro que o resultado de um mapa plano livre de obstáculos não será distribuído de maneira uniforme. Em vez disso, se o mapa tiver arestas (ou seja, se não contornar), haverá mais pontos de desova mais próximos, porque os pontos no centro podem ser alcançados de mais direções, aumentando a chance de encontrar outros jogadores lá. Assim, pontos mais afastados perto do centro para compensar.