Executando verificação de segurança...
8

Matemática: Finalizando com grafos, fungos e logística.

Pois é, ainda falta muito assunto para cobrir, mas por enquanto vou terminar essa mini-série que foi até que bem tranquila. (gosto de ser sarcástico e não fazer drama o tempo todo).

Para terminar, eu quero citar uma das principais formas que fazem seu mercado livre, Waze, iFood, Amazon, twitter, git... funcionarem "Grafos".


"Vocês sabem o que é um grafo?" Bem, ele é um similar ao joguinho de conecte os pontos. Pois é, na verdade, teoria dos grafos é igualmente um ramo na matemática criado para estudar relações entre objetos.

Sim, é similar ao conceito de primary-key e foreign-key no PostgreSQL, mas com muitas mais relações, incluindo relações indiretas.

Primeiramente, você sabia que a malha ferroviária japonesa foi projetada usando grafos? Curiosamente, eles não usaram algoritmos nem computadores para isso.

No caso, eles colocaram um pouco de comida em cada ponto onde precisaria ter uma estação. O fundo se dispersou em todas as direções (propagando - se) e criou uma rota mais simples que conectava o ponto inicial ao destino. "Sim, é similar ao algoritmo A*".

Outro caso famoso para uso de grafos, é em logística.

Um dos principais problemas que temos é como entregar mais mercadorias, em diferentes localidades com o menor tempo possível para entrega e o menor custo de combustível

E existem vários outros casos:

  • Versionamento de código
  • Recomendação
  • Redes Sociais
  • Biologia
  • Redes
  • Inteligências Artificias
  • Segurança
  • Computação Gráfica
  • Análise de Texto e Linguística.

Por exemplo, o Git usa um Grafo DAG que significa Direct Acyclic Graph onde a modelagem do mesmo é uma lista ligada simples que nunca gera um ciclo em si.

Ou seja, com operações como merge ou rebase, o grafo continuará seguindo em frente, independentemente dos desvios ou branches criados.

Obviamente, embora árvores sejam grafos acíclicos, elas não são direcionadas, pois necessitam de desvios à esquerda e à direita para manter a ordenação.

Mas, para não parecer que estamos falando mal dos grafos cíclicos. Um dos melhores usos para grafos cíclicos são máquinas de estado, estrutura essa que é infinitamente superior a qualquer inteligência artificial pelo seu determinismo.

Os grafos são divididos em duas partes:

  • Vértices: representam o objeto ou entidade
  • Arestas: representa o relacionamento com outra entidade

Isso deve ser bem simples.

Comece pensando num grafo com a pessoa John que curte Rap
Nesse mesmo grafo tem uma pessoa Joseph que curte Rock

Podemos relaciona - los com seu gosto por música.

Essa ideia, baseada na homofilia, é a base de muitos sistemas de recomendação, como o algoritmo do Twitter.

Ou podemos pensar no roteamento de IP's de um computador. Usando Radix Tree (que também é um grafo como citado acima).

Mas se você quer realmente um exercício para treinar sua programação eu recomendo o Tideman (CS50 - Harvard) onde você precisa evitar construir cíclos.

Este programa em C implementa um sistema de votação e eleição usando o método de votação de pares (Tideman). O programa aceita votos de eleitores e determina o vencedor da eleição com base nas preferências dos eleitores.

Grafos são a área mais poderosa ainda em descoberta na programação. Além de ser uma das mais versáteis já que quase tudo no mundo natural pode ser representado com grafos.

E uma das mais versáteis soluções para diversos problemas.

Aqui, deixo meu chapéu ao batente da porta, e me despedindo cuidadosamente. Torço no seu progresso lendo e praticando mais sobre os assuntos que citei.

Se quiser os outros dois posts da minha mini-série

Carregando publicação patrocinada...
3

Muito bom! Grafos é uma daquelas coisas que se vc só estudar a parte teórica, vai achar que não serve pra nada, mas vai se surpreender ao ver a quantidade de aplicações práticas.

Já contei aqui um caso em que precisei de grafos:

