修改热度计算公式
AlisaAkiron opened this issue · 6 comments
AlisaAkiron commented
当前热度计算公式为 初始值
加上 赞
踩
查看
的数量乘以对应的系数,最后全部相加得来。因此热度值只会增加不会减少。
需要添加一个按照发布时间计算的热度衰减
然后问题来了,怎么设计这个衰减(
MistEO commented
衰减系数太大就变成时间排序了,衰减系数太小解决不了活动关卡关闭后对应作业降序的需求。
所以我觉得还是给关卡加上开放时间的逻辑。。
LiamSho commented
衰减系数太大就变成时间排序了,衰减系数太小解决不了活动关卡关闭后对应作业降序的需求。
所以我觉得还是给关卡加上开放时间的逻辑。。
开放时间那得改很多了(
而且不同服务器还不一样
不过就算增加开放时间逻辑,一定的衰减还是要的
LiamSho commented
热度 = Init + C
C = 赞 * 系数1 + 踩 * 系数2 + 查看数 * 系数3
计划新增按照已发布时间的长度来为热度增加衰减或激励的函数。
热度 = Init + C * M
- 在发布后的一段时间内(例如,3 天),给予热度计算上的激励,即 M > 1
- 激励过后的一段时间内(例如,第 4 天至第 10 天),为稳定期,M = 1
- 稳定期之后(例如第 10 天之后),进入衰减期,0 < M < 1
设定一个对数函数,按照关卡类型自定义其底数 B
T = 已发布时间(最小为 1 )
激励期(U 为激励天数)
稳定期
衰减期
static double GetTimeMultiplier(DateTimeOffset releaseTime, double logBase)
{
var span = (int)Math.Round((DateTimeOffset.UtcNow - releaseTime).TotalDays);
return span switch
{
< positiveEnd => Math.Clamp(-Math.Log((span == 0 ? 1 : span) / (double)positiveEnd, logBase) + 1, 1.1, 10),
< negativeStart => 1,
_ => 1 / Math.Clamp(Math.Log(span, logBase), 1, 50)
};
}
static long GetScore(int like, int dislike, int views, DateTimeOffset releaseTime, double logBase = Math.E)
{
var score = 100 + (like * 10 + dislike * 3 + views * 1) * GetTimeMultiplier(releaseTime, logBase);
var scoreRounded = (long)Math.Round(score);
return Math.Max(0, scoreRounded);
}
martinwang2002 commented
感觉激励期的函数不太对劲
当T极小时,M~=infinity
LiamSho commented
感觉激励期的函数不太对劲
当T极小时,M~=infinity
不会,T 最小为 1,U 不会取很大,除非 B 很大很大,才会去到 INF
然后为了避免真的得到个巨大的值,代码里有写上下限(
Math.Clamp(-Math.Log((span == 0 ? 1 : span) / (double)positiveEnd, logBase) + 1, 1.1, 10);
martinwang2002 commented
lgtm