Java中的集合组合算法

Java中的集合组合算法,java,algorithm,combinatorics,Java,Algorithm,Combinatorics,我有一个属性如下的数据集: Marital_status = {M,S,W,D} IsBlind = {Y,N} IsDisabled = {Y,N} IsVetaran = {Y,N} 等等,大约有200个这样的变量 我需要一个算法来生成属性的组合,每次使用一个值 换句话说,我的第一个组合是: Marital_status = M, IsBlind = Y, IsDisabled = Y, IsVeteran = Y Marital_status = M, IsBlind = Y, IsD

我有一个属性如下的数据集:

Marital_status = {M,S,W,D}
IsBlind = {Y,N}
IsDisabled = {Y,N}
IsVetaran = {Y,N}
等等,大约有200个这样的变量

我需要一个算法来生成属性的组合,每次使用一个值

换句话说,我的第一个组合是:

Marital_status = M, IsBlind = Y, IsDisabled = Y, IsVeteran = Y
Marital_status = M, IsBlind = Y, IsDisabled = Y, IsVeteran = N
下一组将是:

Marital_status = M, IsBlind = Y, IsDisabled = Y, IsVeteran = Y
Marital_status = M, IsBlind = Y, IsDisabled = Y, IsVeteran = N
我尝试使用一个简单的组合生成器,将每个属性的每个值都视为属性本身。它不起作用,因为组合中包含了相互排斥的选择,并且可能的组合数量非常巨大(准确地说是13387341799607485718549063389939406700260683726864088366400)

你能推荐一个算法吗(最好是用Java编码的)


谢谢

另找一条路。如果您有200个变量,并且每个变量至少有2个选择,那么您将拥有>=2^200个组合。如果你每纳秒生成一个组合,则需要大约10^43年的时间来列举2^200个选择。

正如基思所指出的,如果没有排除的组合,组合的数量将不可能很大,这将使你的需求无法满足。但是,因为您已经说过您有相互排斥的选择,所以解决方案空间将更小

小多少?取决于有多少选择是相互排斥的。我建议在太努力之前先做一些数学题

假设有足够多的选择是排他性的,您仍然需要对其进行强制操作,但您不太可能找到现有的、有用的算法

这就引出了一个问题:你这样做的原因是什么——彻底的测试?听起来不错,但你可能会发现这是不可能的。我自己也遇到过这个问题,最后,你可能会被迫选择一些精心挑选的“边缘”案例,再加上一些准随机选择的其他案例

读了你上面的评论,你对“互斥”的定义似乎与我不同,我担心你可能有问题

因此,一个特定的患者既不是瞎子也不是瞎子。伟大的但当你提到相互排斥时,我(我怀疑在座的其他人)并没有理解这一点

通过这些,我指的是,例如,如果是盲人,就不能是非残疾的,或者诸如此类的


如果属性之间没有大量相互排斥的相互关系,从而限制了它们的组合,则您将无法完成详尽的测试。

正如其他人(以及您自己)所指出的,不可能对此进行详尽的测试

我建议您采用抽样方法,并进行测试。你有很强的理论背景,因此你将能够在互联网上找到自己的方式来发现和理解这一点


但让我举一个小例子。现在,我将忽略可能的参数“集群”(密切相关)

  • 创建一个数据样本,其中包含所有200个参数的所有可能值。这种穷举性确保不会忘记任何参数值

    它不必预先创建,值可以通过循环创建

  • 对于一个数据的每个样本,需要添加其他值。一个简单的方法是选择要测试每个样本的次数(假设N=100)。对于一个数据的每个样本,将随机生成其他值的N倍

如果使用所有200个参数有1000个可能的值,并且N=100,那么我们将进行100K测试


您可以通过多种方式详细阐述这一基本理念:

  • 如果您希望您的测试是可重复的,您可以只生成一次,存储它,然后在将来的所有测试中重用相同的集
  • 您可以控制您的分布,以便每个值都能被公平地选择多次
  • 在现实生活中,所有200个参数都不是没有连接的。许多参数实际上会与其他一些参数相关联,因为找到这些值的概率并不均匀。不像我以前那样只对一个参数进行初始穷举设置,
    我将在一组连接的参数上运行穷举集

您应该创建一个类,该类有一个列表,其中指向其自身的独占属性列表。然后变得容易。你能给出更多你想要的例子吗?我不明白你想要什么。如果您有200个属性,每个属性甚至只是一个简单的Y或N,那么您可以用2^200种不同的方式组合这些属性。这是超过1万亿个组合!这个问题暗示了某些组合是不可能的。然而,没有迹象表明这种互斥规则可能存在于何处。(如果这些排除将有效地将这种组合爆炸限制在更易于管理的范围内)从理论上讲,我正在逆向工程数据集的生成。我从文本中为州医疗保险/医疗补助资格申请创建了一个决策引擎。我首先将文本转换为PMML。现在我需要一个数据集来测试引擎和PMML编码。通常,人们会从一个训练集开始创建一个决策树,使用熵计算来确定最佳分区属性等。如果您熟悉C4.5、Qinlan算法等,您就会知道我在说什么。现在我正在尝试创建一个数据集,让引擎在其上运行,以实现100%的测试覆盖率。@mgv每个属性的值都是互斥的。是的,我正在考虑将数据集划分为10-20个块,并一次测试一个块。我无法想象这将是一个多么好的测试。请看我的评论上面关于我在做什么。我已经测试了一些边缘情况,但认为有可能有一种自动化的方式让电脑