Skip to content

Instantly share code, notes, and snippets.

@pavelpower
Last active July 30, 2023 20:34
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pavelpower/97625088b6cdbde9cfdd4f181fb33a39 to your computer and use it in GitHub Desktop.
Save pavelpower/97625088b6cdbde9cfdd4f181fb33a39 to your computer and use it in GitHub Desktop.
Метод-Монте Карло для расчета вероятности срока решения проекта на основе пропускной способности по задачам и количеству задач в проекте
// Данные по пропускной способности по итерациям времени
// итерация - минимальная еденица времени в которой хотим считать
// длительность проекта
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