基于时间的算法评分

5
我们希望创建一个评分算法,对于较短的时间给予更高的分数,对于较长的时间给予较低的分数。唯一需要注意的是时间范围非常广,可以从100毫秒到10分钟甚至更长时间,相应的分数范围为0到50分。感谢您的任何帮助。
4个回答

3
您可以在线性映射之前以某种方式转换延迟,使点更快地出现并且稍后变慢。一种选择是取到目前为止的时间的对数。另一个选项是函数f(x) = Ax/(A + x),它在x=0处快速增加但随着x的增加而逐渐减缓,直到接近A但从未达到。 (这个函数是增加的,您需要的是减少,但可以通过线性函数来解决——明显的例子是点= A - Ax/(A + x))

例如,如果您设置A=10,则

f(0) = 10 - 10*0/(10 + 0) = 10, 
f(1) = 10 - 10/11 = 9 1/11, 
f(2) = 10 - 20/12 = 8 1/3, 
f(100) = 10 - 1000/110 = 10/11 

等等。


请您能否提供一个例子? - jbassking
我已经将答案加一。 - mcdowella
您提供的链接已经失效。 - Pratik Singhal
@Pratik 很抱歉,我已经删除了那个参考。Demon被Vodaphone接管了,我最终放弃了他们的服务,我的网页也随之消失了。事实上,我发誓再也不会使用他们了,因为我付了钱,但他们并没有消除法律威胁。我本来可能会追究此事,但当时我有其他事情要处理——我父亲正在去世。 - mcdowella
@mcdowella 很遗憾听到你父亲的消息! - Pratik Singhal
1
@Pratik他将近94岁了,并说70岁之后的每一年都是额外赠送的,所以我想我不应该抱怨,但由于有许多新事物需要担心,这段时间并不容易。感谢你的同情。 - mcdowella

3
您可以使用以下公式将其简单地变成线性映射: points = 50 * 100/time_in_ms
这将给您:
- time_in_ms=100ms => 50 points - ... - time_in_ms=10min => 0.0083 points - ... - time_in_ms=+∞ => 0 points
如果时间范围和点数发生变化,您可以轻松调整上述公式。

有没有办法延长点数的时间,使它们不会那么快地减少?在大约5秒钟左右,我们的分数就降到了小于1分。 - jbassking
3
您可以取对数或平方根来调整“100”。例如,如果使用“points = 50 * 10 / sqrt(time)”,您仍然会在100毫秒时得到50分,而5秒钟将会给出大约7分。直到250秒,也就是4分钟多一点才会得到1分。 - Geobits

0

我认为你有两个选择:

  1. 如果您真的想要能够为任何时间长度分配积分,请选择一个公式,将积分数目除以时间量,例如:

    points = [max_number_of_points]/[time]
    

    在这里,time 应该是您最小的测量单位,以便它永远不会小于零。如果您不希望积分数量以那种速度减少,请将 time 除以或乘以某个常数,直到积分分布看起来符合您的要求。

  2. 认为实际上,存在一个时间限制,超过该时间的任何事物都应该得到零分。例如,当时间为一亿年与一千亿年时,我怀疑您是否关心积分差异。因此,以这种方式人为地选择一个最大时间,在有限范围内将所有更大的时间分配为零分,然后继续使用您的评分算法。


0

如果记录集太大,则所有类似的操作都必须有一些延迟。

假设您正在不断地从流中获取每个用户的时间,您要在一段时间内跟踪max值,并且还有另一个系统可以动态地给分。

为现有的以毫秒为单位的时间记录集(可能存储在链接列表中或可能是动态增长的二维数组)在决定的重复间隔后触发得分计算。

得分计算逻辑:

我们清楚地看到它是时间花费的反比例关系。因此,您知道所有时间值等于上面计算的平均值的记录在1-50的尺度上为25。

因此,对于给定的记录,假设最大值为500 ms,记录为100 ms,则答案将是 50 * (500 - 100 ) / 500


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接