-
-
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.js
2 - 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 50
3 - 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 15
4 - Pedindo ajuda
Se você esquecer a ordem ou o que cada parâmetro faz, pode pedir ajuda.
node previsao_cli.js --help