使用~25的池中的6个项目计算可实现的最高可能损坏

时间:2011-04-26 22:43:00

标签: javascript math binomial-coefficients

我正在用javascript编写一个应用程序,试图找出视频游戏中角色的项目构建。大约有25个顶级项目,您可以一次携带6个。它们具有非常不同的效果,这使我相信虽然一件物品本身看起来不是很好,但与其他物品结合时会变得更强大。如果有兴趣,我可以详细说明。

问题:

  1. 如何获得6个项目的所有不同组合的列表?有多少种组合?它只是25c6(~134k)?或者我是否需要删除重复项? (对不起,我已经离开了数学课一段时间。)

  2. 你会如何在Javascript中实现这样的东西?是否已有可以执行此操作的数学库? (具体来说,迭代所有可能的项目组合。)

  3. 蛮力似乎可以计算所有可能组合的伤害并保存顶级项目组合吗?如果没有,是否有更好的算法来找到强组合?

  4. 这是我的代码,基于每个人的输入:

    function getAllCombinations(n, k, callback)
    {
        var iterate = function(remaining, args)
        {   
            var len = args.length;
            for (var i = args[len - 1]; i < n; i++)
            {
                args.splice(len);
                args[len - 1] = i;
                if (remaining)
                {
                    args.push(i);
                    iterate(remaining - 1, args);
                }
                else
                {
                    callback.apply(null, args);         
                }
            }        
        }
        iterate(k - 1, [0]);
    }
    
    var itemsCount = 25;
    var itemSlots = 6;
    getAllCombinations(itemsCount, itemSlots, function(a, b, c, d, e, f)
    {   
        // calculateDamage(hero, arguments);
    });
    

3 个答案:

答案 0 :(得分:2)

1)是的,它只是25选择6

2)好吧,如果你只需要做一次,你可以用嵌套循环来做。关键是让每个内部循环不是从零开始,而是从外部计数器开始。

for (int i = 0; i < 25; i++) {
    for (int j = i; j < 25; j++) { // note j=i not j=0
        // etc
        foo(i,j,k,l,m,n);
    }
}

如果你需要25和6的泛型值的通用解决方案,那么编写具有类似效果的递归函数应该不难。

3)我认为你唯一的选择就是蛮力。可能需要几分钟,但应该完成。我认为它在Chrome中速度最快,在IE中无法使用。 “本地搜索技术”等其他选项似乎不适用于您,因为您的空间不是特别连续。

答案 1 :(得分:1)

  1. 是的,它是25C6(实际上是~177k)

  2. 是重复的,例如。 List all possible combinations of k integers between 1...n (n choose k)How can I iterate throught every possible combination of n playing cards
    如果你知道只有6个项目,你可能只有6个嵌套的for循环(虽然这显然不能很好地扩展)。

  3. 当然有可能 - 177k组合只需要一小段时间就可以在典型的PC上进行迭代(可能需要更长的时间,因为你使用的是Javascript,但不超过一两秒钟)

答案 2 :(得分:1)

肖恩,

这听起来像是大英博物馆算法的工作......当然还有奶酪。

通过奶酪,我的意思是遍历特定节点(总体优先级)的“成本”(或“你的利润”)可以是这个节点的一个功能,并结合它的所有前传者。 。遍历任何特定节点将比传统的“迷宫”计算成本更高,其中每个节点具有固定的遍历成本(例如街道的长度)......但是最大路径长度仅为6您应该能够快速地(即亚秒级)获得最佳结果。

为了避免加倍,只是不要将node-A添加到已经包含node-A的路径。

我认为没有理由不在javascript中实现这一点,但我想你必须实现自己的优先级队列,而且这本身就很棘手...好消息是它是一个已经发布了数据结构,所以我从维基百科开始了解它,然后谷歌很难看到我是否能找到一个“体面的”javascript实现......或者说我只是简单地移植Java的实现。< / p>

这是一个具有挑战性的小问题。我有兴趣看看你提出了什么,以及其他人在整个过程中提出的建议。让我更新willya?

还有另外一个建议......最常见的是游戏最好不做出最佳决策;因为你的对手一个“纯粹的人”完全无法在一秒钟内计算一个好的(更不用说最佳)“6个来自25个力量”的组合,并且他们偶然得到最佳组合的概率是25个中的1个* 24 * 23 * 22 * 21 * 20 = 127,512,000 ...特别是如果这些“权力”以“秘密”的方式互相利用......即使秘密被公布,也需要“程序员心灵”来做数学,足以达到“高于平均水平”的结果。你知道我的意思吗?

干杯。基思。