/monte-carlo-project.js Secret
Last active
July 30, 2023 20:34
Star
You must be signed in to star a gist
Метод-Монте Карло для расчета вероятности срока решения проекта на основе пропускной способности по задачам и количеству задач в проекте
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Данные по пропускной способности по итерациям времени | |
// итерация - минимальная еденица времени в которой хотим считать | |
// длительность проекта | |
const historicalDataThroughput = [ | |
4, 1, 2, 1, 4, 3, 2, 3, 2, 3, 6, | |
3, 2, 1, 6, 13, 3, 1, 6, 1, 2, | |
4, 4, 6, 3, 1, 3, 3, 6, 6, 2, | |
6, 2, 1 | |
]; | |
// количество задач в проекте | |
const countTaskInProject = 40; | |
const result = MonteCarloForProject(historicalDataThroughput, countTaskInProject, 10000); | |
console.table(result) | |
/** | |
* Получить распределение вероятности завершения проекта | |
* на основе количества решаемых задач за итерацию | |
* | |
* @param {Array<Number>} historicalDataThroughput Набор испторических данных по пропускной способности | |
* @param {Number} countTaskInProject Количество задач в проекте | |
* @param {Number} numberOfExperiments Количество проводимх эксперимантов | |
* @returns {Array<Number, Number>} key - количество фич в итерации, value - частота | |
*/ | |
function MonteCarloForProject( | |
historicalDataThroughput, | |
countTaskInProject, | |
numberOfExperiments | |
) { | |
const result = new Map(); | |
const len = historicalDataThroughput.length | |
let experiment = 1; | |
for (; experiment <= numberOfExperiments; experiment++) { | |
let prjTasks = countTaskInProject; | |
// индекс начинается с "0" | |
let IndexIteration = 0; | |
while (prjTasks > 0) { | |
let randomIndex = Math.floor(Math.random() * len); | |
let countTasks = historicalDataThroughput[randomIndex]; | |
IndexIteration += 1; | |
prjTasks = prjTasks - countTasks; | |
} | |
let i = result.get(IndexIteration); | |
result.set(IndexIteration, i ? i + 1 : 1); | |
} | |
let sum = 0; | |
// Из Map переводим в тип Массив, расчитываем вероятность | |
return Array.from(result, ([name, value]) => ({ iteration: name, count: value})) | |
.sort((a, b) => a.iteration - b.iteration) | |
.map((i,j) => { | |
sum += i.count; | |
return { | |
...i, | |
probability: sum/numberOfExperiments | |
} | |
}) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment