Эффективный расчет даты доступности на основе списка проектных заданий и известной производительности

Вопросы и ответы

Я ищу эффективный способ рассчитать дату, когда каждый член команды будет доступен, учитывая набор проектных заданий. В команде 25 человек, каждый из которых имеет свои возможности и назначения.

Возможности представляют собой процент доступности между двумя датами (это поддерживает частичное время работы, где 100% – это полный рабочий день), с нулевыми конечными датами для сценариев, когда возможность не ограничена. Возможности могут быть равны нулю, чтобы поддерживать такие ситуации, как временные переводы или отпуск по уходу за ребенком.

Задания связывают члена команды с проектом на процентной основе между двумя датами. Это позволяет члену команды одновременно работать над двумя проектами (например, распределение 60/40), и эти проценты суммируются до общей возможности члена команды. Так, если у человека 60% возможностей, он может иметь два проекта по 30% каждый.

Все это работает отлично, но теперь я хочу рассчитать дату, когда каждый член команды будет доступен в следующий раз. Я могу сделать это, используя метод «грубой силы», пройдя по циклу и считая вперед один день за раз, пока не дойду до точки, где общий назначенный процент меньше возможностей, но это кажется дико неэффективным – есть ли лучший способ?

Я добавил изображение диаграммы Ганта, чтобы показать, что я имею в виду, я хотел бы рассчитать даты, где находятся красные линии. Любая помощь, даже псевдокод, будет очень полезна. Стек технологий – NodeJS и Vue, и я использую библиотеку Luxon в методе «грубой силы». Язык не имеет значения, я ищу помощь в общем подходе к проблеме, который затем смогу реализовать на JS.

введите описание изображения здесь

Ответ

Чтобы эффективно рассчитать дату, когда каждый член команды будет доступен, исходя из заданных проектных назначений и известной емкости, можно использовать более оптимизированный подход, чем простой перебор дней. Давайте рассмотрим шаги для решения этой задачи.

Шаги для решения:

  1. Подготовка данных:
    Вы должны иметь доступ к списку членов команды с их емкостью и проектными назначениями, представленными в удобной структуре (массив объектов).

    const teamMembers = [
       {
           name: "Иван",
           capacity: 100, // Процент всей доступности
           assignments: [
               { project: "Проект A", percentage: 40, start: "2023-01-01", end: "2023-06-30" },
               { project: "Проект B", percentage: 60, start: "2023-03-01", end: "2023-04-15" },
           ],
       },
       // ... другие члены команды
    ];
  2. Создание функции для расчета доступности:
    Вместо того, чтобы перебирать каждый день, мы можем создать функцию, которая будет проверять недели или месяцы, чтобы определить, когда будет достигнута доступность. В этой функции вы суммируете процентные значения для проверяемого диапазона дат.

    const { DateTime } = require("luxon");
    
    function calculateAvailability(member) {
       let currentDate = DateTime.local(); // Начнём с сегодняшнего дня
       const capacity = member.capacity;
    
       while (true) {
           const totalAssigned = member.assignments.reduce((sum, assignment) => {
               const startDate = DateTime.fromISO(assignment.start);
               const endDate = assignment.end ? DateTime.fromISO(assignment.end) : DateTime.local().plus({ years: 10 });
    
               // Если текущая дата находится в диапазоне назначения
               if (currentDate >= startDate && currentDate <= endDate) {
                   return sum + assignment.percentage; // Суммируем процентное назначение
               }
               return sum;
           }, 0);
    
           if (totalAssigned < capacity) {
               return currentDate.toISODate();
           }
    
           // Увеличиваем дату, с которой будем проверять
           currentDate = currentDate.plus({ days: 1 });
       }
    }
    
    // Применяем нашу функцию к членам команды
    teamMembers.forEach(member => {
       const availableDate = calculateAvailability(member);
       console.log(`Член команды ${member.name} будет доступен с ${availableDate}`);
    });
  3. Оптимизация:

    • Вместо увеличения на один день, полезно делать "прыжки" через дни (например, пробежать все будние дни или выходные), что может значительно уменьшить количество итераций.
    • Используйте бинарный поиск для определения ближайшей даты доступности, что также может повысить эффективность алгоритма.
  4. Тестирование и отладка:
    • Проверьте функцию на разных наборах данных, включая крайние случаи (например, все члены команды недоступны, нулевая емкость и т. д.), чтобы убедиться, что она работает как ожидается.

Этот подход должен быть более эффективен по сравнению с методом "грубой силы" с перебором каждого дня. С помощью библиотек, таких как Luxon, можно легко манипулировать датами и произвести необходимые расчеты.

Оцените материал
Добавить комментарий

Капча загружается...