[英]Set Combinatorics Algorithm in Java
我有一个包含如下属性的数据集:
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
我尝试使用一个简单的组合生成器,将每个属性的每个值视为属性本身。 它不起作用,因为组合中包含互斥的选择,可能的组合数量非常巨大(准确地说是133873417996074857185490633899939406700260683726864088366400)
你能建议一个算法(最好用Java编码)吗?
谢谢!!
找另一种方式。 如果您有200个变量,并且每个变量至少有2个选项,那么您将拥有> = 2 ^ 200个组合。 如果您每纳秒生成一个组合,则需要大约10 ^ 43年来枚举2 ^ 200个选项。
正如其他人所指出的那样(也是你自己),不可能对此进行详尽的测试。
我建议你采取抽样方法 ,然后进行测试。 你有很强的理论背景,所以你将能够在互联网上找到并理解这一点。
但是,让我举一个小例子。 现在,我将忽略可能的“集群”参数(与之密切相关)。
创建一个数据样本 ,包含所有200个参数的所有可能值。 这种穷举确保了不会忘记任何参数值。
它不必预先创建,值可以通过循环创建。
对于一个数据的每个样本,您需要添加其他值。 一种简单的方法是选择您想要测试每个样本的次数(比如说N = 100)。 对于一个数据的每个样本,您将随机生成其他值的N倍 。
如果使用所有200个参数有1000个可能的值,并且N = 100,那将给我们100K测试。
您可以通过多种方式详细阐述这一基本概念:
正如Keith指出的那样,如果没有排除的组合,组合的数量将是不可能的,这将使您的需求无法实现。 但是,由于您已经说过您有相互排斥的选择,因此解决方案空间会更小。
多小了? 取决于有多少选择互相排斥。 我建议在做之前先做一些数学计算。
假设有足够的选择是独占的,你仍然必须基本上强制它,但你不太可能找到一个现有的,有用的算法。
这让我想到了这样一个问题:你这样做的原因是什么 - 详尽的测试? 听起来不错,但你可能会发现那是不可能的。 我自己也遇到过这个问题,最后,你可能会被迫选择精心挑选的“边缘”案例,加上一些准随机选择的其他案例。
阅读上面的评论后,您似乎以不同于我的方式定义“互斥”,我担心您可能会遇到问题。
因此,给定的患者既不是盲人也不是盲人。 大。 但是当你提到相互排斥时,那不是我(我怀疑其他人在这里)的理解。
通过那些,我说的是,例如,如果失明,不能非残疾,或类似的东西。
如果您的属性之间没有大量相互排斥的相互关系限制其组合,您将无法完成详尽的测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.