Postei essa pergunta anteriormente no stackoverflow, onde foi fechada como off-topic. Espero que sobreviva aqui.
No nosso ginásio de escalada, as rotas precisam ser redefinidas de tempos em tempos. As seguintes regras se aplicam:
- Temos suportes de escalada com várias cores diferentes em quantidades variadas. - Quando uma rota é definida em um setor, nenhuma outra rota da mesma cor deve ser definida nesse setor ou nos setores próximos para evitar confusão.
- Algumas combinações de cores devem ser evitadas em um setor, como branco / cinza ou vermelho / rosa.
- O objetivo é ter quatro rotas em cada setor, menos está ok se quatro violarem as regras acima.
Eu tentei duas abordagens diferentes até agora. O primeiro foi o Simulated Annealing, onde eu inicializei a parede com um padrão aleatório de cores (mas com um determinado peso de cor) e calculei um valor ruim para cada combinação de cores. Essa maldade também foi calculada para combinações entre um setor e seus vizinhos. Em cada iteração, uma rota escolhida aleatoriamente do pior setor foi trocada por uma rota de outro setor escolhido aleatoriamente. Isso mostrou algum tipo de convergência, mas o resultado não foi utilizável (ou seja, o estado resultante continha setores com cores duplas ou triplas).
Então, abordei o problema do lado oposto e comecei com uma parede vazia. Dessa vez, todas as cores tinham uma concentração que se deteriorava de um setor para os setores adjacentes. A concentração de cores semelhantes também foi aumentada, ou seja, uma rota vermelha aumentou a concentração de laranja em um setor e nas proximidades. Uma fonte aleatória ponderada de cores (o balde) me deu a próxima cor para a parede, que foi colocada no setor com a menor concentração dessa cor. Se uma concentração estava acima de um certo limite, a cor não era adicionada (mas recolocada no balde). Isso foi um sucesso parcial porque o estado do resultado não continha cores duplas - mas alguns setores estavam vazios ou continham apenas uma cor.
Então: Qual poderia ser um algoritmo apropriado para resolver esse problema, dadas as regras acima? Felizmente, adicionarei mais informações quando necessário.
Editar 1 - Mais informações:
- meu caso de teste tem 15 setores,
- cada setor deve conter 4 rotas
- o verdadeiro ginásio tem 3 edifícios com uma média de 50 setores cada
- alguns setores estão dispostos em torno de pilares, outros são conectados por telhados
- temos cerca de 10 cores diferentes de espera
- a altura dos setores varia entre 6 (seção do iniciante) e 20 metros (13 verticais + 7 no teto); portanto, consomem diferentes quantidades de porões. No entanto, a média é de cerca de 12 e isso pode ser considerado constante.
- existe uma quantidade limitada de cada cor, as quantidades não são iguais
- algumas cores são mais fáceis, outras mais difíceis (ou seja, podemos criar uma rota amarela de qualquer dificuldade, enquanto a criação de uma rota laranja muito fácil para as crianças será quase impossível)
- alguns setores são "mais fáceis", portanto cores fáceis devem ir para lá (isso é opcional, nossos criadores de rotas podem tornar as coisas mais difíceis ou fáceis em uma ampla variedade).
- podemos dizer com segurança quais cores combinam bem em um setor ou setores vizinhos e quais combinações não combinam. Há algumas surpresas, como branco e preto (combinação ruim): ambos ficam cinza enquanto borracha (sapatos) ou giz (mãos) são deixados neles.
- algumas cores de espera são combinações como violeta / branco (em um padrão listrado).
Edit 2: Algumas Perguntas sobre Algoritmos Genéticos
Agora baixei e compilei o ParadisEO e até recebi meu IDE (estou usando o Code :: Blocks) para compilar o exemplo do QuickStart. O ParadisEO oferece algoritmos genéticos com um único objetivo, bem como AG de múltiplos objetivos. A GertVdE sugeriu calcular a adequação de cada setor e maximizar a soma das adequações de todos os setores como um único objetivo. Eu também poderia maximizar a adequação de cada setor com uma AG de múltiplos objetivos? Seriam cerca de 50 objetivos.
Além disso, estou lutando com a definição de uma função de crossover sensível. Como a quantidade máxima de cada cor é fixa, o cruzamento pode levar a estados ilegais. Se eu permitir mais do que a quantidade máxima fornecida anteriormente, o padrão geral poderá convergir para uma repetição de combinações menos "difíceis", onde as cores problemáticas foram jogadas fora. Por outro lado, também posso descartar cores em excesso até atingir o máximo, tornando a função de crossover não conservadora.
(Eu sou completamente novo em algoritmos genéticos)