{"id":16393314,"url":"https://github.com/olucaslopes/caixeiro-viajante","last_synced_at":"2025-08-24T01:10:20.787Z","repository":{"id":107475749,"uuid":"606267025","full_name":"olucaslopes/caixeiro-viajante","owner":"olucaslopes","description":"Algoritmo de busca da menor rota entre 20 municípios paulistas","archived":false,"fork":false,"pushed_at":"2023-03-17T11:31:54.000Z","size":7120,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-20T00:38:11.358Z","etag":null,"topics":["caixeiro-viajante","operations-research","optimization","or-tools","ortools","otimizacao","pesquisa-operacional","python","sao-paulo","travelling-salesman-problem","tsp"],"latest_commit_sha":null,"homepage":"","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/olucaslopes.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2023-02-25T01:36:23.000Z","updated_at":"2024-05-20T11:13:06.000Z","dependencies_parsed_at":"2023-05-17T13:45:43.093Z","dependency_job_id":null,"html_url":"https://github.com/olucaslopes/caixeiro-viajante","commit_stats":{"total_commits":7,"total_committers":2,"mean_commits":3.5,"dds":0.4285714285714286,"last_synced_commit":"53a0801cddb0f0fbbff6e619af0c6d307d3385ed"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/olucaslopes%2Fcaixeiro-viajante","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/olucaslopes%2Fcaixeiro-viajante/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/olucaslopes%2Fcaixeiro-viajante/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/olucaslopes%2Fcaixeiro-viajante/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/olucaslopes","download_url":"https://codeload.github.com/olucaslopes/caixeiro-viajante/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252913057,"owners_count":21824092,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["caixeiro-viajante","operations-research","optimization","or-tools","ortools","otimizacao","pesquisa-operacional","python","sao-paulo","travelling-salesman-problem","tsp"],"created_at":"2024-10-11T04:52:55.049Z","updated_at":"2025-05-07T16:21:09.078Z","avatar_url":"https://github.com/olucaslopes.png","language":"Jupyter Notebook","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Descobrindo o caminho perfeito: a otimização da rota entre cidades paulistas\n\nAlgoritmo de busca da menor rota entre 20 municípios paulistas\n\n\u003e Esse projeto foi desenvolvido para a disciplina de Otimização e Simulação e entregue dia 24/06/2022 durante a minha graduação em Ciência de Dados e Inteligência Artificial na PUC-SP\n\n## 1. Contextualização\n\nO Problema do Caixeiro Viajante é um problema que tenta determinar a menor rota para percorrer uma série de cidades (visitando uma única vez cada uma delas), retornando à cidade de origem. Ele é um problema de otimização NP-difícil inspirado na necessidade dos vendedores em realizar entregas em diversos locais (as cidades) percorrendo o menor caminho possível, reduzindo o tempo necessário para a viagem e os possíveis custos com transporte e combustível. [(1)](#referências)\n\n## 2. Objetivo do Projeto\n\nO objetivo deste projeto é desenvolver um algorítmo que encontre a melhor rota entre pelo menos 20 cidades do estado de São Paulo, partindo da capital e retornando a ela no final, sem repetição de cidades (problema do caixeiro viajante). Caso o número de cidades seja inferior a 20, o projeto deve permitir que o usuário especifique quais cidades serão utilizadas no cálculo. Será necessário utilizar um algoritmo de preferência do desenvolvedor e criar um mapa para ilustrar a solução obtida. O objetivo final é apresentar uma solução precisa e visualmente atraente para o problema proposto.\n\n## 3. Descrição dos Dados\n\nO dataset [cidades_sp.tsv](./cidades_sp.tsv) foi gerado por mim com base no caderno [Mapas2.ipynb](./material-de-apoio/Mapas2.ipynb) disponibilizado pelo professor como material de apoio. Ele apresenta a distância entre municípios do estado de São Paulo para cada um dos municípios\n\n\u003e ⚠ Importante\n\u003e - O **ponto** que representa cada município foi definido como o **centro geográfico** de cada município\n\u003e - As **distâncias** calculadas são as distâncias em **linha reta** entre os centros geográficos e não a distância real via estrada, por exemplo\n\nAmostra do dataset:\n\n| origem | destino | distancia |\n| :-- | :-- | :-- |\n| Adamantina | Adamantina | 0.000000 |\n| Adamantina | Adolfo | 148.940883 |\n| Adamantina | Aguaí | 418.569402 |\n| Adamantina | Águas da Prata | 453.052818 |\n| Adamantina | Águas de Lindóia | 470.358245 |\n\n## 4. Proposta de solução\n\nCidades escolhidas para o desafio: `Sarapuí`, `Sarutaiá`, `Sebastianópolis do Sul`, `Serra Azul`,`Serra Negra`, `Serrana`, `Sertãozinho`, `Sete Barras`, `Severínia`,`Silveiras`, `Sorocaba`, `Sud Mennucci`, `São Paulo`, `São Pedro`,`São Pedro do Turvo`, `São Roque`, `São Sebastião`,`São Sebastião da Grama`, `São Simão`, `São Vicente`\n\n- Solver: pywrapcp.RoutingModel [(2)](#referências)\n- Frameworks usados: [OR-Tools](https://developers.google.com/optimization), [pandas](https://pandas.pydata.org/docs/), [numpy](https://numpy.org/doc/), [geopandas](https://geopandas.org/en/stable/docs.html), [networkx](https://networkx.org/), [folium](https://python-visualization.github.io/folium/), [matplotlib](https://matplotlib.org/stable/index.html)\n\n## 5. Resultados:\n\nA menor rota que sai da capital paulista e passa por todas as cidades selecionadas e volta para a capital tem 1892 km de extenção\n\nRota: `São Paulo` → `São Vicente` → `São Sebastião` → `Silveiras` → `Serra Negra` → `São Sebastião da Grama` → `São Simão` → `Serra Azul` → `Serrana` → `Sertãozinho` → `Severínia` → `Sebastianópolis do Sul` → `Sud Mennucci` → `São Pedro do Turvo` → `Sarutaiá` → `São Pedro` → `Sarapuí` → `Sete Barras` → `Sorocaba` → `São Roque` → `São Paulo`\n\n\n### Grafo da solução\n- cada nó (node) representa uma cidade\n- os valores dos vértices (edges) representam a distância entre dois nós\n- a distribuição espacial não reflete a distribuição geográfica real\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./img/grafo-rota.png\" width=60%/\u003e\n\u003c/p\u003e\n\n### Mapa da solução\n- distribuição espacial real dos pontos\n- as retas em vermelho representam a distância considerada entre os municípios\n- o ponto em vermelho representa o município de São Paulo, que é o ponto de partida e o ponto final de chegada da rota\n- os pontos em azul representam os demais municípios\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./img/mapa-rota.png\" width=80%/\u003e\n\u003c/p\u003e\n\n## 6. Oportunidades futuras\n\nUma vez que desenvolvi um método para calcular as distâncias entre uma amostra das cidades do estado, uma oportunidade futura é calcular cenários sem restrições de quantidade de cidades, por exemplo:\n\n- qual é a rota mais curta que passa por TODAS as cidades do estado de São Paulo?\n- qual é a rota mais longa que passa por TODAS as cidades do estado de São Paulo?\n- qual é a rota mais curta que passa por TODAS as cidades do Brasil?\n- qual é a rota mais longa que passa por TODAS as cidades do Brasil?\n\nContudo, tais implementações irão precisar de um poder computacional muito maior para resolver o problema na mesma escala de tempo que a solução desse projeto. Para uma solução em força-bruta, a escala de complexidade desse problema é $O(n!)$\n\nPor fim, ao invés de considerar a distância em linha reta entre os municípios, podemos calcular a distância entre eles pela estrada e isso resultaria em um resultado mais preciso.\n\n## Referências\n\n[(1)](#1-contextualização) Problema do caixeiro-viajante. In: WIKIPÉDIA: a enciclopédia livre. Disponível em: https://pt.wikipedia.org/wiki/Problema_do_caixeiro-viajante. Acesso em: 24 fev. 2023.\n\n[(2)](#4-proposta-de-solução) Traveling Salesperson Problem. In: OR-Tools: fast and portable software for combinatorial optimization. Disponível em: https://developers.google.com/optimization/routing/tsp. Acesso em: 24 fev. 2023.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Folucaslopes%2Fcaixeiro-viajante","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Folucaslopes%2Fcaixeiro-viajante","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Folucaslopes%2Fcaixeiro-viajante/lists"}