Estou tentando escrever um solucionador em C # .NET para um jogo conhecido como Flowerz. Para sua referência, você pode reproduzi-lo no MSN, aqui: http://zone.msn.com/gameplayer/gameplayer.aspx?game=flowerz . Estou escrevendo por diversão, não para qualquer tipo de tarefa ou qualquer coisa relacionada ao trabalho. Por esse motivo, o único limite é o meu computador (um núcleo intel i7, com 8 GB de RAM). Não precisa ser executado em nenhum outro lugar, no que me diz respeito.
Em suma, suas regras são assim:
- Há uma fila cheia de flores coloridas. Seu comprimento é arbitrário
- A fila não pode ser influenciada
- A fila é gerada no início do nível
- As flores têm uma ou duas cores.
- Se houver duas cores, haverá uma cor externa e uma cor interna. No caso de duas cores, a cor externa é usada para correspondência.
- Se houver uma correspondência, a cor externa desaparecerá e a flor agora será uma única cor com a mesma cor da flor interna
- O objetivo do jogo é criar partidas de três (ou mais) da mesma cor
- Quando uma flor de uma única cor faz parte de uma partida, é removida do campo de jogo, criando um espaço vazio
- Você pode combinar uma flor de cor única com a cor externa de uma flor de duas cores. Nesse caso, a flor de uma cor desaparece, a cor externa da flor de duas cores desaparece e a cor interna permanece
- Você vence a rodada quando a fila está vazia e há pelo menos um espaço vazio sobrando
- Jogos em cascata são possíveis. Uma cascata ocorre quando três (ou mais) flores externas desaparecem e quando suas cores internas formam outra cadeia de 3 (ou mais flores).
- O campo de jogo é sempre 7x7
- Alguns espaços no campo são cobertos por pedras
- Você não pode colocar flores nas rochas
- A fila também pode conter uma pá que você pode usar para mover qualquer flor colocada para um espaço desocupado
- Você precisa usar a pá, mas na verdade não precisa mover a flor: é perfeitamente legal colocá-la de volta de onde veio
- A fila também pode conter uma borboleta colorida. Quando você usa essa borboleta em uma flor, a flor fica com a cor da borboleta
- A aplicação de uma borboleta a uma flor com duas cores resulta na obtenção de apenas uma única cor, a saber, a da borboleta
- Você pode desperdiçar a borboleta em um espaço vazio ou em uma flor que já tenha essa cor
- Limpar o campo não ganha o jogo
O objetivo do solucionador é simples: encontre uma maneira de esvaziar a fila, com o maior número possível de espaços restantes no campo de jogo. Basicamente, a IA joga o jogo para mim. A saída do solucionador é uma lista com os movimentos encontrados. Não estou interessado em marcar, mas em sobreviver o maior tempo possível, portanto, estou interessado nos movimentos que deixam o maior número possível de espaços abertos.
Desnecessário dizer que o espaço de pesquisa cresce rapidamente quanto maior a fila, de modo que uma força bruta está fora de questão. A fila começa às 15 e cresce com 5 a cada dois ou três níveis, se bem me lembro. E, é claro, colocar a primeira flor em (0,0) e a segunda em (0,1) é diferente de colocar a primeira em (1,0) e a segunda flor em (0,0), especialmente quando o campo já está preenchido com flores de uma rodada anterior. Uma decisão tão simples pode fazer a diferença em fazê-lo ou não.
As perguntas que tenho são as seguintes:
- Que tipo de problema é esse? (pense em vendedor ambulante, mochila ou algum outro problema combinatório). Saber disso poderia tornar meu Google-fu um pouco melhor.
- Que tipo de algoritmo poderia me dar bons resultados, rápido?
Com relação a este último: no começo, tentei escrever meu próprio algoritmo heurístico (basicamente: como eu o resolveria se eu conhecesse a fila?), Mas isso resulta em muitos casos extremos e correspondência de pontuação que posso perder.
Eu estava pensando em usar um algoritmo genético (porque pelo menos sei como usá-lo ...), mas estou tendo alguns problemas para decidir sobre uma representação binária do quadro. Depois, há o problema do cruzamento, mas isso pode ser resolvido com um operador de cruzamento ordenado ou um tipo semelhante de operação.
Meu palpite é que o solucionador deve sempre conhecer a configuração da placa e a fila que está tentando esvaziar.
Conheço alguns outros algoritmos heurísticos, como redes neurais e sistemas lógicos nebulosos, mas não tenho experiência para saber qual é o melhor aplicável ou se existem outros que são mais adequados para a tarefa em questão.