Injeção de Dependência: comparação de desempenho

No presente post procurar-se-á demonstrar uma comparação entre injeção de dependência de dois grandes Frameworks, o JSF e o Spring. Para efeito de comparação também foi testada uma versão do aplicativo web com JSF sem o uso de injeção de dependência.

No desenvolvimento Web, diferentemente do desenvolvimento de aplicativos para Desktop, os sistemas muitas vezes possuem dezenas de milhares de usuários simultaneamente, isso exige um grande desempenho das aplicações.

Sendo assim a verificação do desempenho de diferentes formas de implementações, utilizando JSF com e sem injeção de dependência, que é uma forma de IoC (Inversion of Control – Inversão de Controle), e Spring, é importante e aponta para possibilidades mais adequadas, considerando as diferenças de desempenho entre os frameworks citados.

Os sistemas serão submetidos a testes de stress e desempenho. Para realização desses testes foi utilizado a ferramenta JMeter, uma ferramenta que diante das crescentes necessidades por performance vem sendo muito utilizada. Apache JMeter pode ser usado para testar o desempenho tanto em recursos estáticos quanto dinâmicos (arquivos, Servlets, scripts Perl, Java Objects, Bases de Dados, Consultas SQL, servidores FTP e muito mais).

Para o presente trabalho foram realizados dois testes para cada sistema desenvolvido, primeiro com 1000 usuários e o segundo com 4000 usuários. Esses dois testes foram realizados da mesma maneira com os três sistemas desenvolvidos (Spring com IoC, JSF com e sem IoC). Foram realizados testes com o máximo de 4000 mil usuários pois, o sistema após esse número apresentava a exceção “java.lang.OutOfMemoryError: Java heap apace” tornando impossível a realização de testes com maior número de usuários.

Como pode ser visto logo abaixo, o JMeter permite entre outras características as seguintes:

Tempo da amostra – tempo de resposta da aplicação;

Desvio – dispersão dos valores em relação à média;

Porcentagem de erro – porcentagem de problemas nas respostas;

Vazão – o número de operações que o sistema é capaz de completar em um dado período de tempo;

Carga Máxima do servidor – uso do processador pelo servidor;

Memória Máxima do servidor – uso de memória pelo servidor.

Tabela 1: Comparativo de desempenho com 1000 threads

Item Spring JSF com IoC JSF sem IoC
Tempo da amostra 75ms 74ms 39ms
Desvio 49ms 40ms 19ms
% de erro 0 % 0% 0%
Vazão 19,8/seg 19,8/seg 19,8/seg
Carga Máx. servidor ~37% ~60% ~50%
Memória Máx. servidor ~75% ~100% ~98%

 

Tabela 2: Comparativo de desempenho com 4000 threads

Item Spring JSF com IoC JSF sem IoC
Tempo da amostra 41ms 39ms 39ms
Desvio 89ms 25ms 18ms
% de erro 0%  0% 0%
Vazão 18,1/seg 19,6/seg 19,8/seg
Carga Máx. servidor ~48% ~35% ~48%
Memória Máx. servidor 95% ~80% ~90%

Através dos dados obtidos com os testes é possível identificar onde cada abordagem de desenvolvimento obteve um melhor desempenho com respeito à performance. Na tabela 1 e 2, foram agrupados os principais quesitos com respeito ao desempenho da aplicação para que pudéssemos analisar de forma mais clara.
Tempo da Amostra – Com relação a tempo, que seria o tempo de resposta da aplicação, na tabela acima temos a média de cada um. Observamos que o JSF sem Injeção de Dependência obteve resultados um pouco melhores, sendo em média mais rápido.
A porcentagem de erro ou problemas ao acessar a aplicação foi de zero por cento em todas as abordagens apresentadas.
A Vazão não foi muito diferente entre um e outro ficando novamente o JSF sem IoC um pouco à frente dos demais, mas apenas no teste com 4000 usuários, sendo praticamente insignificante a diferença haja vista que a própria rede pode apresentar oscilações na transferência de dados.
Agora com relação ao servidor de aplicações Tomcat, a carga do sistema obteve resultados na faixa de 35% a 60%, entretanto, não somos capazes de inferir nada com relação, pois em todos os testes houve oscilações durante o intervalo observado, sendo, que o Spring conseguiu se manter mais estável. Com relação ao uso da memória também não houve muita diferença.
Os testes foram realizados com o grupo máximo de 4000 usuários devido a estouro de memória no sistema quando utilizado por um grupo maior de usuários, apresentando a seguinte exceção: “java.lang.OutOfMemoryError: Java heap apace”. Com o número de usuários máximo utilizado nos testes, embora tenha havido algumas diferenças nos resultados, os sistemas se comportaram bem, não gerando gargalos nem indisponibilidade. Podemos perceber diante disso que com a melhora cada vez maior das técnicas de desenvolvimento de Frameworks e linguagens de programação o nível de qualidade se mantém quase igual, claro havendo algumas metodologias e facilidades diferenciadas em cada um.

