Modelagem do Problema de Configuração de Prateleiras Utilizando Programação em Lógica por Restrições Vinicius Oliverio1, Rafael S. Parpinelli1, Claudio C. de Sá1 1 Departamento de Ciência da Computação – Universidade do Estado de Santa Catarina (UDESC) – Campus Universitário Prof. Avelino Marcante s/n - Bairro Bom Retiro – CEP 89223-100 – Joinville – SC – Brasil. [email protected], {dcc2rsp,claudio}@joinville.udesc.br Abstract. The current article proposes a solution to the rack configuration problem, proposed by Pascal Van Hentenryck, using constraint logic programming, where the problem consists in connecting a set of electronic cards in racks with electronics sockets, where each connected card uses one socket and all cards must be connected, having as final goal to minimize the cost of the racks. Basing in the constraints the problem could be modeled and implemented, obtaining a fast and concise solution for this problem. Keywords: Programming, Constraints, Logic, Artificial Intelligence. Resumo. O presente trabalho propõe uma solução para o problema de configuração de prateleiras, proposto por Pascal Van Hentenryck, utilizando programação em lógica por restrições, onde esse problema consiste em conectar um grupo de cartões eletrônicos em prateleiras com conectores eletrônicos, onde cada cartão conectado na prateleira usa um conector e todos os cartões devem ser conectados, tendo como objetivo final minimizar o custo das prateleiras. Com base nas nessas restrições o problema pôde ser modelado e implementado, obtendo uma solução rápida e concisa para este problema. Palavras-chave: Programação, Restrições, Lógica, Inteligência Artificial. 1. Introdução O presente artigo traz uma proposta de modelagem do problema de configuração de prateleiras utilizando programação em lógica por restrições, do inglês Rack Configuration Problem, problema proposto por Pascal Van Hentenryck em 1999. Esse problema consiste em conectar um grupo de cartões eletrônicos em prateleiras com conectores eletrônicos. Cada cartão conectado na prateleira usa um conector [Hentenryck 1999]. O objetivo desse artigo é propor uma solução para esse problema utilizando a programação em lógica por restrições (PLR). A PLR é um paradigma de resolução de problemas, o qual utiliza a restrição no domínio dos valores das variáveis, na propagação de novos estados em seu processo de busca de uma solução. Consequentemente, há uma redução no espaço de estados que o problema pode assumir, haja visto que as restrições atuam sob a propagação na busca. Sob este paradigma, o projetista modela o problema declarando relações entre os objetos, de modo que o programa possa garantir que todas as relações são mantidas [Rossi1999]. O problema é modelado com base nas restrições, e depois de modelado deve ser implementado utilizando PLR, para posteriormente ser realizada uma experimentação e assim é possível comprovar se o algoritmo é eficiente, onde os testes são realizados com alguns casos retirados da literatura. 2. Programação em Lógica por Restrições Os programas de PLR são declarativos e permitem descrever vários problemas reais somente com a utilização de restrições. Essas são declarações que afirmam ou explicitam alguma relação entre as variáveis que modelam o problema. Mais precisamente, cada restrição especifica uma relação entre um subconjunto de objetos do problema, onde, cada objeto tem um conjunto de valores possíveis. Deste modo uma restrição restringe o espaço de possibilidades para um objeto [Rossi1999]. A descrição de um problema como um conjunto de restrições é essencialmente declarativo: este especifica o que programa deve fazer e não como. Várias técnicas de solução tem sido desenvolvidas com o objetivo de encontrar uma ou mais soluções para um problema de restrições, que é, atribuir valores a variáveis de modo que todas as restrições sejam satisfeitas ou consistentes [Rossi1999]. A ferramenta escolhida para o desenvolvimento do projeto foi o ECLiPSe [Apt 2007], por ser uma ferramenta bem documentada e simples de utilizar. A programação nessa ferramenta utiliza uma linguagem semelhante ao Prolog para a declaração dos predicados e restrições, e possui várias funções para facilitar a busca de soluções e a chegar ao objetivo. 3. Problema de Configuração de Prateleiras O problema de configuração de prateleiras é um problema proposto por Pascal Van Hentenryck em 1999. Esse problema consiste em conectar um grupo de cartões eletrônicos em prateleiras com conectores eletrônicos. Cada cartão conectado na prateleira usa um conector [Hentenryck 1999]. Cada cartão é caracterizado pela energia que ele necessita. Cada modelo de prateleira é caracterizado pela máxima energia que ele pode fornecer, o seu número de conectores, e seu preço [Hentenryck 1999]. O problema é decidir quantas das prateleiras disponíveis são necessários, de modo que: 1. Todo cartão é conectado em uma prateleira. 2. A demanda total de energia e o número de conectores necessários pelos cartões não excedam o disponível pela prateleira. 3. O preço total é minimizado. As entradas são dadas pelos modelos de prateleiras, que são uma tupla de quatro itens (Modelo, Energia Disponível, Número de Conectores e Preço) e pelos cartões a serem inseridos, que são uma tupla de três itens (Modelo, Energia Necessária e Quantidade de Cartões desse tipo). Exemplos de configuração de prateleiras e cartões podem ser observados na Tabela 1. Tabela 1. Exemplo de Configuração. Adaptado de (Kızıltan,2001). Como pode ser observado na Tabela 1, existem dois tipos de prateleiras e quatro tipos de cartões, os quais devem ser inseridos em um determinado número de prateleiras mas com a finalidade de minimizar o custo. 4. Modelagem do Problema Primeiramente deve-se modelar o problema, e com base nas variáveis e restrições de que todo cartão deve ser conectado, a demanda de energia exigida pelos cartões devem ser supridas e o preço deve ser otimizado, o problema pôde ser modelado. Cada prateleira possui um número correspondente, que aponta o número necessário de prateleiras desse modelo para resolver o problema, e em cima desses números é que as restrições são colocadas. Os valores de energia, número de conectores e preço das prateleiras foram declarados como listas. Por exemplo, para resolver a configuração mostrada na tabela 1, as restrições são as seguintes: 1. (Qt_prat_mod_1 * EnergiaPrateleira[1]) EnergiaPrateleira[2]) #>= EnergiaCartoes 2. (Qt_prat_mod_1 * ConectoresPrateleira[1]) ConectoresPrateleira[2]) #>= ConectoresCartoes + + (Qt_prat_mod_2 * (Qt_prat_mod_2 * 3. Custo #= (Qt_prat_mod_1 * PrecoPrateleira[1]) + (Qt_prat_mod_2 * PrecoPrateleira[2]) As variáveis Qt_prat_mod_1 e Qt_prat_mod_2 representam respectivamente a quantidade necessária da prateleira do modelo 1 e do modelo 2, a EnergiaPrateleira representa a energia máxima de cada prateleira, a EnergiaCartoes representa a energia necessária por todos os cartões somadas, a ConectoresPrateleira representa o número de conectores disponível em cada prateleira, a ConectoresCartoes representa o total de conectores necessários para conectar todos os cartões, o Custo é o custo que deve ser minimizado e a variável PrecoPrateleira representa os preços de cada prateleira. Com essas três restrições o problema pode ser resolvido utilizando-se de funções de busca e de minimização de valores, que com base nas restrições buscam o valor que satisfaz essas restrições e ainda minimizam o custo total. Para esse caso a solução encontrada foi de uma prateleira do modelo 1 e duas prateleiras do modelo 2, com essa configuração todas as restrições são satisfeitas e o custo é minimizado. Depois de modelado o problema, a sua implementação resultou em um programa em Eclipse [Apt 2007] com um total de quinze linhas aproximadamente. Este fato, demonstra a capacidade de representar modelos em PLR no Eclipse (Apt,2007), pois em quinze linhas todo o problema foi resolvido alcançando sempre a solução ótima. 5. Experimentos e Resultados Para a experimentação foram utilizadas quatro instâncias do problema, que foram retiradas de [Hnich 2005]. A primeira instância é a demonstrada na tabela 1, e como mostrado no tópico 2, a solução é a ótima e foi encontrada utilizando uma prateleira do modelo 1 e duas prateleiras do modelo 2, com um custo total de 550, como pode ser observado na tabela 2. Tabela 2. Solução 1. Adaptado de (Kızıltan,2001). A segunda instância do problema mantém as mesmas prateleiras mas a quantidade de cada cartão é dobrada em relação ao experimento um, e para esse experimento a solução é a ótima e foi encontrada utilizando duas prateleiras do modelo 1 e quatro prateleiras do modelo 2, com um custo total de 1100, como pode ser observado na tabela 3 Tabela 3. Solução 2. A terceir a instância do problema também mantém as mesmas prateleiras mas os cartões são alterados em relação ao experimento dois, resultado em um total de 6 tipos de cartões com as configurações: (1,10,20), (2,20,10), (3,40,8), (4,50,4), (5,75,2), (6,100,1). Para esse experimento a solução é a ótima e foi encontrada utilizando quatro prateleiras do modelo 1 e três prateleiras do modelo 2, com um custo total de 1200, como pode ser observado na tabela 4. Tabela 4. Solução 3. A quarta instância modifica tanto as prateleiras quanto os cartões em relação ao experimento um, totalizando 6 tipos de prateleiras e 6 tipos de cartões, as prateleiras modificadas tem a configuração: (1,50,2,50), (2,100,4,100), (3,150,8,150), (4,200,16,200), (5,250,32,250), (6,300,64,300) e os cartões modificados tem a configuração: (1,20,10), (2,40,6), (3,50,4), (4,75,2), (5,100,2), (6,150,1). Para esse experimento a solução é a ótima e foi encontrada utilizando uma prateleira do modelo 5 e três prateleiras do modelo 6, com um custo total de 1150, que pode ser observada na tabela 5. Tabela 5. Solução 4. Como pode ser observado, em todos os testes a solução ótima foi encontrada, provando assim a eficiência do resolvedor Eclipse. Um ponto a ser ressaltado é que o código fonte totalizou 15 linhas para a resolução desse problema e em comparação com [Hentenryck 1999] o tamanho foi reduzido pela metade. 6. Conclusões O presente trabalho propõe e explora uma solução para o problema de configuração de prateleiras utilizando programação em lógica por restrições, onde esse problema consiste em conectar um grupo de cartões eletrônicos em prateleiras com conectores eletrônicos, onde cada cartão conectado na prateleira usa um conector e todos os cartões devem ser conectados, tendo como objetivo final minimizar o custo das prateleiras. Com base nas restrições de que todo cartão deve ser conectado, a demanda de energia exigida pelos cartões devem ser supridas e o preço deve ser otimizado, o problema pôde ser modelado e a implementação pôde ser feita. Contudo, depois da experimentação ser realizada os resultados podem ser analisados, e conforme foi apresentado o algoritmo sempre encontrou a solução ótima, atingindo o seu objetivo respeitando todas as restrições. Em comparação com o código de [Hentenryckcv 1999], que utilizava a OPL(Optimization programming language), o código teve seu tamanho reduzido pela metade, onde ele possui 30 linhas com OPL e somente 15 com PLR, o que demonstra a objetividade do código e que com poucas linhas um problema pode ser resolvido, além de que em um computador com um processador Intel Core 2 Duo de 1.8Ghz e 2Gb de memória ram as soluções foram todas encontradas em menos de 0,5 segundos. 7. Referências (Apt,2007)Apt, K. R; Wallace, M. 2007. Constraint Logic Programming Using Eclipse. Cambridge University Press. 348 p. (Carro, 1998)Carro, Manuel. 1998. “An Introductory Course on Constraint Logic Programming”. Computer Science School, Technical University of Madrid, Madrid, Espanha. Disponível em: http://clip.dia.fi.upm.es/~vocal/public_info/seminar_notes/. Acesso em: 04 Nov. 09 (Hentenryck,1999)Hentenryck, Pascal Van. The OPL Optimization Programming Language. The MIT Press, 1999. 245 p. (Hnich,2005)Hnich, Brahim; Miguel, Ian. “CSPLib: a problem library for constraints”. Disponível em: http://www.csplib.org/ Acesso em: 06 Nov. 09. (Kızıltan,2001)Kızıltan, Zeynep; Hnich, Brahim. (2001). Symmetry Breakingin a Rack Configuration Problem. IJCAI-2001. Uppsala University, Uppsala, Suécia. (Rossi,1999)Rossi, Francesca. (1999). “Constraint Logic Programming’. ERCIM/Compulog Net workshop on constraints. Pafos, Chipre.