1. Localização das paradas — modelo de cobertura (facility location): minimiza o número de paradas garantindo que todo morador esteja dentro da distância de caminhada, com eliminação de paradas redundantes (busca local do tipo set-cover).
2. Alocação dos moradores — cada morador é atribuído à parada mais próxima dentro do raio de caminhada.
3. Dimensionamento da frota — para cada rota é escolhido o menor veículo que comporta a demanda (frota heterogênea).
4. Roteirização — sem servidor: heurística Clarke-Wright (savings) + 2-opt para agrupar e ordenar as paradas em rotas capacitadas. Com o servidor: solver OR-Tools (VRP heterogêneo, metaheurística Guided Local Search), que otimiza frota e sequência de forma conjunta — tende a menos veículos e menor custo.
5. Malha viária, tempo de rota e velocidade — distância e traçado vêm do OSRM (grafo do OpenStreetMap). O tempo de cada rota = km viário ÷ velocidade × 60 + tempo de serviço, sendo o serviço = 6 s por passageiro (embarque) + 20 s por parada (porta aberta). A velocidade é a base (padrão 30 km/h); ao ligar a velocidade dinâmica por horário (em “Ajustar & otimizar”), ela vira base × fator da faixa horária do horário de chegada do turno (ex.: pico 0,6× ⇒ 18 km/h) — mais lento no pico gera mais rotas para respeitar o teto de tempo.
6. Teto de tempo de rota — o modelo garante que nenhuma rota ultrapasse o tempo máximo definido (rotas abertas terminando no destino).
7. Otimização multiobjetivo (Pareto) — em transporte fretado os objetivos conflitam (menor custo × menos veículos × menor tempo × menos CO₂): reduzir o tempo de rota costuma exigir mais veículos, e vice-versa. Não existe uma única "melhor" solução — existe uma fronteira de soluções não-dominadas (onde não dá para melhorar um objetivo sem piorar outro). Na aba Comparar cenários, o botão Gerar fronteira de Pareto varre combinações de caminhada e tempo de rota no servidor e mostra esse conjunto num gráfico (custo × nº de veículos) + tabela — você escolhe o trade-off e carrega a solução no mapa.
O solver exato (OR-Tools) e a fronteira de Pareto rodam no backend (Fase 1) — abra a ferramenta pelo servidor local (http://localhost:8000) para ver o selo “Servidor · OR-Tools”. Sem o servidor, o app usa a heurística no navegador (também sobre a via real, quando disponível).