CONCLUSÃO

Com todas as metodologias e técnicas utilizadas atualmente no desenvolvimento de ferramentas para auxílio dos programadores de sistemas, e até mesmo a maior especialização e estudo por parte das pessoas envolvidas nesse processo de desenvolvimento, tornou-se possível, excluindo algumas especificidades, que os níveis dessas ferramentas, como já dito anteriormente, quanto a desempenho se tornem muito parecidas, não havendo uma diferença muito grande.

O presente trabalho mostrou exatamente que as funcionalidades básicas, como é o caso da injeção de dependência, já estão bem consolidadas na maior parte dos Frameworks, logo, salvo funcionalidade muito específica, que seja provida por apenas um Framework, qualquer um dos Frameworks demonstrados aqui seria muito importante para um sistema em desenvolvimento e não haveria grandes problemas por adotar um ou outro, notando apenas que a injeção de dependência é um padrão de projeto e como tal já foi provado por anos de experiência em desenvolvimento de software, que é a forma mais indicada para desenvolvimento de sistemas complexos por facilitar muito o trabalho, tendo sido utilizada uma versão sem injeção de dependência no trabalho apenas por questões comparativas (mesmo que fosse muito mais eficiente não seria indicada por muitos outros fatores).

 

Hudson – Integração Contínua

Hudson é uma ferramenta de integração continua que monitora a execução de trabalhos que envolvem diversas mudanças em um mesmo projeto de software. A ferramenta Hudson foca na construção e experimentação de projetos de software continuados, assim tornando mais fácil o trabalho de desenvolvedores na integração de alterações em seus projetos. Sendo que esta construção continua integrada faz com que aja um aumento de produtividade.

O Hudson também tem como foco a monitoria dos trabalhos, de forma completa, sendo eles locais ou externos, fazendo do Hudson uma ferramenta administrativa de suma importância no desenvolvimento e controle do software. Proporcionando um controle de qualidade eficiente.

Testes

Uma das principais funcionalidades do Hudson é a realização de testes nos sistemas submetidos à integração continua. Testes unitários tomam muito tempo do programador, às vezes se tornam complexos e demorados, ou às vezes são muitos com complexidade reduzida. O Hudson vem neste contexto como um legitimo servidor de testes, que pode receber inúmeros projetos, de vários servidores externos ou internos, que fazem a build de projetos.

Construção de projetos

Hudson suporta a construção e integração de inúmeros projetos, sendo assim várias equipes de desenvolvedores poderão fazer uso do mesmo servidor e aplicação Hudson, mas trabalhando em tarefas distintas. Também contando com diversos recursos automatizados como atualizar a sua cópia de trabalho antes de executar uma compilação, assegurando que um projeto desatualizado não seja novamente compilado na mesma versão.
Agendamento de tarefas e construções de projetos podem ser automatizadas, de forma que com uma configuração simples, tarefas básicas são executadas sem mais nenhuma configuração. Tarefas como a construção de projetos a cada intervalo de tempo determinado, fazer com que projetos não sejam construídos ao mesmo tempo, evitando conflitos, entre outros fatores que tornam a integração continua dinâmica e autônoma, economizando tarefas que seriam executadas manualmente por uam equipe de desenvolvimento.

Plugins

Ferramentas de verificação de erros e melhoria de desempenho, como o PMD, JUnit e outras ferramentas se fazem presentes no Hudson em forma de plugins. Esses plugins são facilmente encontrados dentro da própria plataforma, e podem ser integradas a qualquer construção de projeto, aumentando o repertorio de informações sobre determinada construção que foi realizada.
O Hudson nos proporciona um vasto campo de informações necessárias para o acompanhamento da produção. Geração de relatórios de utilização, testes unitários, tarefas entre outros fazem parte desse meio de integração. Assim podendo remeter arquivos externos para outras aplicações, por emails entre outras formas de compartilhamento de dados.

Controle de usuários

