MaaAssistantArknights/MaaCopilotServer

修改热度计算公式

AlisaAkiron opened this issue · 6 comments

当前热度计算公式为 初始值 加上 查看 的数量乘以对应的系数,最后全部相加得来。因此热度值只会增加不会减少。

需要添加一个按照发布时间计算的热度衰减

然后问题来了,怎么设计这个衰减(

@MistEO
@GalvinGao
@martinwang2002

衰减系数太大就变成时间排序了,衰减系数太小解决不了活动关卡关闭后对应作业降序的需求。

所以我觉得还是给关卡加上开放时间的逻辑。。

衰减系数太大就变成时间排序了,衰减系数太小解决不了活动关卡关闭后对应作业降序的需求。

所以我觉得还是给关卡加上开放时间的逻辑。。

开放时间那得改很多了(

而且不同服务器还不一样

不过就算增加开放时间逻辑,一定的衰减还是要的

热度 = Init + C
C = 赞 * 系数1 + 踩 * 系数2 + 查看数 * 系数3

计划新增按照已发布时间的长度来为热度增加衰减或激励的函数。

热度 = Init + C * M
  1. 在发布后的一段时间内(例如,3 天),给予热度计算上的激励,即 M > 1
  2. 激励过后的一段时间内(例如,第 4 天至第 10 天),为稳定期,M = 1
  3. 稳定期之后(例如第 10 天之后),进入衰减期,0 < M < 1

设定一个对数函数,按照关卡类型自定义其底数 B

T = 已发布时间(最小为 1 )

激励期(U 为激励天数) $M = -log_B (T/U) + 1$
稳定期 $M = 1$
衰减期 $M = 1/log_BT$

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);
}

感觉激励期的函数不太对劲

当T极小时,M~=infinity

感觉激励期的函数不太对劲

当T极小时,M~=infinity

不会,T 最小为 1,U 不会取很大,除非 B 很大很大,才会去到 INF

然后为了避免真的得到个巨大的值,代码里有写上下限(

Math.Clamp(-Math.Log((span == 0 ? 1 : span) / (double)positiveEnd, logBase) + 1, 1.1, 10);