Developer & NomadScanner
NomadScanner NomadScanner
Как бы ты спроектировал лёгкий алгоритм для отслеживания запасов и прогнозирования расхода на мобильной базе с перерывами в связи? Я тут набросал модель, использующую только локальные данные и синхронизирующуюся с облаком при возможности, но мне интересно, что ты думаешь по поводу эффективного кэширования и прогнозной аналитики для работы в полевых условиях.
Developer Developer
Конечно, без проблем. Держи модель максимально легкой: просто фиксированный список последних N событий потребления, где-то по 50 на каждый тип. Каждое новое значение обновляет скользящее среднее и простейший линейный тренд – просто прибавляем новое значение и вычитаем самое старое. Получается скользящее среднее и наклон без хранения всего. Для кэша используй LRU-лист на устройстве, но ограничь размер рамками доступной памяти – выкидывай самый старый элемент, если достиг лимита. Когда появится соединение, отправляй только дельту: количество каждого элемента, временную метку и последнее значение тренда. На сервере эти дельты объединяются в глобальную модель, которая может возвращать более точный прогноз. Используй очень простой фильтр Калмана для каждого типа элемента – всего несколько умножений и обновление состояния. Вот и все, что нужно, чтобы остаться в пределах 1 МБ оперативной памяти и держать низкую задержку. Синхронизируйся при появлении Wi-Fi сигнала или по расписанию, но никогда не блокируй основной поток. Просто, быстро и предсказуемо.
NomadScanner NomadScanner
Звучит неплохо, но лучше перепроверь энергопотребление этого фильтра Калмана – эти маленькие умножения могут здорово вытягивать энергию у солнечной панели. И ещё, если планируешь идти через тени ущелий, этот твой Wi-Fi маячок может оказаться миражом. Подумай о резервном варианте – ручной загрузке через дальнобойную радиостанцию. И как насчёт того, чтобы учесть местные знания о сезонных изменениях? Это могло бы дать проверку здравости твоего анализа, прежде чем ты отправишь его в облако.
Developer Developer
Привет, слушай, батарея – это серьёзно. Замени фильтр Калмана на EWMA; одно умножение на каждый элемент, без матрицы состояния. Для радио – просто выведи кнопку синхронизации, которая отправляет текущий дельта-значение принимающей стороне. А по поводу сезонной корректировки – веди крошечную таблицу с месячными множителями, которые ты будешь подстраивать по ходу дела, всего несколько байт. Это даст фильтр для тренда, не тратя лишнюю энергию.
NomadScanner NomadScanner
Отличный ход — EWMA держит ЦП под контролем. Только следи за таблицей месяцев, а то она может устареть; если начнется сезон миграций, придётся лету корректировать эти множители. И кнопка синхронизации — полезная штука, но убедись, что есть быстрый режим "только офлайн", чтобы не ждать, пока радио найдёт свободное небо. Хорошо придумал.
Developer Developer
Окей, ставь флаг, чтобы синхронизацию отложить до подключения радио. Обнови коэффициенты за месяцы по воздуху, как только появится хоть какой-то участок видимости — просто отправь маленький файл с патчем. Так таблица будет актуальной, не загружая её целиком. Готово.