Por se tratar de um servidor que pode ser acessado por diversos usuários em uma rede interna ou externa, o Hudson também conta com um bom sistema de controle de usuários que acessarão a aplicação. A fim de conter quaisquer intrusos ou alterações irregulares nas tarefas. Sendo que a forma como o usuário usa a ferramenta pode ser analisada, através de diversas estatísticas.
O Hudson pode facilmente suprir a necessidade de projetos de pequeno e médio porte, executando até mesmo as tarefas mais básicas que economizam tempo do desenvolvedor e melhoram a qualidade do sistema. Mas o Hudson também é com certeza uma ferramenta completa para projetos de grande porte, suportando até mesmo vários servidores de projetos em paralelo. Centralizando toda a administração em apenas um servidor Hudson.

Site oficial: http://hudson-ci.org/

Tecnologia na educação

Vivemos o século XXI, e a sociedade atual, chamada de sociedade do conhecimento, não pode excluir nenhuma ferramenta que possibilite a produção e disseminação do mesmo. As tecnologias, como instrumento mediador de um bom trabalho docente, deve ganhar espaço nas escolas, e exige dos profissionais da educação, uma nova postura e cultura do processo de ensinar e aprender.

Muitas das escolas já dispõem de alguns equipamentos, mas a forma de utilizá-los ainda está pouco desenvolvida, ela precisa estar preparada para as futuras gerações que já surgirão na era informatizada, para ajudar e motivar o aluno a produzir conhecimento, a partir das inúmeras informações fornecidas pelos modernos meios de comunicação.

O ensino não pode mais basear-se apenas no livro didático. Ele deve desfrutar da poderosa e eficiente ferramenta que é a informática. O contato com esses novos meios, amplia os horizontes dos educadores e trás novas possibilidades pedagógicas. A escola deve garantir que todas as ferramentas que permitem atualização, modernização e informação sejam utilizadas.

Como instalar ou atualizar o plugin flash-player no Linux Educacional

O Mozilla Firefox é o navegador padrão do Linux Educacional, porém, ele não tem incluso o plugin Adobe Flash Player, que é necessário para visualizar com perfeição  páginas web que contêm animações desenvolvidas na linguagem Adobe Actionscript.

Este post tem como objetivo orientar a instalação do plugin Flash Player no navegador Mozilla Firefox, para usuários do Linux Educacional. Abaixo está descrito um passo-a-passo da instalação.

1. Primeiramente é necessário fazer o download do plugin, no próprio site da Adobe. No campo de seleção, escolha a opção .tar.gz para outro Linux. Posteriormente clicar em Baixe agora.

Download do plugin

2. Entrando na pasta onde salvou o plugin, irá localizar o arquivo com extensão .tar.gz, o que significa que o mesmo está compactado e é necessária a extração. A extração pode ser feita de duas formas, clicando com o botão direito do mouse e selecionando extrair aqui, ou então através do terminal, com o comando tar -vzxf nomedoarquivo.tar.gz .

3. Com a extração uma nova pasta será gerada, com o nome similar a flash-player, abra esta pasta e copie o arquivo libflashplayer.so.

4. Abra o gerenciador de arquivos modo super usuário,  clicando em menu LE, sistema, e selecionando gerenciador de arquivos (modo super usuário). Aparecerá uma tela requisitando uma senha, deve ser inserida a senha de super usuário.

5. Agora basta ir até a pasta /usr/lib/firefox/plugins. Enfatizo aqui que este caminho pode variar, por isto abra primeiramente o diretório /usr/lib, posteriormente localize a pasta firefox, que pode receber outros nomes similares, como por exemplo firefox3.0, dependendo da versão instalada. E por fim localize o diretório /plugins, onde deve ser colado o arquivo anteriormente copiado libflashplayer.so, caso já existir um arquivo com o mesmo nome, é porque já existe uma versão mais antiga do Flash Player instalada, então substitua este arquivo.

6. Para certificar-se de que o plugin foi instalado ou atualizado corretamente, feche todas as janelas do Firefox, e abra novamente. digite na barra de endereços about:plugins, e localize algo similar a Flash, e confira a versão.

Obs.: Este passo-a-passo foi testado apenas na versão 2.0, 3.0 e 4.0 do Linux Educacional. Na versão Linux Educacional para multiterminais, deve ser logado como professor para ter as permissões necessário à instalação. Processos similares devem funcionar para o sistema Ubuntu.

Injeção de Dependência no JSF 2

Como  já  é  do  conhecimento  de  qualquer  desenvolvedor,  cada  classe  em  Java  possui características  específicas  possuindo  seus  atributos  próprios  e  métodos  relacionados  com  suas características e funcionalidades  que precisará realizar. Em  qualquer  aplicação  Orientada  a  Objetos  muitas  vezes  é  necessário  que  uma  classe  use serviços de outras classes. Para que ocorra essa troca de funcionalidades é preciso que uma classe possua a referência da outra classe que deseja usar. Normalmente faríamos isso instânciando a classe ou seja daríamos um ‘new’ no nosso objeto, entretanto hoje será mostrada uma forma para se fazer isso através da Injeção de Dependência do JSF.

