2013-02-23 32 views
4

作为我当前项目的一部分,我需要为以下方面找到一个漂亮的Excel解决方案:在线游戏中人们获得经验(类似于SO代表)并转移到一旦获得足够的经验值就可以进入下一个级别(同样,这与SO权限非常相似)。当然,这需要每个人都有不同的时间:有些人在第一周获得足够的经验,其他人需要5周才能通过这个级别。统计如下:基于当前统计数据的分布预测的准确实时更新解决方案

Week from join: Week 1 Week 2 Week 3 Week 4 Week 5 
Level up:  5%  15%  40%  30%  10% 

也就是说,如果这一周期间,我们有一些人加入了游戏,5周后他们都将传递到一个新的水平(有些人会放弃并离开,但对于简单我不会在条件列表中包含该因素)。

至于每场比赛,当前球员的数量很重要。为了保持游戏的流行和激动人心,每个关卡都应该有确定的玩家数量最小。显然,这个价值在不断变化:新人来了,而另一些人则进入下一个层次。然而 - 这就是行动开始的地方! - 这个当前球员的最小值不是恒定的,并且可能会依赖于许多因素谨慎。为了简单起见,这意味着对于将来的10-15周,每周应该实现一组预期的最小数量的球员(这是基于收集的统计数据,但对于给定的任务,这是已知的组)。

到目前为止好,画面看起来是这样的:

Sample 1

每星期而在最左边的列有人号加入了游戏,每星期下粗体数字的行本周通过的人数到下一级

有了新人的数量,计算每周总的升级水平是微不足道的。相反并非如此简单(至少对我来说) - 这就是问题:如何预测每周所需的新人数量(最左边一列) - 获得所需数量的人在接下来的几周内转到下一个级别(底部的粗体)?

到目前为止,我仍然找不到合适的和准确的解决方案。我尝试了所有可能的选择 - 从复杂的&数组公式到Solver插件,但没有运气:我总是比方程式有更多的未知数。但是,我很确定这不是一个不可能完成的任务:对于某些解决方案,Solver可以提供相当接近所需值的数字,但不适用于每组所需的值。

一些假设和(也许)重要的条件:

  1. 虽然不应该是一个问题,但实际每周分布%%%数更新通过DB查询和进一步的Excel处理需求的基础上
  2. 到目前为止,从DB获得的实际新手值当然被认为是已知值等式。显然它们不能改变,例如如果一周内参加游戏的人数实际上是less than desired,那么应该会影响未来几周的计算预测来实现整体。
  3. 玩家总数实际上传递到下一级在某段时间应该保持不变如果我们希望在每年的冬季开始1月份,至少有100人加入这场比赛,这给我们整整8周,因此总共有800名玩家。然而,如果在一月份,我们实际上得到了80级新的球员,每星期 - 这意味着二月份辛勤工作)对于确定性“检查点” 分类汇总计算每10周。无论如何,任何低价值都必须在未来几周内得到补偿。
  4. 反过来也是如此:如果我们有更多的新人比预计的在给定的一周 - 我们可能会在下个星期吸引更少的球员来满足下一个小计的目标。
  5. 球员的流动是无限 - 图片样张给出只是为了清楚和更好地理解的目的。所需值可能会根据需要在未来一段时间内计算 - 预测模式是可重复的。如果这对于解决方案很重要 - 从目前的开始为10周。
  6. 纯配方解决方案更可取 - 甚至非常复杂。但是,VBA仍然是一个可以接受的选择。在任何情况下,计算值的准确实时/按需更新绝对好于简单的,但是半手动或近似解决方案。

至于我在这里的每一个问题 - 我不要求ready to play解决方案,但正确的指导或宝贵的意见将非常感激。我故意不把它发布到https://stats.stackexchange.com/--它更像是编程问题,因为理论显然很简单......或者可能太简单了,所以我没有看到相当明显的解决方案。

请随时通过的意见,要求任何额外的信息或解释:虽然我力求做到清晰和简单越好,有些方面是不是对我来说重要的可能是事实上的准确的解决方案是至关重要的。

样品文件(与上面的示例):https://www.dropbox.com/s/q3bnagyet86i34r/StatPrognosis01.xlsx

+1

有趣的挑战 - 今晚晚些时候将考虑它你也从截图分享源excel - 这将减少努力... Thx – 2013-02-23 18:18:03

+0

@PeterAlbert先生非常感谢,彼得!我添加了示例链接到问题。如果您需要更多信息 - 请不要犹豫,问。 – 2013-02-23 18:35:08

回答

1

无需VBA或复杂的数组公式 - 转换为公式一些简单的数学将是你所需要的:

主要的想法是,你可以通过“反转”计算来确定每周的数量。逻辑如下:(注:根据截屏单元格引用,即黄色的5%将是B2):

  • 如果一个星期的“加入者” 5%使它到一个新的水平和一周1(总体)应该有10个人做成,第一周有10/5%= 200人需要加入。
    作为一个公式,这意味着:B5:=B12,A5:=B5/B2
  • 从那里,你可以计算出从第一周的加入者如何分配,你已经做的(即不改变5行的其余部分)
  • 在第二周,你想要35人成为下一个级别。从前一步你知道从第一周的加入者你有30人达到这个水平。因此,5人必须来自第2周的加入者。因为他们再次使该波的5%,总波必须是5/5%= 100
    在公式中:C6:=C12-C5,A6:=C6/B2
  • ...

现在不用为每周创建一个单独的公式,您可以用一些INDEX函数来概括这个公式。对于这一点,我通过周数延长的例如同时作为标题列&行:

enter image description here

要计算每个“每周木匠波”的数量,即范围C5:O17,使用以下公式:

 
=IF($A5>C$4+N("Nobody from this wave joined yet:"),0, 
    IF(C$4=$A5+N("The first week for the new wave:"), 
     IF($A5=1+N("Very first wave must be expected number in this week:"),C18, 
     N("All other weeks, this must be expected number minus 
      'levelups' from former weeks:")+(C$18-SUM(C4:C$5)) 
    ), 
    N("For any later week after the joining, apply weekly uplevel ratio 
     to total number of joiners:")+INDEX($C$2:$O$2,C$4-$A5+1)*$B5) 
) 

和期望数每周加入者,即范围B5:B17:

 
=INDEX($C5:$O5,$A5)/$C$2 

这里是第e更新了solution file

+0

非常感谢Peter!这节省了我几小时和几小时的生命。以我所有的尊重,赞美和接受。做得好! – 2013-03-05 20:43:41

+0

不幸的是,如果解决方案不完全符合初始分布模式,该解决方案将返回负值。对不起,几天前只有机会深入地回顾它。 – 2013-05-28 18:51:35