Instituto Superior Técnico Licenciatura em Engenharia Informática e de Computadores Procura e Planeamento 1o¯ Projecto Semestre de 2004/2005 O objectivo deste projecto é desenvolver um programa que resolva problemas de uma versão modificada do Shisen-Sho recorrendo a várias técnicas de procura, efectuando uma comparação entre o seu funcionamento e desempenho. Apresentação do jogo O Shisen-Sho 1 (Figura 1) é um jogo do estilo Mahjongg cujo objectivo é remover todas as peças do tabuleiro. Duas peças só podem ser removidas se estiverem reunidas duas condições: 1. As peças são iguais; 2. As peças podem ser ligadas com até três linhas (formando ângulos de 90o entre elas) que não se sobreponham a outras peças. Através da observação da Figura 1 verifica-se que alguns dos movimentos permitidos são a remoção dos char6 na última linha (primeira e terceira colunas) ou dos char8 na terceira linha. Exemplos de movimentos não permitidos são a remoção dos char7 na primeira coluna e na primeira linha (são necessárias 4 linhas para unir as duas peças) ou a remoção dos circle2 na quinta coluna (não existe um caminho livre entre as peças). Os alunos são aconselhados a experimentarem o jogo Shisen-Sho de modo a familiarizarem-se com esta regra e adquirir conhecimento heurı́stico para o trabalho. À semelhança do que acontece por exemplo com as cartas, as peças do Shisen-Sho pertencem a determinados naipes. Assim, vão ser considerados os seguintes naipes: Characters, Bamboos, Circles, Dragons, Seasons e Flowers 2 . A Tabela 1 mostra as peças que devem ser consideradas no jogo e os seus respectivos naipes. Um jogo não tem necessariamente que conter todas as peças. 1 Os screenshots apresentados foram retirados do jogo Shisen-Sho 1.5.0 da distribuição de Linux Fedora Core 2. 2 Há ainda quem considere um naipe adicional, designado Winds. 2 Figura 1: Um tabuleiro de Shisen-Sho. Naipe Characters Bamboos Circles Dragons Seasons Flowers Peças char1, char2, char3, char4, char5, char6, char7, char8, char9 bamboo1, bamboo2, bamboo3, bamboo4, bamboo5, bamboo6, bamboo7, bamboo8, bamboo9 circle1, circle2, circle3, circle4, circle5, circle6, circle7, circle8, circle9 red-dragon, white-dragon, green-dragon autumn-tree, spring-tree mum, orchid, bamboo, plum Tabela 1: Lista de naipes e peças do Shisen-Sho 3 A versão do Shisen-Sho que vamos considerar usa um sistema de pontuação em que a eliminação de um par de peças resulta na atribuição de pontos. O número de pontos obtidos com a remoção de um par corresponde ao produto do peso do naipe pelo número de pares que faltam remover. Os pesos de cada naipe podem ser consultados na Tabela 2. P ontuacaoi = P eso(N aipe(P eca)) ∗ N umeroP aresF altaRemoveri (1) Por exemplo, se tivermos um tabuleiro de dimensão 14x6 (ou seja com 42 pares) e na primeira jogada eliminarmos um par de cı́rculos, obtemos uma pontuação de 2*41=82 na jogada corrente. Naipe Character Circle Bamboo Dragon Flowers Seasons Peso 1 2 3 4 5 6 Tabela 2: Pesos de cada naipe a considerar Para além da pontuação que se vai acumulando à medida que os pares de peças vão sendo removidos, há ainda a considerar o bónus no caso de se conseguir remover todas as peças do tabuleiro. Nestas condições a pontuação corrente é multiplicada por 2. Neste problema, a escolha da ordem com que se eliminam os pares de peças é fundamental para a obtenção de uma solução de qualidade. Trabalho a desenvolver O projecto deve ser feito por grupos de dois alunos. Não se aceitam, sob nenhum pretexto, grupos de três ou mais alunos. Para os alunos com avaliação em regime M, o projecto é individual. O projecto é constituı́do por três partes: 1. Escolha e implementação das estruturas de dados relevantes para a representação do domı́nio apresentado 2. Implementação de heurı́sticas e estratégias que permitam a resolução de problemas de Shisen-Sho. 3. Comparação das várias estratégias de procura utilizadas para resolver os problemas. 4 Código Lisp fornecido Para a realização deste projecto devem ser utilizados os algoritmos de procura, desenvolvidos em ANSI Common Lisp, disponı́veis no site da cadeira. O código fornecido encontra-se no ficheiro procura.lisp. Este contém a implementação de vários algoritmos de procura. O funcionamento dos mesmos encontra-se descrito em procura.txt. O mais importante é compreender para que servem, não perceber exactamente como é que as funções estão definidas. É ainda fornecido código (ficheiro freecode.lisp) que permite testar, dado um tabuleiro e duas posições, se existe um caminho livre entre elas usando no máximo três linhas ou não. A descrição do modo de uso deste código está no ficheiro freecode.txt. Implementação A implementação do algoritmo deve ser efectuada na linguagem LISP (ou CLOS). A função seguinte deve, obrigatoriamente, ser definida com o nome, lista de argumentos e valor de retorno aqui especificados: • solve-shisen: Esta função recebe um tabuleiro no formato descrito em seguida e retorna os seguintes valores: – A lista com as peças removidas do tabuleiro pela ordem mais adequada (formato descrito em seguida); – A configuração final do tabuleiro; – O tempo gasto na procura; – O número de nós gerados; – O número de nós expandidos. Formato do Tabuleiro A função solve-shisen recebe, como argumento, a configuração do tabuleiro a resolver. Esse argumento deve ser um array bi-dimensional de dimensão arbitrária em que uma casa não ocupada no tabuleiro é representada por nil. Uma casa que corresponde a uma peça é representada pelo sı́mbolo de keyword :<nome da peça>. Os nomes das peças são aqueles que estão indicados na coluna Peças da Tabela 1. Por exemplo, :char1, :char2, :bamboo7, :autumn-tree, :circle5, etc. Um exemplo de um tabuleiro muito simples, é o seguinte: (defconstant prob1 #2A((:char1 :bamboo1 :plum :plum) (:char2 :bamboo2 :char1 :mum) (:mum :char2 :bamboo1 :bamboo2))) 5 Representação dos Resultados A lista de remoção das peças que será retornada pela função solve será constituı́da por listas de dois elementos em que cada elemento tem as coordenadas de uma das peças do par removido. As coordenadas de uma peça são uma lista de 2 inteiros não negativos que representam respectivamente a linha e a coluna da peça (à primeira linha/coluna corresponde o valor 0). A seguinte lista resolve o problema prob1: (((0 ((0 ((0 ((1 ((1 ((2 2) 0) 1) 1) 0) 0) (0 (1 (2 (2 (2 (1 3)) 2)) 2)) 3)) 1)) 3))) O primeiro par removido é o plum na primeira linha. O programa entregue deve estar devidamente testado e compilar e correr sem necessidade de alterações no interpretador CMUCL em UNIX/LINUX (por exemplo, no MEGA). Toda e qualquer alteração necessária para que o programa funcione será penalizada com um valor. Análise de Resultados Devem ser testadas todas as técnicas de procura fornecidas no ficheiro “procura.lisp”. Adicionalmente, novas estratégias que facilitem a resolução dos problemas podem ser desenvolvidas. Estas podem incluir variações aos algoritmos básicos de procura, novos algoritmos de procura, estratégias hı́bridas, macro-operadores, sub-objectivos, etc. A análise do problema e dos primeiros resultados obtidos deverá fornecer indicadores quanto a abordagens válidas. Os alunos deverão desenvolver pelo menos uma abordagem distinta das que estão implementadas no ficheiro procura.lisp. Esta abordagem até pode apenas consistir em modificações do ficheiro procura.lisp, desde que devidamente justificadas e analisadas. Para as técnicas de procura informadas, são necessárias heurı́sticas. Devem ser apresentadas pelo menos três heurı́sticas de desempenho relevante. Essas heurı́sticas devem, tanto quanto possı́vel, basear-se em ideias distintas (heurı́sticas que variam apenas em constantes, por exemplo, são consideradas a mesma heurı́stica). O desempenho dos vários algoritmos de procura utilizados, bem como das heurı́sticas e das estratégias desenvolvidas deve ser discutido no relatório, fazendo uma comparação dos resultados obtidos para alguns problemas de Shisen-Sho. Não é necessária nem desejável a apresentação exaustiva no corpo do relatório dos resultados para todos os problemas considerados. A discussão deve limitar-se a problemas que 6 salientem caracterı́sticas ou limitações relevantes do trabalho desenvolvido. Os alunos são encorajados a criar novos problemas, para além dos fornecidos como exemplo, que sejam adequadas para ilustrar aspectos interessantes da discussão. O relatório do projecto deve incluir ainda: • A descrição das estruturas de dados desenvolvidas e as razões subjacentes ao seu desenvolvimento; • A descrição das heurı́sticas desenvolvidas e as razões subjacentes ao seu desenvolvimento; • A descrição das estratégias implementadas e as razões subjacentes ao seu desenvolvimento; • As opções tomadas durante o desenvolvimento do projecto; • Uma discussão sobre a forma de conseguir obter melhores resultados, indicando genericamente o tipo de heurı́sticas/estratégias a desenvolver para isso. Ainda quanto ao relatório, convém salientar que a legibilidade do mesmo (para a qual contribuem não só o layout como a correcção ortográfica a construção das frases e a fluidez do discurso) é de importância capital para a correcta compreensão do seu conteúdo. Devem evitar-se frases complexas (a utilização da voz passiva, de duplas negativas, etc.). Todas as figuras e gráficos apresentados devem ser legı́veis e estar adequadamente legendados. Alunos com avaliação em regime M Os alunos com avaliação em regime M devem efectuar o projecto individualmente. Alternativamente, podem apresentar ao corpo docente da cadeira a descrição de um novo domı́nio para o projecto. Este será aprovado se considerado de complexidade e relevância suficientes. A apresentação de propostas pode ser efectuada até uma semana após a data de disponibilização do presente enunciado. Entrega dos Projectos e Prazos Entrega Intercalar A entrega intercalar será feita no dia 27 de Novembro até às 15h. Esta entrega deve incluir um relatório muito simples em formato texto (uma página A4, no máximo) que descreva o trabalho realizado até ao momento. Para além do ficheiro txt com o relatório, deve ser enviado por e-mail para [email protected] o código desenvolvido. 7 Nesta entrega intercalar deverão estar a funcionar as procuras não informadas, bem como as procuras informadas do ficheiro procura.lisp. Nesta fase basta existir apenas uma heurı́stica implementada. A entrega intercalar terá um peso de 20% na nota final do projecto. Entrega Final O projecto deve ser entregue até às 15 horas do dia 11 de Dezembro de 2004 na portaria do INESC-ID e deverá constar do seguinte: • Uma versão do projecto entregue on-line. O código desenvolvido em cada projecto será executado para verificação da sua correcção. Por este motivo, é extremamente importante que a função pedida neste enunciado exista e siga a interface definida. Não é necessário entregar o ficheiro procura.lisp se este não tiver sofrido alterações. Oportunamente, serão dadas mais indicações sobre a forma de entrega dos projectos por via electrónica. • Uma listagem completa do código do projecto devidamente comentada e paragrafada (Nota: o tipo de letra utilizado na listagem deve ser monospace, como, por exemplo, Courier ou Monaco); • Um relatório do projecto, cujo formato será oportunamente fornecido pelo corpo docente da cadeira. A listagem e o relatório do projecto devem ser entregues dentro de uma capa ou encadernados, apresentando visivelmente o grupo, número e nome dos alunos a que corresponde. Projectos que não sejam entregues nestas condições serão penalizados com três valores. Projectos iguais, ou muito semelhantes, serão classificados com 0 (zero) valores. O corpo docente da cadeira será o único juiz do que se considera ou não copiar num projecto. Critérios de avaliação Os factores mais importantes para a classificação do projecto são: • Execução correcta e elegância do programa. • Eficiência das estruturas de dados escolhidas para a representação do problema. • Qualidade das heurı́sticas e estratégias desenvolvidas. • Qualidade do relatório descrevendo o trabalho desenvolvido e os resultados e conclusões obtidos. 8 Novidades do Projecto No caso de haver novidades relativas ao projecto, estas serão afixadas na página da cadeira, pelo que esta página deve ser visitada com frequência.