我运行一个像digg一样的网站,当它达到一定数量的选票时,它会将内容推广到头版。现在它没有考虑到提交的日期。
我想使用一个简单的算法,它只使用投票的数量和提交的日期来决定是否应该推广一些东西。我不希望算法做任何比这更复杂的事情(比如遍历所有的投票日期)。
编辑:
公式不应该是这样的:
30 / (days between post date and now) * (vote count) = weighted vote以下是对我的站点来说似乎是合理的一些场景,这表明该算法需要对旧项目更加宽松(因为旧项目在站点上不易被发现)
30 / 30 * 30 = 30 (30天,以30票晋升)
30 /5* 15 = 90 (5天,以15票晋升)
30 /1* 10 = 300 (1天,以10票晋升)
如何才能修改公式,使上述3给出接近同一分钟加权投票所需的晋升?
发布于 2010-08-13 23:11:10
您可以使用当前日期和提交日期之间的差异来衡量选票的权重。
(起点-(从发布日期到现在之间的天数)/threshold*(计票)=加权投票
用代码
$weightedVote = ($threshold - $daysOld) / $threshold * $voteCount;这将产生从考虑中取消超过门槛值的员额的效果。例如,10天前的一个员额的选票将乘以20/30。
发布于 2010-08-14 00:29:28
如果条件是基于投票的,那么是否有理由为内容分配任意的数字?我的意思是--你最好衡量一下用户和他们的投票结果,而不是根据日期或多或少地给出一份投票。我为一家公司写了一些非常吝啬的投票软件,它有1万美元以上的竞争,我们的算法考虑了用户和他们的行为历史,最终过滤掉了大量垃圾邮件投票。
这听起来很复杂,但并不是真的。
至于你的平衡码-你希望一天前的内容在10票时得到推广,而30天的项目需要30票?或者你的意思是一天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共计。这个样本大致相同,但其他样本会有所不同。如果是指任何超过30天的内容都没有被考虑,他们的选票等于实际价值。
不过,我可能误解了你的需要。
https://stackoverflow.com/questions/3481214
复制相似问题