Um bom motivo para usarmos Injeção de Dependência em nosso projeto é o desacoplamento do nosso código,  facilidade para reuso e também facilidade para realizar testes.

A  partir  do  JSF  2  isso  ficou  muito  mais  simples  de  ser  feito,  podemos  usar  a  Injeção de Dependência  disponibilizada  por  ele  apenas  utilizando  anotações  em  cima  das  nossas  classes,  abaixo segue uma exemplificação de como podemos fazer isso:

@ManagedBean(name="veiculo")
@ApplicationScoped
public class VeiculoDaoImpl implements VeiculoDao{

//Atributos
//Métodos

//Gets e Sets

}

Primeiramente, damos um nome para no ManagedBean, no exemplo chamamos de veiculo mas pode ser qualquer nome. Esse ManagedBean é a classe que queremos usar, ou seja, queremos injetar essa classe para que a outra classe possa se utilizar de suas funcionalidades.
Note que VeiculoDao é apenas uma interface nela apenas colocamos as assinaturas dos métodos que vamos posteriormente implementar na classe VeiculoDaoImpl, é extremamente importante de criarmos uma interface para cada classe, pois o JSF injeta apenas as os métodos que estão declarados nas interfaces.
Por fim precisamos apenas injetar a classe VeiculoDaoImpl, para isso procedemos da seguinte forma:

@ManagedBean(name="vendaController")
@ApplicationScope
public class VendaController implementes Serializable{

@ManagedProperty(value="#{veiculo}")
private VeiculoDao veiculoDao;

//Gets e Sets

}

Esse segundo ManagedBean é onde nós iremos injetar a nossa classe VeiculoDaoImpl, para fazer isso apenas utilizamos a anotação @ManagedProperty e na propriedade value colocamos o nome dado anteriormente ao nosso ManagedBean, ou seja, “veiculo” outro detalhe importante é criar os Gets e Sets para a classe a ser injetada. Pronto com apenas algumas linhas acabamos de realizar a injeção de dependência do JSF 2.

Criando formulários com o Google Docs

As vezes surge a necessidade de elaborarmos formulários para pesquisa, enquetes, votações, entre outros e a incluirmos em nosso site, blog, ou de compartilharmos na web para que os internautas façam o uso dos mesmos.

Me deparando com uma tarefa destas em meu trabalho tive a necessidade de buscar uma ferramenta que pudesse me ajudar na criação de um formulário online. Foi quando descobri que o Google Docs possui este recurso que no meu caso resolveu 100% do problema.

Para começarmos basta apenas termos uma conta do Google e acessarmos o endereço e entrarmos no google Docs.

Ao entrarmos localizaremos o botão CREATE e escolhemos a opção form como a imagem mostrada abaixo:

Após criarmos o formulário agora entraremos na tela de criação dos campos do formulário. Podemos escolher entre diversos formatos para a nossa questão como: campo texto, texto parágrafo, múltipla escolha, Checkbox, Listagem, Scala e Grid.
Assim personalizamos a questão de acordo com a nossa necessidade.

Após concluído clicamos no botão Done, se caso quisermos incluir mais alguma questão nos remetemos ao canto superior esquerdo da tela no botão ADD Item para inserirmos mais uma questão ao nosso formulário. Se caso concluído apenas nos remetemos ao botão Saved no canto superior direito da tela. A tela é mostrada logo abaixo:

Compartilhando e Incorporando o formulário.

Após o nosso formulário ser salvo temos a opção de incorporá-lo ao nosso site, blog, onde for, através de um Iframe. Na opção More actions acionamos o campo embed e logo depois copiamos o código que aparecerá na janela, ou seja, o código do iframe, que poderá ser colado em qualquer lugar de seu site ou blog.

Para acessar os resultados no Google Docs basta entrar lá e procurar o arquivo do formulário que foi criado, assim os resultados se apresentarão em forma de planilha. Onde poderemos alterar, visualizar, gerar relatórios do nosso formulário através da opção Form() no menu da planilha. Como mostra na figura abaixo.

Essa foi mais uma dica aqui do nosso blog, assim como me ajudou pode também estar resolvendo o problema de outras pessoas. Muito obrigado, até a próxima.

Cursores em MySql

