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个参数都不是没有连接的。许多参数实际上会与其他一些参数相关联,因为找到这些值的概率并不均匀。不像我以前那样只对一个参数进行初始穷举设置,
我将在一组连接的参数上运行穷举集