segunda-feira, 15 de agosto de 2011

Implementação dos processos Validação e Verificação do MPS-Br

Nesse artigo apresentaremos as principais diretrizes para implementação de resultados dos processos Validação e Verificação do MPS-Br, conforme a parte 4 do guia oficial de implementação do SOFTEX.

O Processo Validação


"O propósito do processo Validação é confirmar que um produto ou componente do produto atenderá a seu uso pretendido quando colocado no ambiente para o qual foi desenvolvido"

VAL1 - Produtos de trabalho a serem validados são identificados


Esta identificação pode ocorrer nos estágios iniciais do projeto, com base nos artefatos que serão produzidos pelo processo.Uma boa prática é definir critérios para seleção dos produtos ou componentes de produto que serão validados e selecioná-los segundo estes critérios.Pode-se, por exemplo, selecionar os produtos mais relevantes com base nas necessidades do cliente ou levando-se em consideração os riscos associados aos produtos.É possível, também, definir, em nível organizacional, uma lista de produtos ou componentes de produto que normalmente são validados, de forma que os projetos só precisem adaptar essa lista às suas necessidades. 

VAL2 - Uma estratégia de validação é desenvolvida e implementada, estabelecendo cronograma, participantes envolvidos, métodos para validação e qualquer material a ser utilizado na validação  


Alguns métodos de validação requerem um planejamento específico que deve ser realizado, por exemplo, o planejamento dos casos de testes. Deve ser definido ainda um cronograma para as atividades de validação e os recursos necessários à execução das atividades devem ser planejados. Este cronograma e a alocação dos recursos, tanto humanos quanto outros recursos em geral, devem estar integrados ao Plano do Projeto. Prototipação é um dos métodos para a validação de requisitos. 

VAL3 - Critérios e procedimentos para validação dos produtos de trabalho a serem validados são identificados e um ambiente para validação é estabelecido

Devem ser definidos os critérios para a validação de cada produto ou componente do produto. Para ajudar a determinar se um critério foi ou não atendido, algumas métricas podem ser definidas.Alguns exemplos de critérios para validação dos requisitos são: adequação funcional e usabilidade. Para validação de um software alguns critérios de validação poderiam ser: tempo de resposta, tolerância a falhas, recuperabilidade, uso de memória, confiabilidade e portabilidade.

VAL4 - Atividades de validação são executadas para garantir que o produto esteja pronto para uso no ambiente operacional pretendido

Uma das principais formas de se realizar a validação é executando testes. A realização dos testes ao longo de todo o processo de desenvolvimento do software é possível por meio da execução de quatro etapas distintas:
  • Planejamento 
  • Projeto de casos de teste 
  • Execução 
  • Avaliação dos resultados 
VAL5 - Problemas são identificados e registrados


Este resultado esperado visa garantir que os problemas identificados durante a execução das atividades de validação foram documentados e que foram definidos quais problemas serão tratados. Estes problemas devem ser acompanhados até sua conclusão. A organização pode definir critérios que facilitem essa análise considerando os riscos para o projeto e o impacto na qualidade do produto.  




VAL6 - Resultados de atividades de validação são analisados e disponibilizados para as partes interessadas

Envolve realizar uma análise dos resultados obtidos em decorrência da execução das atividades relacionadas a validação e disponibilizar estes resultados para o cliente, ou seu representante na execução das atividades, e outras partes interessadas. Alcance deste resultado é obtido por meio da análise de laudos de avaliação e relatórios de testes que contenham informações sobre os resultados obtidos após a realização das atividades de validação. A avaliação destes resultados permite responder questões como:  

  • Os critérios definidos foram satisfeitos?  
  • As ações corretivas planejadas foram concluídas?  
  • A validação foi executada conforme planejado?  
  • Os resultados obtidos permitem a aprovação do artefato validado?  
  • O produto final está pronto para o uso pretendido? 