No desenvolvimento e manutenção de sistemas, é comum que apareçam algumas funcionalidades ou mudanças que impliquem em alterar a estrutura existente do banco de dados. Nos sistemas que já estão em produção, já não se pode mais eliminar a base de dados e iniciar novamente, pois não podemos deixar que os dados do cliente “desapareçam”.

Em muitas dessas modificações de estrutura do banco, é necessário “transferir” dados de determinadas tabelas para outras, ou fazer alguma operação para que a nova estrutura do banco de dados também se adapte ao sistema. Uma das formas para se efetuar esses ajustes é programando e executando scripts SQL.

Para tratar de uma coleção de dados(vinda de um select, por exemplo), nos utilizamos de cursores. Tive a necessidade de ajustar uma base de dados MySql, e tive de escrever uma rotina para se utilizar de duas tabelas e gerar dados para uma outra tabela. Achei um tanto burocrático, sem contar que nem o exemplo contido na documentação funcionou.

A fim de evitar que passem pelas mesmas dificuldades que passei, vou disponibilizar a estrutura com a qual tive sucesso.

delimiter ;
drop procedure if exists insereDados;

delimiter |

create procedure insereDados()
 begin

 DECLARE done INT DEFAULT 0;
 DECLARE var1, var2, var3 BIGINT;

 DECLARE curs CURSOR FOR (
	SELECT dado1, dado2, dado3 FROM TABELA
	);

 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

 OPEN curs;

 REPEAT

 	FETCH curs INTO var1, var2, var3;
		IF NOT done THEN
			INSERT INTO OUTRA_TABELA(campo1, campo2, campo3) VALUES(var1, var2, var3);
		END IF;
 UNTIL done END REPEAT;

 CLOSE curs;

 end
|

delimiter ;

call insereDados();
drop procedure if exists insereDados;

 

Lembrando que a ordem de declaração de delimitadores, variáveis e cursores deve ser seguida rigorosamente. Vale lembrar também que estaremos criando uma procedure (que para funcionar deverá ser chamada), portanto ela ficará armazenada no banco, a menos que você exclua ela. Para resolver isto, aproveitei e criei mais duas linhas(as duas últimas) onde estou chamando a procedure criada e depois de sua execução estou eliminando-a.

Um post rápido que espero que sirva de ajuda para quem precisa fazer coisas mais “cabulosas” com o banco de dados MySql.

Personalizar Tema PrimeFaces

logo-jquery

 

 

 

 

 

 

Uma dica muito interessante para quem usa PrimeFaces. Navegando, hoje no site do Jquery, encontrei um recurso para personalizar os temas do PrimeFaces, com ele é possível editar desde fonte, as cores dos temas e até mesmo mudar o formato dos cantos dos componentes de acordo com o seu gosto e depois de criado o novo tema é só realizar o download e usar em seus projetos.

Para quem interessar segue o link do Jquery.

RAID 1 via software no Windows Server 2003

Nesse post é descrito como configurar RAID 1 no Server 2003. RAID 1 é usado para replicação de dados. Exitem três maneiras de se implementar Raid:

  1. A primeira é via hardware;
  2. Fake RAID utilizado pela maioria das controladoras baratas;
  3. Via Software.

Para configurar via software primeiro acesse o menu Iniciar->Ferramentas Administrativas->Gerenciamento do Computador.

Agora, na tela que abrirá expanda o nó de armazenamento e clique em “Gerenciamento de disco”.

Em seguida clique no menu Exibir , aponte para o superior e, em seguida, clique em Lista de volumes

No menu Exibir , aponte para inferior e, em seguida, clique em Exibição gráfica .

Atualizar para discos dinâmicos

Sistemas RAID exigem discos dinâmicos no Windows Server 2003.

Observação Você deve fazer logon como administrador ou como membro do grupo Administradores para concluir este procedimento.

Para atualizar um disco básico para um disco dinâmico, execute estas etapas:

  1. Antes de atualizar discos, feche os programas que estão em execução nesses discos.
  2. Clique com o botão direito no painel de descrição de disco cinza e, em seguida, clique em Atualizar para disco dinâmico.
  3. Se o segundo disco não é um disco dinâmico, siga estas etapas para atualizá-lo para um disco dinâmico.

Espelhar o volume de inicialização e de sistema

Nesse cenário, o disco 1 é o disco em que a imagem do disco 0 será espelhada.

  1. Disco 1 deve estar como espaço não alocado antes de continuar com o espelhamento.
  2. Clique com o botão direito disco 0 (que contém os arquivos de inicialização e sistema) e clique em Adicionar espelho .
  3. Uma caixa de diálogo se abre na qual qualquer disco no sistema que está disponível para espelhamento é exibido. Selecione o disco de sua escolha (neste exemplo, é o disco 1) e em seguida, clique em Adicionar espelho .

