Алгоритм принимает входные данные в JSON формате, которые содержат информацию об устройствах, тарифах и максимально потребляемой мощности.
На выходе алгоритм предоставляет данные в JSON формате, которые содержат информацию о суточном расписании включения устройств, а также затраты на э/э в целом и для каждого устройства отдельно.
- Входные данные преобразуются из JSON строки в JS объект.
- Входные данные распределяются на устройства (дневные, ночные и общие) и тарифы (дневные, ночные и общие).
- Массивы устройств сортируются по мощности за один полный цикл работы (в сторону уменьшения).
- Массивы тарифов сортируются по цене (в сторону увеличения).
Для каждого элемента из массива дневных устройств:
-
Проверяем можно ли добавить устройство в текущее расписание (по времени, не разрывая цикл работы устройства).
-
Проверяем не превышает ли устройство максимальную потребляемую мощность.
-
Распределяем устройство по расписанию:
3.1. Если мощность всех устройств, занесенных в расписание, на текущий час плюс мощность добавляемого не превышают максимальную потребляемую мощность, то добавляем 1 час работы устройства в расписание и расчитываем затраты на э/э за 1 час.
3.2. Если нет возможности добавить устройство, то пропускаем текущий час.
3.3. Если все часы текущего тарифа назначены/пропущены, а устройство еще не полностью занесено в расписание, то начинаем искать следующий тариф.
Для каждого элемента из массива ночных устройств:
-
Повторяем пункты 1-2 из распределения дневных устройств.
-
Распределяем устройство по расписанию:
2.1. Если текущий тариф заканчивается в эти же сутки:
2.1.1. Повторяем пункты 1.1-1.3 из распределения дневных устройств.
2.2. Если текущий тариф заканчивается на следующие сутки:
2.2.1. Для времени до 24 часов - повторяем пункты 1.1-1.3 из распределения дневных устройств.
2.2.2. Для времени от 0 часов - повторяем те же пункты, но с корректировкой времени.
Принцип тот же, что и для ночных устройств
- Округляем все значения затрат до 4 знаков после запятой.
- Преобразуем JS объект в JSON строку.
-
Если устройство только дневное/ночное и текущий тариф начинается/заканчивается на границе дня/ночи, то возвращаем тариф, который находится на другой границе.
-
Для всех остальных тарифов и устройств:
2.1. Ищем первый тариф, который начинается там, где закончился текущий.
2.2. Проверяем есть ли в расписании на время первого тарифа текущее устройство.
2.3. Ищем второй тариф, который заканчивается там, где начался текущий.
2.4. Проверяем есть ли в расписании на время второго тарифа текущее устройство.
2.5. Если совпадений по устройствам в обоих тарифах нет, то возвращаем более экономный тариф.
2.6. Если совпадения есть в одном из тарифов, то возвращаем тариф, где нет совпадений.
2.7. Если совпадения есть в обоих тарифах, то начинаем искать "вправо" тариф, который не содержит совпадений и возвращаем его.
- Проверяем устройство на наличие в списке устройств с затратами по э/э. Если нет, то добавляем в список.
- Расчитываем затраты на текущий час.
- Добавляем их в общие затраты и в затраты самого устройства.