After various attempts that were eventually unsatisfying, i developed a Fibonacci-based approach; songs are added to a list according to how many times they've been played, and each list has a backoff value where a song isn't allowed to show up until it has been Fn days since it was last played. These lists are aggregated into a master list. Another list is created for songs above a minimum number of plays that have not been played for a number of days that is larger than the largest value from the previous lists. The value varies in an attempt to balance the amount of tracks in the latter list with those of the former aggregated list.
As it stands now, I have lists for tracks played up to 11 times, aggregated in the ‘lessthan12’ playlist, which itself is bound to the ’Not Recently Played’ playlist in ‘listen’. I recently ran through the entire playlist, so I am back to playing my entire catalog on shuffle, in order to allow the lists to repopulate.