Pronto, se você seguiu os passos certo, agora você já possui um sistema RAID 1 funcionando em seu Sistema.

 

Iniciando em Sistemas Baseados em Casos (RBC)

Raciocínio baseado em casos (RBC)

Natan Suzana

Acadêmico do curso de bacharelado de Ciência da Computação da Universidade do Oeste de Santa Catarina – Unoesc – Campus de Xanxerê.

LuzitanOrsoZancan

Acadêmico do curso de bacharelado de Ciência da Computação da Universidade do Oeste de Santa Catarina – Unoesc – Campus de Xanxerê.

 

RESUMO

A técnica de Raciocínio Baseado em Casos resume-se em uma lógica inspirada no comportamento humano, mais especifico, na capacidade das pessoas aprenderem com seus atos, e reutilizar este conhecimento em novas ações. RBC faz isso, à grosso modo, registra soluções geradas pelo programa a qual é aplicado e reutiliza essa base de casos solucionados para resolver novos problemas. RBC tem quatro passos fundamentais para sua elaboração: representação do conhecimento: medida de similaridade; adaptação; aprendizado; todos especificados no presente artigo.

 

1 Introdução

A inteligência artificial (IA) desde sua criação desenvolveu diversas técnicas para aprimorar a resolução de problemas e a obtenção de conhecimentos. As técnicas desenvolvidas de IA têm como sua base, o estudo do comportamento humano, a derivação deste estudo resultou dentre outras o surgimento da técnica de raciocínio baseado em casos (RBC), estando hoje dentre as técnicas mais utilizadas em IA.

O RBC desenvolveu-se muito rapidamente, pois as técnicas que o mesmo utiliza são simples e seu poder é muito grande. Hoje o RBC está presente em vários processos, como softwares de ajuda a usuários, diagnósticos médicos, sistemas especialistas, enfim, se tornou uma ferramenta muito útil para resolver problemas, onde os mesmos poderão aproveitar soluções anteriormente encontradas.

O RBC assim como as demais técnicas de IA baseia-se no comportamento humano. O raciocínio baseado em casos inspira-se na capacidade humana em aprender com suas ações e experiências e resolver problemas novos com experiências vividas anteriormente.

Porém quais são os principais passos para se desenvolver um sistema que possua esta capacidade, semelhante à capacidade humana, de desenvolver novos conceitos com as experiências vividas?

 

2 Raciocínio baseado em casos (RBC)

Para iniciar este artigo, é de suma importância citar uma frase dita no ano de 1991 por Marvin Minsky (Apud. Wangenheim): “I predict that 20 years from now Case-Based Reasoning will be the most important application of Artificial Intelligence.” Em 1991 Minski previu que em 20 anos Raciocínio Baseado em Casos (RBC) seria a mais importante técnica de Inteligência Artificial (IA), uma previsão que se concretizou. Hoje, RBC, como será tratado daqui em diante neste artigo, é um dos ramos de IA mais utilizados. Um exemplo simples da utilização de RBC, são as funções de autoajuda disponibilizadas por fabricantes de hardware e software. Ao se acessar a autoajuda, são feitas perguntas a fim de descobrir o que está acontecendo com a impressora, ao se ter o caso (problema) definido, o sistema faz uma busca em sua base de dados por alguma incidência parecida, gerando uma nova solução baseado nos registros do que já aconteceu.

Raciocínio Baseado em Casos (RBC), é um termo originado do inglês Case Based Reasoning (CBR), tem em seus conceitos o que foi descrito acima, resolução de problemas com base em casos anteriormente solucionados, adaptando uma nova resposta ao problema. Wangenheim (2003) confirma isso na afirmação a seguir: “(…)podemos entender o Raciocínio Baseado em Casos como a solução de novos problemas por meio da utilização de casos anteriores já conhecidos”.

