Здравствуйте, переполнение стека,
У меня есть ситуация, когда мне нужна помощь в выборе лучшего способа заставить алгоритм работать, цель состоит в том, чтобы управлять занятостью ресурса (давайте рассмотрим ресурс A), чтобы иметь несколько задач, и где каждая задача занимает указанное количество времени для завершения. На этом первом этапе я не хочу задействовать несколько переменных, поэтому давайте сохраним это простым способом, давайте рассмотрим, у него есть только график рабочих дней.
Например:
1 - у нас есть 1 ресурс, ресурс A
2 - Ресурс А работает с 8:00 до 16:00, с понедельника по пятницу, если говорить проще, сейчас у него нет обеда, поэтому 8 часов работы в день.
3 - Ресурс А должен выполнить 5 задач, чтобы избежать сложности на этом уровне, давайте предположим, что для выполнения каждой из них потребуется ровно 10 часов.
4 - Ресурс А начнет работу над этими задачами в 2018-05-16, ровно в 2 часа дня.
Проблема:
Теперь все, что мне нужно знать, это правильная дата окончания всех 5 заданий, но с учетом всех предыдущих ограничений.
В этом случае у него есть 6 рабочих дней и дополнительно 2 часа 7-го дня.
Ожидаемый результат, который я хочу получить: 2018-05-24 (в 4 часа дня).
Реализация:
Я подумал о двух вариантах и хотел бы получить отзывы об этих или других параметрах, которые я мог бы не рассмотреть.
Алгоритм 1
1 - Создать список «слотов», где каждый «слот» будет представлять 1 час для x дней.
2 - Скрестите этот список слотов с часовым расписанием ресурса, чтобы удалить все слоты, где ресурса нет. Это вернет список со слотами, с которыми он действительно может работать.
3 - Занять оставшиеся слоты с заданиями, которые у меня есть для него.
4 - Finnaly, проверьте дату / час последнего занятого слота.
Недостаток: Я думаю, что это может быть излишним решением, учитывая, что я не хочу рассматривать его профессию на будущее, все, что я хочу, это знать, когда будут выполнены задачи.
Алгоритм 2
1 - Добавьте часы задачи (50 часов) к дате начала, получая ожидаемую конечную дату окончания. (Будет ожидаемымFinishDate = 2018-05-18 (в 16:00))
2 - Переведите часы между датой начала и ожидаемой конечной датой и расписанием, чтобы получить количество часов, в течение которых он не будет работать. (в основном получит недоступные часы, 16 часов в день, что приведет к оставшемуся часу ForCalc = 32 часа).
3 - рассчитать новую ожидаемую конечную дату с недоступными часами, добавив эти 32 часа к предыдущему 2018-05-18 (в 16:00).
4 - Повторите пункты 2 и 3 с новой ожидаемой конечной датой до оставшихся часовForCalc = 0.
Недостаток: Это может привести к рекурсивному методу или к очень странному циклу while, опять же, я думаю, это может быть излишним для вычисления простой даты.
Что бы вы предложили? Есть ли другой вариант, который я мог бы не рассмотреть, который сделал бы это проще? Или вы думаете, что есть способ улучшить любой из этих двух алгоритмов, чтобы он работал?