VAL7 - Evidências de que os produtos de software desenvolvidos estão prontos para o uso pretendido são fornecidas 

Quando as atividades de teste são realizadas e há evidências que o produto satisfaz os requisitos e as expectativas do cliente, o produto pode ser considerado validado. Para isso o produto deve ser testado em seu ambiente real de uso ou em uma reprodução deste ambiente.  É necessário registrar os resultados da validação, evidenciando que o produto está pronto para o uso.  Uma das formas de garantir que o produto está pronto para ser usado é realizar uma reunião com os clientes e/ou usuários finais onde sejam apresentados os resultados da validação, a correção dos problemas detectados e se obtenha o aceite de que o produto está pronto para o uso.  

O Processo Verificação

"O propósito do processo Verificação é confirmar que cada serviço e/ou produto de trabalho do processo ou do projeto atende apropriadamente os requisitos especificados"

VER1 - Produtos de trabalho a serem verificados são identificados

Para atender a este resultado esperado deve-se analisar os produtos de trabalho que serão produzidos ao longo do projeto e selecionar aqueles a serem verificados. Uma boa estratégia para seleção de produtos de trabalho leva em consideração as contribuições para o alcance dos objetivos e requisitos do projeto, considerando também os riscos do projeto. Alguns possíveis produtos de trabalho selecionados para a verificação, por sua importância, podem ser o plano do projeto, o documento de requisitos, o documento de análise, o documento de projeto e o código-fonte. 

VER2 - Uma estratégia de verificação é desenvolvida e implementada, estabelecendo cronograma, revisores envolvidos, métodos para verificação e qualquer material a ser utilizado na verificação

O alcance deste resultado esperado envolve definir uma estratégia de verificação descrevendo os procedimentos, a infra-estrutura necessária e as responsabilidades pelas atividades de verificação. Os métodos que serão usados para verificação de cada produto de trabalho selecionado para verificação devem ser identificados, garantindo, em cada projeto, a realização de algum tipo de revisão por pares e testes.  As ferramentas que apoiarão a execução das atividades de verificação também devem ser definidas.  Exemplo de métodos: walkthroug (revisões estruturadas), testes em seus diversos níveis (unidades, integração, sistema...etc) 

VER3 - Critérios e procedimentos para verificação dos produtos de trabalho a serem verificados são identificados e um ambiente para verificação é estabelecido

O alcance deste resultado esperado implica na definição dos critérios e procedimentos que serão utilizados para a verificação de cada produto de trabalho e na preparação do ambiente para verificação, disponibilizando ferramentas, recursos de hardware, infra-estrutura de rede e outros recursos necessários à execução das atividades planejadas. Para ajudar a determinar se um critério foi ou não atendido, questões (checklist) e/ou métricas para cada critério podem ser definidas. Abaixo, apresentam-se sugestões de critérios para avaliação de requisitos.



VER4 - Atividades de verificação, incluindo testes e revisões por pares, são executadas

Este resultado esperado visa garantir que as atividades de verificação são executadas conforme planejado, o que inclui, obrigatoriamente, a realização de revisão por pares e testes.

VER5 - Defeitos são identificados e registrados

Este resultado esperado visa garantir que os defeitos identificados durante a execução da verificação são documentados e registrados.  Para registro dos defeitos identificados pode-se usar uma classificação de defeitos, por exemplo, por severidade (crítico, sério, moderado) ou por origem (requisitos, projeto (design), código, testes). Após a eliminação dos defeitos, deve-se julgar a necessidade de executar nova verificação para garantir que os defeitos foram removidos adequadamente e que novos defeitos não foram introduzidos no produto ou componente do produto. 

VER6 - Resultados de atividades de verificação são analisados e disponibilizados para as partes interessadas