O conceito base de RBC, vem da observação da vida humana. Todos os seres humanos ao longo de suas vidas acabam adquirindo experiência e usando a mesma para descobrir novas soluções. Este conceito é utilizado amplamente. Um exemplo são os prontuários médicos, ao se imaginar uma situação em que você vá até o médico e ao relatar os sintomas, é gerado um novo caso. O médico, tendo o seu caso, ou seja seus sintomas, irá lembrar-se de alguns casos semelhantes, os quais ele já atendeu. Como em uma pesquisa em um banco de dados, o médico procura casos similares ao seu. Ao lembrar (no caso de um banco de dados, encontrar) um caso parecido, o médico, usando seu conhecimento, irá adaptar a solução que foi dada à última incidência, ao seu caso, gerando um novo prontuário. Com isso, ele gerou uma solução para o seu problema, na grande maioria das vezes de forma eficiente e, enquanto isso, adquiriu para a sua memória (nosso banco de dados) um novo caso, que será utilizado para a solução de novos problemas. Wangenhein (2003) afirma que o Raciocínio Baseado em Casos (RBC) é a tecnologia de Inteligência Artificial inspirada no modelo de cognição e comportamento humano, que encontra respostas para um novo problema, através de um problema já resolvido.

Wangenhein(2003)  também destaca que qualquer sistema que utilize RBC deve possuir quatro elementos básicos:

·    Representação do Conhecimento

·    Medida de Similaridade

·    Adaptação

·     Aprendizado

2.1 Representação do Conhecimento

Um dos pontos chave de sistemas com Raciocínio Baseado em Casos é a representação do conhecimento, a forma na qual irá se registrar problemas e soluções vividas pelo sistema ou seja, é o banco de dados que será utilizado para gerar novas soluções.

Segundo Wangenhein (2003) a principal forma de representação do conhecimento são os casos, sendo que, outras formas de representação podem ser utilizadas, como casos abstratos, generalizados, tipos diversos de dados, modelos de objetos usados como informação, entre outros. Os casos englobam as demais formas de representação do conhecimento, pois todas as demais deverão ter mesmas características básicas para o funcionamento do RBC. Um caso é a maneira de demonstrar o conhecimento de forma contextualizada, registrando o evento problemático ou uma situação com problema foi solucionada de forma parcial ou total.

Um caso é, basicamente, a descrição de um problema e a sua solução, a solução sendo caracterizada como a experiência adquirida neste caso. Esta representação do conhecimento é feita através dos casos, porém não se restringe a estes. Para um RBC funcionar, deve-se criar um Repositório de Conhecimento.

O Repositório de Conhecimento é uma ou um conjunto de base de dados que engloba todos os casos, o vocabulário usado para gerar estes casos (um exemplo de vocabulário são consultas médicas nas quais você preenche um formulário antes da consulta, com os seus sintomas. Este formulário é igual para todos os pacientes. O que gera um caso e facilita o diagnostico do médico. Este formulário seria nosso vocabulário), uma base com medidas de similaridade referentes a cada caso para poder identificar e reutilizar casos anteriores e uma última base apara armazenar os dados de como adaptar os casos similares para resolver o novo problema.

2.2 Medida de Similaridade

A medida de similaridade é o ponto chave dos RBC, através dela será organizada a base de dados utilizada pelo sistema, através desta medida serão encontrados os casos com maior chance de gerarem solução do caso problema. Similaridade em RBC nada mais é do que a comparação de dois casos para verificar o quanto um está ligado ao outro e como os mesmos podem compartilhar soluções e consequências.

Conforme descreve Wangenhein (2003), o conceito da utilidade de casos é, de um ponto de vista abstrato, central para o raciocínio baseado em casos. Durante a recuperação de casos procura-se por um problema na base de casos, que, no contexto da descrição do problema atual, é útil para determinar a sua solução.

Podemos definir similaridade como se fosse uma recuperação dos dados para utiliza-los na resolução de um novo caso, este processo é um dos mais importantes do paradigma Raciocínio Baseados em Casos. Tem por propósito encontrar, em uma memória de casos resolvidos anteriormente, um caso mais adequado, mais próximo ao problema que precisa resolver.

A comparação utilizada para encontrar um caso parecido na tentativa da obtenção da resolução do novo problema, pode ser feita de duas formas que são: similaridade sintática ou semântica. Quando um caso é resolvido ele leva com ele informações importantes para serem gravadas na base de dados, dentre estas informações destacamos suas características principais e a sua respectiva solução. São nessas informações que a similaridade irá agir, comparando-as com o novo problema para ver se encontra algum caso similar que já foi resolvido anteriormente, a forma como essas informações são guardadas se torna muito importante devido a sua importância, para que a similaridade seja considerada relevante é necessário que estas características sejam prenunciativas.

A similaridade é o ponto crucial de RBC, pois a partir desta etapa, todo processo de raciocínio que fundamenta esta técnica torna-se viável.

2.3 Adaptação

A partir do momento que um caso similar é recuperado da base de dados para resolver o novo problema, ocorre uma reutilização de conhecimento, este conhecimento foi obtido na resolução do caso anterior que é similar ao novo problema, por isso o caso anterior será reutilizado para resolver o novo problema.

