Как интерполировать прогноз?

Рейтинг: 1Ответов: 1Опубликовано: 10.12.2014

Долгоиграющая задача выполняется шагами: череда ajax вызовов. На шаг выходит секунд 12–18. Пользователю хочется показывать что-то часто обновляемое, предсказуемое.

Сделал линейно: предполагаю, что progress = f(time) это просто k * time. (На фиддл имитация со случайным временем выполнения +- 4 секунды) При поступлении следующего ответа, этот k корректируется исходя из последней полученной точки.

Но, похоже, это неправильно: если реальный шаг внезапно тормозит, по сравнению с предыдущими, мой прогресс откатывается назад, когда приходят наконец реальные данные.

Как можно относительно реалистично угадывать прогресс, опираясь на дискретные шаги?

Ответы

▲ 1Принят

Ответа не нашлось, придумал такое решение: показывать юзеру прогресс как ф-ю от времени, которая асимптоматически стремится к очередному шагу прогресса, никогда его не достигая. Когда шаг в реале достигается, устанавливается следующая цель, а стартовая точка - показанный на сейчас %. Для наблюдателя это выглядит как ускорение/замедление постоянно растущего прогресс-бара.

Математика: ф-ия вида y = A + AB/(-x^2-B), которая стартует из заданной точки (a,b) и в ожидаемое время t достигает значения k * A, где k чуть меньше 1, а дальше приближается, но никогда не достигает A:

ф-я