Uma forma de alcance destes resultados é pela análise de laudos de avaliação e relatórios de testes que contenham informações sobre os resultados obtidos após a realização das atividades de verificação. Exemplos de perguntas que podem ser respondidas com esta avaliação incluem:  

  • Os critérios definidos foram satisfeitos?  
  • As ações corretivas planejadas foram concluídas?  
  • A verificação foi executada conforme planejado?  
  • Os resultados obtidos permitem a aprovação do artefato verificado? 
Referência

SOFTEX-Guia de Implementação – Parte 4: Fundamentação para Implementação do Nível D do MR-MPS, agosto de 2009.

sábado, 13 de agosto de 2011

Como reconhecer a consciência

Em 1950, o matemático britânico Alan Turing publicou um artigo que propunha um teste para verificar se um computador ou programa exibe comportamento inteligente. Esse teste, denominado Teste de Turing, apresenta um juiz humano interagindo por meio de linguagem natural , com um computador e com outro ser humano. O juiz está isolado do computador e do ser humano. Se após certo tempo, o juiz não conseguir definir quem seria o ser humano ou o computador, tal computador será considerado inteligente. 
A chamada teoria da informação integrada da consciência oferece uma forma de lidar com o desafio de determinar a consciência em um sistema computacional. Nossa experiência cotidiana de interação com o meio relaciona-se à forma como o cérebro integra sinais sensoriais obtidos através dos sentidos com informações da memória. A teoria da informação integrada propõe que a consciência é altamente informativa, ou seja, cada estado de consciência em particular descarta um número imenso de outros estados possíveis dos quais ele se difere, formando a ideia real do que estamos vivenciando. Propõe também, que a informação consciente é integrada, ou seja, qualquer cena que entre na consciência por meio de nossa experiência sensorial permanece integral e completa e não pode ser subdividida em componentes independentes que possam ser vivenciados de forma isolada. A consciência, portanto, é uma entidade única, integrada com um grande número de estados distinguíveis.
A capacidade de um sistema para a informação integrada e, por conseguinte, para a consciência, pode ser medida perguntando-se quanta informação um sistema tem acima e além da que compõe suas partes individuais. Essa  medida, denominada ɸ, pode ser calculada para qualquer sistema, tanto para um cérebro como para um robô, ou um programa, ou até mesmo um dispositivo eletromecânico. Um sistema constituído de partes bem especializadas e bem integradas, produzindo mais juntas que separadas, possui um ɸ alto. Dentre os sistemas que possuem um ɸ baixo, podemos citar aqueles que possuem elementos com alto grau de independência, aqueles cujos elementos são redundantes (não especializados) e aqueles cujos elementos se interconectam aleatoriamente.  No córtex cerebral humano, rico em neurônios fortemente interconectados, o ɸ é naturalmente alto.
Para um computador, uma imagem é simplesmente um emaranhado de pixels sem significado. Para um ser humano uma imagem é significativa porque está repleta de conexões entre as partes, estendendo-se de pixels a objetos e cenas, especificando que partes da imagem combinam ou não entre si.  É exatamente essa diferença , essa rede integrada de conhecimento relacionado que dá identidade a cada imagem distinguindo-a de várias outras, que nos dota da capacidade de sermos conscientes do mundo.
Uma forma interessante de testar a capacidade de um computador entender uma imagem, seria o cobrir terço central vertical de várias imagens com uma faixa preta, separar as partes resultantes (direita e esquerda) e embaralhá-las. O computador é desafiado a identificar os pares que fazem parte da mesma imagem. Estratégias simples atuais utilizadas por programas de análise de imagem, como ligar linhas de cor e textura, não poderiam ser utilizadas porque as partes direita e esquerda foram separadas pelo terço coberto pela faixa preta.  Esse teste envolve muito mais, envolve a capacidade de deduzir como as peças se encaixam, imaginando o que existe no terço coberto pela faixa preta.  Estratégias computacionais que envolvem a combinação de informações estatísticas simples, como características de imagem-cor, bordas ou textura- podem ser bem sucedidas em testes como este, mas têm alcance limitado quando muitas situações são apresentadas ao computador. Isso evidencia a grande quantidade de informação integrada que percebemos conscientemente e as limitações atuais dos sistemas de visão computacional.
Atualmente, programas especializados são capazes de identificar rostos, digitais ou assinaturas, mas ainda é muito difícil desenvolver um algoritmo que seja capaz de identificar que um notebook flutuando sobre uma mesa é algo irreal e inusitado.  Um algoritmo dotado de consciência teria que ter conhecimento das incontáveis conexões entre as coisas do mundo contido em sistema único, altamente integrado.  A resposta à pergunta "o que está errado na figura" seria possível porque qualquer coisa fora do lugar não combinaria com algumas das restrições intrínsecas impostas pelo modo como a informação é integrada. Ou seja, seria um modo consciente de agir graças à capacidade de integrar informações.  Suspeita-se que para atingir esse nível, devem-se explorar os princípios estruturais do cérebro humano, altamente distribuído e com partes altamente dependentes e interconectadas.

Baseado no artigo "Como Reconhecer a Consciência"  de Christof Kock e Giulio Tononi, publicado na Scientific American Brasil de julho de 2011.


sexta-feira, 5 de agosto de 2011

Viagens Extracorpóreas. Verdade ou Alucinação?

Nos anos 80 o médico brasileiro Waldo Vieira publicou um livro de 900 páginas, versando sobre a chamada projeciologia, ou a capacidade da consciência humana se libertar do corpo físico e retornar ao mesmo.  Na época, assisti a uma palestra do Dr. Waldo no auditório do ITA e, ainda que eu não descarte essa possibilidade por crer que nosso conhecimento acerca da realidade ainda é muito pequeno, na essência sempre fui cético.
Entretanto, o Dr. Miguel Nicolelis, renomado pesquisador brasileiro radicado na Universidade Duke nos Estados Unidos, em seu excepcional livro "Muito Além do Nosso Eu", descreve experimentos  interessantes, que lançam um víés realmente científico  sobre o assunto.
Segundo Nicolelis, essa sensação pode ser induzida por traumas, experiências de quase morte, consumo de drogas psicodélicas, meditação profunda, privação de sono, determinados tipos de anestesia, dentre outros fatores. Essa sensação pode ser também  reproduzida em indivíduos saudáveis por meio de estimulação da área  da junção dos lobos parietal e temporal no hemisfério cerebral direito, usando uma técnica  conhecida como estimulação magnética  transcraniana.
O cientista  sueco Henrik Ehrson realizou  experimentos em que os voluntários relataram a sensação de estar fora de seus corpos e até mesmo trocar de corpo com outras pessoas. Para chegar a esses resultados, Ehrson manipulou a denominada perspectiva de primeira pessoa dos indivíduos, fazendo-os utilizar um  capacete equipado com monitores de vídeo que cobriam ambos os olhos, exibindo imagens binoculares provenientes de câmeras montadas na cabeça de um manequim colocado na frente deles. Essas visões eram das mãos, troncos e abdome sob a perspectiva de primeira pessoa do manequim. Em seguida, um pesquisador se colocou entre o manequim e o voluntário, tomando o cuidado de ficar fora do alcance das câmeras.  Usando dois bastões, o pesquisador começou a estimular sincronizadamente  o abdome do voluntário e do manequim por alguns minutos. O voluntário conseguia ver, por meio dos monitores, um dos bastões tocando o abdome do manequim.  Surpreendentemente, quando indagados, os voluntários relataram sentir o toque do bastão no corpo do manequim e não no seu próprio. A maioria deles acabou por afirmar que passaram a sentir o corpo do manequim como sendo o seu.  Ao perceber uma ameaça de corte com faca no abdome e mãos do manequim, os indivíduos manifestaram um comportamento de estar sob ameaça.
Em outro experimento, Ehrson colocou  voluntários e um experimentador   frente a frente. Os voluntários utilizavam o mesmo capacete com monitores, que exibiam imagens geradas por câmeras montadas na cabeça do experimentador, sentado na frente deles e olhando diretamente na direção deles. Graças a esse aparato, os voluntários observavam as mãos do experimentador como sendo suas e suas próprias mãos do ponto de vista do observador. O sujeito deveria estender o braço direito para apertar a mão direita do experimentador. Entretanto, o que ele via com os olhos eram as imagens do braço direito do observador se movendo simultaneamente em direção ao seu. E  visualizava seu próprio braço como se fosse de outro corpo posicionado em frente ao seu. Nesse instante, o sujeito deveria apertar a mão que se projetava em seu campo visual, enquanto o experimentador apertava a sua simultaneamente.O aperto de mãos era mantido por alguns minutos. Ao relatar a experiência, os voluntários, em sua grande maioria, afirmavam sentir que o braço do experimentador  era uma extensão do corpo de cada um deles. Afirmavam também que o corpo do experimentador passou a ser seus corpos, substituindo seu corpo real. Ou seja esses indivíduos, em poucos minutos, foram capazes de renegar seus corpos orgânicos e assumir um outro corpo!  Um outro fato curioso é que quando seus corpos e depois o do experimentador eram ameaçados por uma faca, eles exibiam uma reação de alarme muito maior quando a ameaça era feita ao corpo do experimentador. O experimento também funcionou quando o experimentador e o voluntário eram de sexos opostos.
Segundo muito bem expresso por Nicolelis, esses experimentos  mostram que  o o corpo  não passa de uma artimanha dissimulada pelo cérebro, reduzindo o culto ao corpo a mera futilidade. Evidencia também possibilidades interessantes, como nosso cérebro assumir intimamente outro corpo (como no filme Avatar), ou um corpo virtual (como no filme Matrix)  e perceber todas as sensações oriundas do mundo  onde possa estar inserido.

