Python &引用;热的;算法总是返回0

Python &引用;热的;算法总是返回0,python,django,algorithm,sorting,Python,Django,Algorithm,Sorting,我正在尝试复制以对我的帖子进行排序。以下是我的功能: def hot(self): s = self.upvotes baseScore = log(max(s, 1)) now = datetime.now() timeDiff = (now - self.post.date).days if (timeDiff > 1): x = timeDiff - 1 baseScore = baseScore * exp(

我正在尝试复制以对我的帖子进行排序。以下是我的功能:

def hot(self):
    s = self.upvotes
    baseScore = log(max(s, 1))
    now = datetime.now()

    timeDiff = (now - self.post.date).days
    if (timeDiff > 1):
        x = timeDiff - 1
        baseScore = baseScore * exp(-8 * x * x)
    print('Final:', baseScore) #always prints 0
    return baseScore
基本上,
exp(-8*x*x)
总是将数字设为0。所以我很好奇我应该如何使这个算法工作


有什么想法吗?

问题就在那一行

baseScore = baseScore * exp(-8 * x * x)
由于
x
仅以天为单位获取值,因此它将始终是一个整数。现在如果
x==0
,那么你会得到
exp(-8*x*x)==1
,但是只要
x==1
,它就会非常接近
0
。一句话:你的功能不是连续的

你想要的是逐渐降低帖子的热度。这可以通过让
x
0
1
之间的值来实现。一种方法是以分钟为单位计算时间增量,这样就可以留出小数天

timeDiff = (now - self.post.date).minutes / 1440

然后帖子会热几个小时。

简言之:你创造了一场极端的冰暴,帖子在48小时后就会冻死

你的算法没有什么“错误”,但是你让分数“冷却”得太快了

假设一篇文章已经发布两天了(然后触发
if
子句)。在这种情况下,
x=1
,在这种情况下,
exp(..)
将导致:

>>> exp(-8)
0.00033546262790251185
对<代码>0.00033…,或
0.03%
。这意味着如果你的帖子获得了10000张选票,那么基本分数是
9.21
,在这个乘法之后,只有:

>>> log(10000) * exp(-8)
0.003089724985059729
是的,冷却方案应该确保最终所有东西都冷却下来,但不是通过将柱子放入冰暴中

例如,您可以删除
8*
因子。这意味着第二天,我们将分数乘以~
0.37或36.79%。您可以尝试一下因子或冷却方案的其他部分,从而让帖子很好地冷却下来

另一个方面是时间被描述得很清楚:你计算天数。但这意味着,只要第二天还没有完全结束,值就是1。但从第二天结束的那一刻起,帖子的“温度”就大幅下降。您可以使用秒数除以86'400:

timeDiff = (now - self.post.date).total_seconds() / 86400  # continuum

exp(-very\u big\u number)
总是(非常接近)
0
。正如@WillemVanOnsem所说。。。你的帖子不是很热门…这一天可能有点太过激进:最好的情况是1(0天),然后你跳到3.10-4。也许用小时来更进步?在cas中,帖子已经发布两天了,这意味着你已经将其减少了0.03%。因此,如果您的
baseScore
为10k(由于您使用
log
,因此同样无法访问),则只剩下3个。三天内,百分比低于浮动所能表示的百分比,因此
0
。我想你“冷却”帖子的速度太快了。为了让你的算法正常工作,你需要改变你的指数函数,这样在给定的时间间隔内,衰减不会太大。你的相关问题很好地解释了如何做到这一点。调整
exp()
的参数,以便获得所需的粒度,因为它们使用的是
timeDiff=(now-track.upload)。toWeeks
而不是days