Tinha um arquivo gigante de dependências, em um formato arbitrário e não padronizado (foi bem antes de inventarem o package.json). E dava problema porque alguém colocou dependências circulares nele. Então eu joguei o arquivo em um grafo, e procurei por ciclos (que também é um algoritmo conhecido de grafos). Claro que usei uma lib pronta, mas se eu não soubesse nem o que são grafos (e se não percebesse que aquele problema no fundo tinha tudo a ver com grafos), não saberia nem por onde começar.

A última frase, aliás, resume bem o que penso sobre toda a parte teórica da computação (que vários "cursos" costumam ignorar e muita gente acha que é inútil): na maioria dos casos vc não vai usar diretamente, mas o ganho indireto no longo prazo é enorme (embora difícil de perceber, por isso há tanta resistência em aprender essa teoria toda). Se eu nem soubesse que grafos existem, iria demorar muito mais pra resolver o problema (capaz até de acabar reinventando a roda e implementando um grafo na mão sem saber).

E isso vale para um monte de problemas de programação que a gente encontra no dia-a-dia. Praticamente tudo já foi resolvido por alguma teoria matemática e possui implementações prontas. Vc só precisa saber que aquilo existe e reconhecer que se encaixa no seu problema. Pra quem acha que matemática é inútil, fica a dica: ela te ajuda a não perder tempo tentando reinventar a roda. Mas como é um ganho indireto e geralmente difícil de perceber, muita gente acha que é inútil, "nunca usei", etc. Vc usa sim, mesmo que ache que não.


Sobre o Git, um site muito bom para entender sobre o DAG é esse. E novamente, é mais um caso em que o uso é indireto: vc não implementa o grafo diretamente, mas se beneficia do conhecimento.

Foi só depois de saber que um repositório do Git é um grafo que eu passei a entender melhor o que cada comando faz. Pois no fundo todos os comandos consultam, percorrem e/ou manipulam o grafo. git log percorre os nós de commit a partir de um inicial, git merge encontra o ancestral comum entre dois ou mais nós (um algoritmo clássico de grafos) e a partir deste verifica as diferenças e mescla-as. E assim por diante. Aliás, o artigo já citado explica em detalhes como o git rebase muda a estrutura do grafo (o que me fez perder o medo de usá-lo, pois agora consigo visualizar exatamente o que está acontecendo).


Enfim, esse é um dos principais ganhos de se saber matemática: a capacidade de criar abstrações e modelos mentais, que podemos transpor para o mundo real, e a partir daí entender como as coisas funcionam (e usá-las melhor), e materializar na forma de código. Pena que a forma como ensinam matemática na escola ignora tudo isso e se foca apenas em decorar fórmulas. Não me admira que a maioria não entenda e ache que é inútil.

Felizmente temos este espaço pra tentar quebrar esse estigma e mostrar que é útil sim.

1

Nos outros posts dessa minissérie, acho que o meu melhor aprofundamento foi no post da verificação formal.

Imagina formular um automato finito base que consegue "percorrer todos os casos de uso de um algoritmo" é um nível de sofisticação que nunca ouvi falar antes.

Automato esse, que de certa forma também é uma representação em grafo.

Felizmente temos este espaço pra tentar quebrar esse estigma e mostrar que é útil sim.

É além de útil, a matemática é essencial em qualquer área, mesmo as de humanas.

2

Cara, eu adorava a aula de Grafos na faculdade, adorava tudo de estruturas de dados, os algoritimos de busca em grafos, tudo nessa área era muito interessante para mim

Saudades de estudar sobre esses tópicos especificamente grafos e árvores quando eu cursava ciência da computação, ficou muito boa a publicação mas não entendi exatamente esse "fungos" no título kkk

1

O fungo foi para retratar o uso de um grafo "analógico" feito no Japão para criar a malha rodoviária.

No caso, eles colocaram um pouco de comida em cada ponto onde precisaria ter uma estação. O fundo se dispersou em todas as direções (propagando - se) e criou uma rota mais simples que conectava o ponto inicial ao destino. "Sim, é similar ao algoritmo A*".

https://noticias.r7.com/monitor7/verdade-experimento-com-fungos-reorganizou-metro-de-toquio-07082022/