quarta-feira, abril 26, 2006

IA: Inteligência Artificial

Por falta de assunto, e aproveitando a deixa dos algorítmos genéticos, vou falar um pouco mais sobre inteligência artificial. Agora e em artigos seguintes.

Mas o que é esse negócio de "inteligência artificial"? Bom muita gente diz que a escolha desse nome não é boa, porque gera discussões sobre se computadores podem pensar, sobre o que é inteligência, sobre se os computadores vão querer "liberdade" ou até destruir a humanidade no futuro e mais. Bom, sobre a liberdade, é fácil: computadores querem o que a gente manda eles quererem, e não existe como mandar eles quererem "liberdade" (Afinal, a "liberdade" existe?). Quanto a todas as perguntas sobre computadores pensarem, Djigstra, um dos maiores pesquisadores da computação (talvez o maior até hoje) resumiu todo o debate em uma frase excelente (tradução minha):

"Perguntar se computadores podem pensar é tão útil quanto perguntar se submarinos podem nadar"

Até onde eu sei, submarinos não nadam. Mas isso leva a um debate sobre o que é nadar, que é exatamente igual ao debate sobre o que é pensar. E isso não muda a forma como os submarinos se locomovem. Mas eu ainda não expliquei o que é a inteligência artificial.

Inteligência artificial é o ramo da computação que se preocupa em resolver problemas difíceis. Símples assim, e sem nenhuma questão filosófica. A teoria da computação (outro ramo) define o que é um problema difícil (superpolinomial), mas aqui basta dizer que problemas difíceis são os que gastariam muita memória ou tempo de processamento para serem resolvidos, no sentido de se encontrar a Solução que é a melhor resposta possível. Assim, a inteligência artificial é cheia de respostas aproximadas e algorítmos que não funcionam todas as vezes.

Agora, essa definição não é aceita universalmente (na verdade, eu acabei de criar...). Existem outros nomes para o ramo da computação que tenta resolver problemas difícies, que estudam a mesma coisa, mas cujos estudiosos não gostam de dizer que estudam inteligência artificial. Existem também outros pesquisadores que não estudam problemas difíceis, mas gostam de dizer que estudam inteligência artificial. Essa definição, porém é mais correta do que errada, o que na falta de uma definição universal é bom o bastante :)

Por trabalhar com problemas que não podem ser resolvidos no sentido clássico do termo, a inteligência artificial é um tanto diferente da computação clássica. Na computação clássica, antes de tentar resolver um problema, deve-se primeiro saber se uma solução existe, então cria-se um algorítmo capaz de encontrar esta solução, e depois se implementa este algorítmo. Na inteligência artifical, é comum não se preocupar com a existência ou não de soluções, e boa parte das vezes não se sabe se um algorítmo vai "resolver" o problema antes de implementá-lo. Isso mesmo definindo-se "resolver" como encontrar uma resposta aproximada que é boa o bastante.

Bom, mas esse artigo já tá grande o bastante, volto no assunto depois. Ainda falta falar sobre a busca de soluções de forma teórica, e vou para a prática falar de algorítmos bem conhecidos.

Update: Como o blogger não suporta categorias, eu vou adicionar a sigla IA no começo dos títulos dessa categoria.

quinta-feira, abril 13, 2006

Inicialização do Linux

Um dos projetos no qual estava trabalhando antes de ficar sem tempo é um inicializador novo para o Linux. A idéia é rodar os processos em paralelo quando possivel, diferentemente do que se faz hoje, de rodar eles em série.

Bom, a idéia é bastante simples, em um diretório dentro de /etc ficam alguns arquivos que descrevem um grafo. Cada um destes arquivos define um alvo e nós comuns. Todos os nós têm uma lista de dependências, que podem conter alvos ou nós comuns, e o inicializador recebe o nome de um alvo de init.

Isso é simples, em dois dias eu pude criar um programa em Perl que fazia isso (não pretendo mudar o processo init), mas é em Perl... O Miguel tem um artigo sobre Perl no Log4Dev :) mas o problema não é esse não. Perl cai tão bem no problema que o código ficou mais legivel e fácil de se manter do que em qualquer outra linguagem que eu pensei na época. O problema é que Perl é interpretado, e nem sempre se tem um interpretador de Perl em mãos antes de começar rcS... Existe um compilador de Perl, mas ele ainda esta bem instável, e não consegue rodar o meu código, assim, até agora eu estava esperando o problema desaparecer :)

Mas então eu percebi que posso fazer o programa em Mercury! Afinal, eu preciso de grafos, e interpretar os arquivos de configuração, e usar um named fifo. Nada que seja dificil de fazer em Mercury, e vou ter um programa para aprender a linguagem direito :)

Daí, depois de tudo pronto, eu vou poder começar a parte dificil, que é traduzir as configurações do sistema atual para o novo. Isso sim vai dar trabalho.

Acabei!!!!!!!!

Finalmente acabei a versão inicial da minha dissertação de mestrado. Isso significa que eu vou ter mais tempo para escrever aqui, e que devo publicar minha biblioteca de visão estéreo logo (desisti de esperar a GPLv3, ela deve demorar muito, depois eu mudo pra ela).

Como prometido, a biblioteca gera resultados melhores do que outros métodos já conhecidos e com menor tempo de processamento. Mas muita coisa ainda está por ser feita, já que por hora ela não consegue obter resultados em tempo real, é bastante sensível a variações de ambiênte (dá pra concertar) e acho que é possivel melhorar ainda mais os resultados aumentando pouco o tempo de processamento. Além disso, ela não funciona com configurações genéricas das câmeras.

Ou seja, vai um bom tempo até ela ser mesmo útil :( Mas eu vou ter mais tempo para escrever aqui :)