简单流行算法(使用提交日期和投票数)

时间:2010-08-13 23:03:45

标签: php

我运行了一个类似digg的网站,当它达到一定数量的投票时,将内容推广到首页。现在它没有考虑提交日期。

我想使用一种简单的算法,只使用投票数和提交的日期来确定是否应该提升某些内容。我不希望算法做任何比这更复杂的事情(例如迭代所有投票日期)。

修改

公式不应该是这样的:

30 / (days between post date and now) * (vote count) = weighted vote

以下是一些对我的网站来说似乎合理的情况,这表明该算法需要对较旧的项目更宽松(因为较旧的项目在网站上较不易被发现)

<30> 30/30 * 30 = 30(30天,以30票晋升)
30/5 * 15 = 90(5天,以15票晋升)
30/1 * 10 = 300(1天,以10票晋升)

如何修改公式,以便上述3给出接近促销所需的相同最小加权投票?

2 个答案:

答案 0 :(得分:0)

您可以使用当前日期和提交日期之间的差异来对投票进行加权。

(阈值 - (发布日期和现在之间的天数))/阈值*(投票计数)=加权投票

代码

$weightedVote = ($threshold - $daysOld) / $threshold * $voteCount;

这样可以消除超过阈值的帖子。例如,10天的职位将其票数乘以20/30。

答案 1 :(得分:0)

当条件基于投票时,是否有理由为内容分配任意数字?我的意思是 - 看起来你最好不要权衡用户和他们的投票,而不是根据日期给出一些内容或多或少的投票。 我为一家拥有10,000美元竞赛的公司写了一些非常卑鄙的投票软件,我们的算法考虑了用户及其行为历史,最终过滤掉了大量垃圾邮件投票。

这听起来很复杂,但事实并非如此。

至于你的平衡代码 - 您希望以10票的价格提升1天的内容,其中30天的内容需要30票? 或者你的意思是1天内容有10票可以提升,而30天的项目可以推广6票,因为它更老,更不可能被看到,所以投票容忍度会降低吗?

function daysDifference($endDate, $beginDate)
{
   $date_parts1=explode("-", $beginDate);
   $date_parts2=explode("-", $endDate);
   $start_date=gregoriantojd($date_parts1[1], $date_parts1[2], $date_parts1[0]);
   $end_date=gregoriantojd($date_parts2[1], $date_parts2[2], $date_parts2[0]);
   return $end_date - $start_date;
}
$diff = 30 - daysDifference(date("Y-m-d"), $postdate);
if($diff > 0)
    $weight = 30 / $diff + $votes;
else
    $weight = $votes;

因此,假设daysDifference函数返回26并且最初有4票。这将读取30 /(30 - 26 = 4)= 7.4 + 4总共11.4票。 对于一个10天投票的一天的项目,它将读取30 /(30 - 1 = 29)= 1.03 + 10.总共11.03。 这个样本大致相同,但其他人会有所不同。 if表示30天内的任何内容都没有被考虑,他们的投票等于实际值。

我可能只是误解了你的需求。