Javascript 使用~25个物品池中的6件物品计算可能造成的最高伤害

Javascript 使用~25个物品池中的6件物品计算可能造成的最高伤害,javascript,math,binomial-coefficients,Javascript,Math,Binomial Coefficients,我正在用javascript编写一个应用程序,试图找出视频游戏中角色的项目构建。顶级物品大约有25件,一次可以携带6件。它们有非常不同的效果,这让我相信,虽然一个项目本身看起来不是很好,但当与其他项目结合时,它可以变得更强大。如果有兴趣,我可以详细说明 问题: 如何获得6项不同组合的列表?有多少种组合?只是25c6(~134k)吗?或者我需要删除重复项吗?(对不起,我数学课有一段时间没上了。) 您将如何在Javascript中实现类似的内容?是否已经有一个数学库可以做到这一点?(具体来说,遍历所

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

问题:

  • 如何获得6项不同组合的列表?有多少种组合?只是25c6(~134k)吗?或者我需要删除重复项吗?(对不起,我数学课有一段时间没上了。)

  • 您将如何在Javascript中实现类似的内容?是否已经有一个数学库可以做到这一点?(具体来说,遍历所有可能的项目组合。)

  • 蛮力计算所有可能组合的伤害并保存最上面的项目组合似乎是可能的吗?如果没有,是否有更好的算法来寻找强组合

  • 以下是我的代码,基于每个人的输入:

    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);
    });
    
    函数getAllCombinations(n,k,回调) { var iterate=函数(剩余,参数) { var len=args.length; for(var i=args[len-1];i 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);
        }
    }
    
    for(int i=0;i<25;i++){
    对于(int j=i;j<25;j++){//注意j=i而不是j=0
    //等
    foo(i,j,k,l,m,n);
    }
    }
    
    如果您需要通用值25和6的通用解决方案,那么编写具有类似效果的递归函数应该不难

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

    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);
        }
    }
    
    for(int i=0;i<25;i++){
    对于(int j=i;j<25;j++){//注意j=i而不是j=0
    //等
    foo(i,j,k,l,m,n);
    }
    }
    
    如果您需要通用值25和6的通用解决方案,那么编写具有类似效果的递归函数应该不难

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

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

  • 是的副本,例如和。
    如果您知道只有6个项,那么就可以使用6个嵌套for循环(尽管这显然不能很好地扩展)

  • 当然,这是有可能的——在一台典型的PC上,177k个组合只需一小段时间就可以迭代(因为您使用的是Javascript,所以可能要长一点,但不会超过一两秒钟)

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

  • 是的副本,例如和。
    如果您知道只有6个项,那么就可以使用6个嵌套for循环(尽管这显然不能很好地扩展)

  • 当然,这是有可能的——在一台典型的PC上,177k个组合只需一小段时间就可以迭代(因为您使用的是Javascript,所以可能要长一点,但不会超过一两秒钟)

  • 肖恩

    这听起来像是大英博物馆的工作。。。当然要加奶酪

    通过cheese,我的意思是,遍历特定节点(总体优先级)的“成本”(在您的例子中是“利润”)可能是该节点与该路径中的所有先驱者组合的函数。与传统的“迷宫”相比,遍历任何特定节点的计算成本都要高得多,在传统的“迷宫”中,每个节点都有固定的遍历成本(例如街道的长度)。。。但是,如果最大路径长度仅为六个节点,则应该能够始终快速达到最佳结果(即亚秒)

    为了避免重复,不要将node-A添加到已经包含node-A的路径中

    我看不出有什么理由不应该在javascript中实现这一点,但我认为您必须实现自己的优先级队列,而这本身就相当棘手。。。好消息是它是一个已发布的数据结构,所以我会先从维基百科开始了解它,然后谷歌很难找到一个“合适的”javascript实现。。。或者如果失败了,我只移植Java的实现

    这是一个具有挑战性的小问题。我很想看看你的想法,以及其他人的建议。让我了解最新情况,willya

    还有另外一个建议。。。大多数情况下,游戏最好不要做出最佳决策;因为你的对手“纯人类”完全无法在一秒之内计算出“25次方中的6次方”的良好组合(更不用说最佳组合了)