Monday, August 10, 2015

O algoritmo e a exatidão computacional

O Simples e Elegante Algoritmo Que Torna o Google Maps Possível

Escrito por
EDITOR

25 March 2015 // 11:00 AM CET


ESTE texto maravilhoso, escrito com o espirito critico e personal de Michael Byrne para a revista MOTHERBOARD despertou em mim a lembrança eterna das primeiras aulas de turbo pascal no ICEX da UFMG. Saudade de um tempo, o IBM poderoso, enorme, o tempo escasso para programar. Legal demais, queria ter lido este texto naquele tempo.



Algoritmos são uma ciência baseada em engenhosidade. Uma manifestação natural do raciocínio lógico – indução matemática, em especial – um bom algoritmo é como um retrato passageiro e condenatório da alma de um problema. Uma selva de propriedades e relações torna-se uma simples relação de recorrência, um passo recursivo de linha única produzindo caos e complexidade sem limites. E para ver através desta complexidade, é necessário engenhosidade.

Foi o pioneiro da programação Edsger W. Dijkstra quem realmente sacou isso, e o algoritmo que leva seu nome segue como uma das coisas mais engenhosas na informática. Um defensor ferrenho da simplicidade e elegância na matemática, ele meio que acreditava que todo problema complicado tinha uma parte acessível, uma entrada, e a matemática era uma ferramenta a ser usada para encontrá-la e explorá-la.
Em 1956, Dijkstra estava trabalhando no ARMAC, uma máquina de computação paralela instalada no Centro Matemático da Holanda. Tratava-se da sucessora dos computadores ARRA e ARRA II, que haviam sido, essencialmente, as primeiras máquinas deste tipo no país. Seu dever era programar aquela coisa, e assim que estivesse pronto para ser revelado ao público – após dois anos de esforço conjunto – Djikstra precisava de um problema para solucionar.

“Para uma demonstração feita para pessoas não ligadas à informática, o problema tem que ser descrito de forma que não-matemáticos possam compreender”,relembrou Dijkstra em uma entrevista concedida não muito antes de sua morte, em 2002. “Elas tem que entender até mesmo a resposta. Então projetei um programa que encontraria a rota mais curta entre duas cidades na Holanda, usando uma espécie de mapa reduzido do país, em que havia escolhido 64 cidades.”

“Qual a distância mais curta para ir de Rotterdam à Groningen?”, disse Dijkstra. “É o algoritmo para o caminho mais curto, que desenvolvi em cerca de 20 minutos.”

O Google Maps faz isso por nós agora e nem precisamos pensar no quão complexa pode ser esta tarefa. Problemas de caminhos mais curtos, característica essencial da teoria dos grafos com um monte de aplicações óbvias no mundo real, podem ficar muito complexos muito rápido. O resultado é conhecido (informalmente) como explosão combinatória, que é o onde número de diferentes combinações a serem exploradas em determinado problema cresce exponencialmente.
 O resultado de tal explosão é que problemas, como estes de caminho mais curto, crescem tão rapidamente de forma a ficarem praticamente incomputáveis, levando uma quantidade praticamente infinita de tempo para serem resolvidos. É necessário somente um punhado de pontos em um mapa ou grafo para que o número de possíveis combinações chegue aos milhões, exigindo quantidades absurdas de tempo.
A maneira mais fácil de explicar o algoritmo de Dijkstra é provavelmente através de um exemplo. Observe o gráfico abaixo, os números são os pesos de cada conexão. (Um peso pode ser uma distância simples ou qualquer custo relativo associado de percorrer determinada conexão que queremos minimizar.) Inicialmente atribuímos as, nossa posição inicial, o valor 0. São necessários 0 quilômetros (ou o que for) para chegar aqui pois é a posição inicial. Em seguida, vemos os nodos vizinhos a s, que podemos imaginar como fronteiras a serem exploradas.

Na primeira iteração, observamos o nodo mais próximo, a 1 unidade de distância. Conferimos um rótulo ao nodo com esse valor, a, e observamos os próximos nodos e suas respectivas distâncias. b está a 1 de distância (2 a partir do início), está a 2 de distância (3 a partir do início), e também temos o d, a 2 de distância do início. Já que buscamos o caminho mais curto do início, somos forçados a nos mover de d a partir de s (2 unidades), conferindo a d o valor de 2. Na próxima iteração do algoritmo, de dobservamos c a 10 de distância (12 a partir de s), mas observamos novamente a partir de a, onde podemos chegar a c em 2 (3 a partir do início) e b em 1 (2 a partir do início). Nossa próxima parada será b e lhe conferimos o valor de 2 (2 movimentos desde o início).

Nosso explorador no b irá se desapontar agora. O único movimento possível para testá a 10 unidades de distância (12 a partir do início). E isto é mais que as 2 unidades de a a c (3 a partir do início) e a mesma viagem de c por d, uma possibilidade que podemos descartar seguramente (chegando a c com apenas 3 unidades, ao invés das 12 exigidas via d). Agora estamos em c e tudo parece complicado, mas não é. Só estamos dando passos cuidadosos de nodo a nodo, enquanto somos forçados pelo algoritmo a sempre considerar o caminho mais curto desde o início.

Finalmente, observamos de b para t, mais uma vez notando que o caminho total é 12. Enquanto isso, o salto final de c custa 1 unidade, para uma distância total mais curta de 4. Então um problema incrivelmente complexo – explosivamente complexo – pode ser resolvido de forma elegante, simples e até mesmo intuitiva, no papel.
Mais exemplos:



















Segunda imagem: Sub83/Wiki
Dijkstra diz ter pensado nisso enquanto tomava uma xícara de café em alguma cafeteria local. “De fato, foi publicado em 1959, três anos depois”, lembrou. “A publicação segue ótima. uma das razões pelas quais é tão boa é que a criei sem papel nem lápis. Sem esses dois você é quase forçado a evitar complexidades. Eventualmente aquele algoritmo se tornou, para minha surpresa, um dos pilares de minha fama.”

É este algoritmo que faz o Google Maps funcionar, ou ao menos alguma variação dele. De verdade, é isso que possibilita o ato de traçar rotas: engenhosidade o bastante para ver em meio a todo o caos.
Tradução: Thiago “Índio” Silva


No comments: