-
-
Save GlauberF/234fb9a3acbeafbebaefd241907e05fb to your computer and use it in GitHub Desktop.
| // --- PARÂMETROS DA SIMULAÇÃO --- | |
| // 1. Definimos os valores padrão (default) | |
| const VALORES_PADRAO = { | |
| tarefas: 15, | |
| vazaoMin: 3, | |
| vazaoMax: 8, | |
| simulacoes: 10000, | |
| }; | |
| // 2. Capturamos os argumentos da linha de comando | |
| const args = process.argv.slice(2); // Pega apenas os argumentos do usuário | |
| // Exibe ajuda se o usuário pedir | |
| if (args[0] === '--help' || args[0] === '-h') { | |
| console.log(` | |
| Uso: node previsao_cli.js [tarefas] [vazao_min] [vazao_max] | |
| Argumentos: | |
| [tarefas] - (Opcional) O número de tarefas restantes. Padrão: ${VALORES_PADRAO.tarefas} | |
| [vazao_min] - (Opcional) A menor quantidade de tarefas feitas em uma semana. Padrão: ${VALORES_PADRAO.vazaoMin} | |
| [vazao_max] - (Opcional) A maior quantidade de tarefas feitas em uma semana. Padrão: ${VALORES_PADRAO.vazaoMax} | |
| Exemplos: | |
| - Usar valores padrão: | |
| node previsao_cli.js | |
| - Simular para 50 tarefas restantes: | |
| node previsao_cli.js 50 | |
| - Simular para 50 tarefas com vazão entre 5 e 12: | |
| node previsao_cli.js 50 5 12 | |
| `); | |
| process.exit(0); // Encerra o script | |
| } | |
| // 3. Substituímos os padrões pelos argumentos informados, se existirem | |
| const TAREFAS_RESTANTES = parseInt(args[0], 10) || VALORES_PADRAO.tarefas; | |
| const VAZAO_MINIMA_SEMANAL = parseInt(args[1], 10) || VALORES_PADRAO.vazaoMin; | |
| const VAZAO_MAXIMA_SEMANAL = parseInt(args[2], 10) || VALORES_PADRAO.vazaoMax; | |
| const NUMERO_DE_SIMULACOES = VALORES_PADRAO.simulacoes; | |
| // Validação simples para garantir que min <= max | |
| if (VAZAO_MINIMA_SEMANAL > VAZAO_MAXIMA_SEMANAL) { | |
| console.error("\x1b[31mErro: A vazão mínima não pode ser maior que a vazão máxima.\x1b[0m"); | |
| process.exit(1); // Encerra com código de erro | |
| } | |
| // --- LÓGICA DA SIMULAÇÃO (Permanece a mesma) --- | |
| function sortearVazao(min, max) { | |
| return Math.floor(Math.random() * (max - min + 1)) + min; | |
| } | |
| function executarUmaSimulacao() { | |
| let semanas = 0; | |
| let tarefasConcluidas = 0; | |
| while (tarefasConcluidas < TAREFAS_RESTANTES) { | |
| semanas++; | |
| tarefasConcluidas += sortearVazao(VAZAO_MINIMA_SEMANAL, VAZAO_MAXIMA_SEMANAL); | |
| } | |
| return semanas; | |
| } | |
| function analisarResultados(resultados) { | |
| resultados.sort((a, b) => a - b); | |
| const calcularPercentil = (percentil) => { | |
| const index = Math.ceil(percentil / 100 * resultados.length) - 1; | |
| return resultados[index]; | |
| }; | |
| const p50 = calcularPercentil(50); | |
| const p70 = calcularPercentil(70); | |
| const p85 = calcularPercentil(85); | |
| const p95 = calcularPercentil(95); | |
| console.log("--- Previsão de Entrega (Simulação de Monte Carlo) ---"); | |
| console.log(`\nBaseado em ${NUMERO_DE_SIMULACOES.toLocaleString('pt-BR')} simulações para completar ${TAREFAS_RESTANTES} tarefas:`); | |
| console.log(`Vazão semanal estimada entre ${VAZAO_MINIMA_SEMANAL} e ${VAZAO_MAXIMA_SEMANAL} tarefas.`); | |
| console.log("\nResultados Probabilísticos:"); | |
| console.log(`\x1b[33m%s\x1b[0m`, ` -> 50% de chance de terminar em ${p50} semanas ou menos. (Resultado mais provável)`); | |
| console.log(`\x1b[32m%s\x1b[0m`, ` -> 70% de chance de terminar em ${p70} semanas ou menos.`); | |
| console.log(`\x1b[32m%s\x1b[0m`, ` -> 85% de chance de terminar em ${p85} semanas ou menos. (Previsão com alta confiança)`); | |
| console.log(`\x1b[32m%s\x1b[0m`, ` -> 95% de chance de terminar em ${p95} semanas ou menos. (Previsão com confiança muito alta)`); | |
| } | |
| // --- EXECUÇÃO PRINCIPAL --- | |
| const todosOsResultados = []; | |
| for (let i = 0; i < NUMERO_DE_SIMULACOES; i++) { | |
| todosOsResultados.push(executarUmaSimulacao()); | |
| } | |
| analisarResultados(todosOsResultados); |
Exemplo de saída(usando dados padrão e fictícios)
`
node previsao_cli.js
--- Previsão de Entrega (Simulação de Monte Carlo) ---
Baseado em 10.000 simulações para completar 15 tarefas:
Vazão semanal estimada entre 3 e 8 tarefas.
Resultados Probabilísticos:
-> 50% de chance de terminar em 3 semanas ou menos. (Resultado mais provável)
-> 70% de chance de terminar em 3 semanas ou menos.
-> 85% de chance de terminar em 4 semanas ou menos. (Previsão com alta confiança)
-> 95% de chance de terminar em 4 semanas ou menos. (Previsão com confiança muito alta)
`
Explicação:
A saída de cada uma das 10.000 simulações é um número inteiro de semanas. O projeto pode terminar em 2 semanas, 3 semanas, 4 semanas, etc. Ele não pode terminar em 3.5 semanas, pois a nossa unidade de medida é a "semana" (a cada semana sorteamos uma nova quantidade de tarefas feitas).
Quando a simulação termina, temos uma lista com 10.000 números inteiros, por exemplo: [3, 2, 4, 3, 3, 4, 2, 5, 3, 3, 4, ...]
Para calcular os percentis, o script ordena essa lista do menor para o maior:
[2, 2, ..., 3, 3, 3, 3, 3, ..., 4, 4, 4, ..., 5, ...]
Agora, vamos analisar o que a sua saída significa olhando para essa lista ordenada de 10.000 resultados:
1 - 50% de chance de terminar em 3 semanas ou menos
Isso significa que o resultado na posição 5.000 da lista ordenada (a metade) é o número 3. Ou seja, pelo menos 5.000 das 10.000 simulações terminaram em 3 semanas ou menos.
2 - 70% de chance de terminar em 3 semanas ou menos
Isso significa que se você avançar na lista até a posição 7.000, o resultado que está lá ainda é 3. Isso revela algo crucial: o resultado "3 semanas" é muito comum! Um grande "bloco" de resultados na sua lista ordenada, indo da posição ~5.000 até a ~7.000 (e provavelmente antes e depois), é composto pelo número 3.
3 - 85% de chance de terminar em 4 semanas ou menos
Aqui está o "pulo"! Quando você avança para a posição 8.500 na lista, o número finalmente muda para 4. Isso indica que entre o percentil 70 e o 85, os cenários que levavam 3 semanas se esgotaram e agora estamos na faixa de cenários que levaram 4 semanas.
4 - 95% de chance de terminar em 4 semanas ou menos
Da mesma forma que antes, ao avançar da posição 8.500 para a 9.500, o valor ainda é 4. Isso mostra que o resultado "4 semanas" também é bastante comum, cobrindo essa fatia de 10% das simulações.
O que isso significa na prática?
Essa repetição de valores lhe dá um mapa claro dos riscos.
1 - Alta Probabilidade de 3 Semanas: Existe uma chance muito grande (até 70%) de o projeto terminar em 3 semanas. Esse é o seu cenário mais provável e otimista-realista.
2 - Um "Degrau" de Risco: A simulação está alertando que existe um "degrau" ou "salto" de risco. Se as coisas não saírem como na maioria dos cenários (que terminam em 3 semanas), o próximo resultado mais provável não é 3.1 ou 3.2, mas sim 4 semanas.
3 - Planejamento de Alta Confiança: Se você precisa comunicar um prazo com alta confiança (85% ou mais), você não pode prometer 3 semanas. A simulação mostra claramente que para atingir esse nível de certeza, você precisa se planejar para 4 semanas.
1 - Usando os valores padrão.
Simplesmente execute o script sem argumentos.
node previsao_cli.js2 - Alterando apenas o número de tarefas (ex: 50 tarefas)
Passe o primeiro argumento. Os outros usarão o padrão.
node previsao_cli.js 503 - Alterando todos os parâmetros
Imagine que um projeto maior tem 90 tarefas restantes e a equipe foi reforçada, então a vazão agora varia entre 8 e 15 tarefas por semana.
node previsao_cli.js 90 8 154 - Pedindo ajuda
Se você esquecer a ordem ou o que cada parâmetro faz, pode pedir ajuda.
node previsao_cli.js --help