在Java中设置组合算法

sri*_*lla 3 java algorithm combinatorics

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

Marital_status = {M,S,W,D}
IsBlind = {Y,N}
IsDisabled = {Y,N}
IsVetaran = {Y,N}
Run Code Online (Sandbox Code Playgroud)

大约有200个这样的变量.

我需要一个算法来生成属性的组合,一次只有一个值.

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

Marital_status = M, IsBlind = Y, IsDisabled = Y, IsVeteran = Y
Run Code Online (Sandbox Code Playgroud)

下一组将是:

Marital_status = M, IsBlind = Y, IsDisabled = Y, IsVeteran = N
Run Code Online (Sandbox Code Playgroud)

我尝试使用一个简单的组合生成器,将每个属性的每个值视为属性本身.它不起作用,因为组合中包含互斥的选择,可能的组合数量非常巨大(准确地说是133873417996074857185490633899939406700260683726864088366400)

你能建议一个算法(最好用Java编码)吗?

谢谢!!

Kei*_*all 5

找另一种方式.如果您有200个变量,并且每个变量至少有2个选项,那么您将拥有> = 2 ^ 200个组合.如果您每纳秒生成一个组合,则需要大约10 ^ 43年来枚举2 ^ 200个选项.


KLE*_*KLE 5

正如其他人所指出的那样(也是你自己),不可能对此进行详尽的测试.

我建议你采取抽样方法,然后进行测试.你有很强的理论背景,所以你将能够在互联网上找到并理解这一点.


但是,让我举一个小例子.现在,我将忽略可能的"集群"参数(与之密切相关).

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

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

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

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


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

  • 如果您希望测试可重复,则只能生成一次,存储它,然后在将来的所有测试中重复使用相同的集合.
  • 您可以控制您的分配,以便每次选择相应的值.
  • 在现实生活中,所有200个参数都不会没有连接.许多参数实际上将与其他参数相关联,因为一起找到值的概率不均匀.而不是让作为我以前一样只有一个参数的初始一套详尽的,
    我会运行连接参数的群集上一套详尽.