寻找最小的解集(如果存在)(n个乘数)

时间:2019-07-05 21:56:15

标签: python set constraints constraint-programming

注意:这是this problem的n乘数变体。

给出一个集A,该集由0.0到1.0之间的十进制值组成,找到该集B,这样b中的每个B都是一个由十进制组成的集合值介于0.0到1.0之间,因此对于a中的每个A,都有一组唯一的值,其中aB中元素子集的乘积。

例如,给定

$ A = [0.125, 0.25, 0.5, 0.75, 0.9]

B的一种可能(但可能不是最小)的解决方案是

$ B = solve(A)
$ print(B)
[[0.25, 0.5, 0.75, 0.9], [etc.], [etc.]]

这满足了最初的问题,因为A[0] == B[0] * B[1]A[1] == B[1]等使我们可以重新创建原始集合AB的长度小于A的长度,但我猜答案也较小。但是,假设不能将B减少到4个以上的值,那么对该问题的正确解决方案将是一组解决方案。

我假设B的解决方案空间很大,如果不是无限的话。如果存在解决方案,将如何找到最小集B


注意:

  • 这似乎很适合约束满足问题,但是我一直无法弄清楚该如何格式化。
  • 我们不受A中的值的限制。B可以由任何一组值组成,无论它们是否存在于A中。
  • 没有限制,只能使用B中的两个值。如果您有A = [0.125, 0.25, 0.5, 1.0],则B的有效答案可能是[0.5, 1.0]。含义A == [ B[0]*B[0]*B[0], B[0]*B[0], B[0]*B[1], B[1]*B[1] ]
  • 由于浮点数学通常存在问题,因此有理数可能是个好主意。
  • B中解决方案的下限为|B| ≥ log2(|A| + 1),因为我们最多可以拥有2^|B| - 1的{​​{1}}个非空子集。 (为此,请记入גלעד ברקן。)

0 个答案:

没有答案