Я пытаюсь придумать взвешенный алгоритм для приложения. В приложении имеется ограниченное количество пространства, доступного для различных элементов. Как только все пространство занято, алгоритм должен выбрать лучшие элементы для удаления, чтобы освободить место для новых элементов.
Существуют различные атрибуты, которые должны влиять на это решение. Например:
- T: время с момента последнего доступа. (Лучше всего заменить что-то, к чему давно не обращались.)
- N: количество обращений. (Лучше всего заменить что-то, к чему не обращались много раз.)
- R: Количество элементов, которые необходимо удалить, чтобы освободить место для нового элемента. (Лучше всего заменить наименьшее количество элементов. В идеале это также должно учитывать атрибуты T и N каждого заменяемого элемента.)
У меня 2 проблемы:
- Выяснить, сколько веса придать каждому из этих атрибутов.
- Выяснить, как рассчитать вес для элемента.
(1) Я понимаю, что придумывать вес для чего-то подобного очень субъективно, но я надеялся, что есть стандартный метод или что-то, что может помочь мне решить, какой вес придать каждому атрибуту. Например, я думал, что одним из методов может быть создание набора из двух образцов элементов, а затем вручную сравнить два и решить, какой из них в конечном итоге должен быть выбран. Вот пример:
Элемент A: N = 5, T = 2 часа назад.
Элемент B: N = 4, T = 10 минут назад.
В этом примере я, вероятно, хотел бы, чтобы A был элементом, выбранным для замены, поскольку, хотя к нему обращались еще раз, к нему не обращались в течение длительного времени по сравнению с B. Этот метод выглядит как это займет много времени и потребует принятия множества жестких, субъективных решений. Кроме того, может оказаться нетривиальным подвести итоговые веса в конце.
Другой метод, который я придумал, состоял в том, чтобы просто произвольно выбирать веса для различных атрибутов, а затем некоторое время использовать приложение. Если я замечу что-то явно не так с алгоритмом, я мог бы пойти и немного изменить веса. Это в основном метод «угадай и проверь».
Оба эти метода не кажутся такими уж хорошими, и я надеюсь, что есть лучшее решение.
(2) Как только я выясню вес, я не уверен, какой способ лучше всего рассчитать вес. Должен ли я просто добавить все? (В этих примерах я предполагаю, что любой элемент с наибольшим значением replacementWeight
должен быть тем, который будет заменен.)
replacementWeight = .4*T - .1*N - 2*R
или умножить все?
replacementWeight = (T) * (.5*N) * (.1*R)
А как насчет того, чтобы не использовать константы для весов? Например, конечно, «Время» (T) может быть важным, но как только определенное количество времени прошло, оно не будет иметь большого значения. По сути, я бы все это поместил в мусорное ведро "много времени прошло". (например, несмотря на то, что разница между двумя часами составляет 8 часов и 7 часов, эта разница может быть не такой значительной, как разница между 1 минутой и 5 минутами, поскольку эти два значения гораздо более поздние.) ) 1 или 2 элемента - это хорошо, но когда я начинаю нуждаться в замене 5 или 6, это должно быть сильно утяжелено ... поэтому оно не должно быть линейным.)
replacementWeight = 1/T + sqrt(N) - R*R
Очевидно, что (1) и (2) тесно связаны, поэтому я надеюсь, что есть лучший способ придумать такой алгоритм.