segunda-feira, 1 de agosto de 2011

O que á uma solução de Inteligência Artificial?

Técnicas de Inteligência Artificial provêem mecanismos para tornar a solução de problemas mais próxima à que um ser humano utilizaria, melhorando a forma de utilização do conhecimento, a capacidade de generalização e a capacidade de tomar decisões em situações imprevistas ou singulares. Nesse artigo, vamos comparar  soluções para dois problemas, partindo da  "menos inteligente" até a que mais se enquadra ao conceito de uma solução da Inteligência Artificial. Vamos analisar tais soluções frente a três características: complexidade de implementação, capacidade de generalização e utilização do conhecimento. Para cada uma delas, vamos propor uma estrutura de dados para representar o problema e um algoritmo.

Problema 1- Jogo da velha

Solução 1

Estrutura de dados

Vamos definir um vetor de 9 elementos, onde cada elemento possui um dos seguintes valores:

     0, se a casa estiver em branco
     1, se houver um X  na casa
     2, se houver uma O (bola) na casa

Assim sendo, esse vetor vai conter um número ternário (base 3).
Utilizaremos também uma tabela de movimentos que contém 19683 entradas (3 elevado a 9), que são as combinações possíveis dos 3 valores (combinações com repetição de 3 valores para 9 posições). Cada entrada dessa tabela contém a jogada a ser efetuada, desde que o estado do tabuleiro que representa seja viável segundo as regras do jogo.

Algoritmo

1-Visualizar o vetor representando o tabuleiro como sendo um número ternário. Converter esse número para a base 10.
2-Utilizar o número obtido como um índice na tabela de movimentos e acessar a entrada.
3-O estado sugerido pela entrada acessada no passo 2 será a próxima jogada.

Análise

