我正在用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);
});
答案 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)
是的,它是25C6(实际上是~177k)
是重复的,例如。 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循环(虽然这显然不能很好地扩展)。
当然有可能 - 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 ...特别是如果这些“权力”以“秘密”的方式互相利用......即使秘密被公布,也需要“程序员心灵”来做数学,足以达到“高于平均水平”的结果。你知道我的意思吗?
干杯。基思。