Qualquer reutilização realizada necessita da adaptação da solução do caso anterior ao caso atual, algumas técnicas são tratadas na reutilização onde as quais tentam resolver os problemas gerados pela adaptação, que conforme Wangenhein(2003), são: quais aspectos da situação devem ser adaptados, quais modificações devem ser realizadas para esta adaptação, que método aplicar para realizar a adaptação e como controlar este processo.

Essa adaptação é realizada para adequar uma solução encontrada anteriormente a um novo problema similar, com o objetivo de facilitar a obtenção da solução deste novo problema. Esta adaptação irá influenciar diretamente na flexibilidade do sistema de raciocínio baseado em casos, pois esta adaptação irá determinar a capacidade do sistema em resoluções de novos casos, novas situações.

Ao se realizar a adaptação de uma caso para outro são necessárias a análise de alguns fatores, Wangenheim (2003) destaca 4 principais:

○     Quais são os aspectos de uma situação que devem ser adaptados

○     Quais modificações são razoáveis de serem realizadas para adaptar o caso.

○     Quais são os métodos de adaptação aplicáveis para modificar estes aspectos.

○     Como controlar o processo de adaptação para saber que as modificações estão sendo realizadas no rumo certo.

Existem varias técnicas para efetivar a adaptação de um caso a outro, todas as técnicas baseiam-se em dois conceitos básicos: 1º- Quais são as diferenças entre o caso passado, cujo qual já tem uma solução conhecida, e o caso atual, o qual será gerada uma solução. 2º- Quais partes do caso passado podem ser reaproveitadas para gerar na solução dos novo problema.

 

2.4 Aprendizado

O RBC tem um ciclo muito bem definido conforme podemos ver na figura a seguir:

Ciclo RBC

Neste ciclo podemos perceber que quanto mais casos tiverem que ser solucionados, respectivamente com maior facilidade serão resolvidos, pois a base de casos será maior e a obtenção de novas soluções será mais eficiente.

Wangenheim (2003) diz que a integração com o aprendizado é uma das características mais importantes do RBC. A noção de RBC portanto, não denota apenas um método particular de raciocínio, sem levar em consideração como os casos são adquiridos, mas implica também um paradigma de aprendizado de máquina que suporta o aprendizado sustentado pela atualização contínua da memória de casos.

No RBC, os casos são armazenados sem alteração, Wangenheim (2003) cita que existem muitas variações de métodos de aprendizado de casos, somente o que diz respeito à forma de manipular os casos existem várias possibilidades. O aprendizado é construído a partir de um conjunto de exemplos de casos dados. Com os mesmos, deve-se decidir quais casos serão aceitos para compor a base e quais serão rejeitados e com qual critérios serão feitas as escolhas.

3 Aplicação de RBC

O raciocínio baseado em casos (RBC) é utilizado em várias aplicações de diferentes áreas, dentre as mesmas podemos citar: análise financeira; assessoramento de riscos; manutenção técnica; controle de processos; controle de qualidade; diagnóstico médico; sistemas de suporte a software; previsão; planejamento; projeto; classificação; interpretação de imagens; avaliação imobiliária; etc.

Conforme Wangenheim (2003), a tarefa de um sistema de RBC, descreve o tipo de ação para a qual o sistema será utilizado, como por exemplo, diagnóstico, configuração, planejamento, etc. Isto determinará o tipo de problema e de soluções, bem como a natureza das atividades a serem desenvolvidas pelo solucionador de problemas baseados em casos.

4 Considerações finais

O uso da técnica de Raciocínio Baseado em Casos tornou-se indispensável em sistema que visam a resolução de inúmeros problemas os quais necessitam de uma certa autonomia para encontrar a solução desejada. Dentre estes sistemas podemos destacar softwares de ajuda, diagnósticos médicos, enfim, todo softwares que necessitem resolver algum problema de forma otimizada e tem a possibilidade de armazenar problemas já resolvidos, são softwares que tem uma grande probabilidade de utilizar RBC.

Podemos dizer que a técnica de RBC trouxe maior difusão da Inteligência Artificial, pois possibilita a reutilização de todo o histórico de soluções quais o software gerou, para reutilizá-las em novos problemas, isso propicia uma resolução de novos problemas mais rápida e eficaz, pois você já tem um ponto de partida e comparação para os novos problemas.

 

Referências

Wangenheim, C. G.; Wangenheim, A. Raciocínio baseado em casos. Barueri, SP: Manole, 2003. 293p.