No que diz respeito à complexidade, esse algoritmo é bem simples de ser implementado. O problema dele está no enorme trabalho braçal necessário à confecção da tabela de movimentos: as melhores jogadas para cada estado têm que ser precisamente previstas. A capacidade de generalização também é mínima: se quiséssemos estendê-lo para uma versão tridimensional, isso seria inviável em termos de memória necessária. Precisa de muito conhecimento acerca das melhores jogadas na confecção da tabela de movimentos. Sem esse conhecimento, não existe chance de jogar bem.

Solução 2

Estrutura de dados

O tabuleiro será representado por um vetor de 9 posições numeradas de 1 a 9, onde cada elemento será 2 se a casa estiver vazia, 5 se for O (bola) e 3 se for X.
A próxima jogada a ser feita será denotada por um inteiro de 1 a 9 correspondendo à posição no vetor.

Algoritmo

Subrotinas:
faça2:  tenta colocar 2 de suas peças em uma fileira (linha, coluna ou diagonal) de forma a ter chance de ganhar na próxima jogada
ganha (p): retorna zero se o jogador p não puder vencer no seu movimento seguinte. Caso contrário, retorna o número do quadrado que constituir um movimento vencedor.
jogue(n) : Fazer um movimento no quadrado n

O X faz os movimentos ímpares 
A bola  faz os movimentos pares

1-Jogue (1)
2-Se tabuleiro[5]= 2 então jogue(5) senão jogue(1)
3-Se tabuleiro[9]= 2 então jogue(9) senão jogue(3)
4-Se ganha(X) diferente de 0 então jogue(ganha(X)) senão faça2.
5-Se ganha(X) diferente de 0 então jogue(ganha(X)) senão se ganha(O) diferente de 0 então jogue(ganha(O)) senão se tabuleiro[7] = 2 então jogue(7) senão jogue(3)
6-Se ganha(O) diferente de 0 então jogue(ganha(O)) senão se ganha(X) diferente de 0 então jogue(ganha(X)) senão faça2
7, 8 ou 9 - Se ganha(EU) diferente de 0 então jogue(ganha(EU)) senão se ganha(OUTRO) diferente de 0, então jogue(ganha(OUTRO)) senão jogue(QUALQUER POSIÇÃO)

Análise

Essa solução é de implementação mais complexa, mas pode ser generalizada e depende menos do conhecimento de todas as jogadas possíveis, como na solução 1. Portanto, está mais próxima ao que se espera de uma solução de Inteligência Artificial.

Solução 3

Extrutura de dados

Uma árvore de possibilidades, onde cada elemento é um vetor de 9 posições. Cada elemento aponta para outros elementos que são os estados possíveis  no movimento seguinte. Cada estado possui um número, que corresponde à chance de levar à vitória. Esse número é obtido da seguinte forma:
                          Número de colunas, linhas e diagonais onde X ganha menos número de colunas, linhas e diagonais onde O (bola) ganha.
Assim sendo, quanto maior esse número, melhor a jogada para o X  e pior para o O (bola)
     
Algoritmo

1-Verifique se a posição analisada é a vencedora. Se for, escolha-a.
2-Caso contrário, analise os movimentos do opositor a partir de determinada possibilidade (dois níveis abaixo na árvore, que são as jogadas do opositor). Veja qual é a pior para nós e suponha que o opositor fará opção por ela (pois é também a melhor para ele).
3-Passe essa pior jogada   para o nível imediatamente anterior (que é o de nossas jogadas possíveis)
4-Escolha a menos pior (a que tem o melhor valor da função de avaliação para nós).
5-Opositor joga
6-Volte a 1

Análise

Essa solução é grande consumidora de memória e é bem mais lenta que as anteriores.Normalmente, soluções de Inteligência Artificial exibem essa característica. Entretanto é altamente generalizável (basta trocar o vetor de 9 elementos por um vetor de 27 elementos, por exemplo, para torná-lo 3D) e não exige  nenhum conhecimento das jogadas possíveis, como nas duas soluções anteriores. Essa seria a solução clássica fornecida pela Inteligência Artificial.

Problema 2 - Identificador de caracteres - reconhecimento de padrões

Esse problema consiste em se identificar  caracteres em um texto. Esses caracteres são capturados e armazenados em uma estrutura de dados. É exatamente o que os OCRs (identificadores ópticos de caracteres) fazem. O problema aqui restringe-se à etapa de identificar os caracteres já armazenados na estrutura de dados adequada.

Solução 1

Estrutura de dados

  • Uma matriz quadrada que representa o formato do caracter. Cada pixel é representado por um  "1" na matriz e a ausência de pixel por um zero na matriz. Cada caracter a ser reconhecido tem sua representação nessa matriz e o conjunto de todos os caracteres constitui o padrão a ser identificado.
  • Uma tabela de randomização (hash) onde cada letra do padrão possui um lançamento. A chave da tabela de hash é calculada assim:
    • Tirar 3 linhas da matriz de zeros e uns
    • Concatenar as 3 linhas
    • Através de uma função de hash, transformar as linhas concatenadas em uma chave de acesso
Algoritmo

1-Transformar o caracter a ser identificado em uma matriz de zeros e uns
2-Tomar na matriz as mesmas 3 linhas que foram utilizadas para os padrões
3-Aplique a essas 3 linhas a mesma função de haxh utilizada para os padrões

Análise

  • As letras a identificar devem se assemelhar com exatidão aos padrões (ou seja, é pouco generalizável e exige muito conhecimento acerca do formato dos caracteres)
  • Se modificar a coleção de símbolos, modificamos também a tabela de hash, o que pode se tornar bastante complicado
  • Um número grande de símbolos aumenta a chance de colisões na tabela de hash.

Solução 2

Estrutura de dados

  • Matriz de zeros e uns idêntica à da solução 1
  • Padrões conhecidos: um conjunto de vetores de tamanho N, sendo um vetor para cada caracter. Esses vetores são formados tomando-se a matriz de zeros e uns e dividindo-as em N regiões. O número de 1´s em cada região é contado e registrado na posição do vetor correspondente à região  N deve ser suficientemente grande para que cada padrão tenha um vetor diferente.
Algoritmo

1-Converter a matriz de zeros e uns em um vetor conforme descrito
2-Calcule a diferença entre os vetores do padrão e o vetor do caracter a ser identificado
3-O padrão que tiver a menor diferença é o escolhido.

Análise

Essa solução melhora bastante a anterior, uma vez que a base de padrões não precisa ser modificada se novos caracteres forem acrescentados. A capacidade de generalização aumenta também, uma vez que procuramos o caracter mais próximo, melhorando a identificação de caracteres de formatos diferentes  do padrão.

Solução 3

Estrutura de dados
  • Matriz de zeros e uns idêntica à da solução 1
  • As letras do padrão a ser identificado serão representadas por meio de descrições feitas via referências na matriz de zeros e uns. Essas descrições podem ser feitas por predicados, como por exemplo:
    • ARCO (C1, C2) (um arco conectando as células 1 e 2 da matriz) AND
    • RETA(C1, C3)   (uma reta conectando as células 1 e 3 da matriz)
Algoritmo

1-Encontre ARCOS e RETAS no caracter a ser identificado e crie a descrição 
2-Selecione o padrão que tenha a descrição mais próxima à criada em 1

Análise

Essa solução é a mais próxima do que se espera de uma solução de Inteligência Artiticial. Os problemas de diferenças de formato e tamanho dos caracteres encontrados nas outras duas soluções são aqui minimizados, sendo portanto, muito mais generalizável. Por outro lado, é mais lento e de implementação muito mais complexa.

Referências


RICH, Elaine. Inteligência artificial. São Paulo: McGraw-Hill, 1988. 

RUSSELL, Stuart J.; NORVIG, Peter. Inteligência artificial. Rio de Janeiro, Elsevier, 2004.