约束满足:选择具有某些特征的实数

时间:2010-09-08 19:06:07

标签: algorithm statistics constraint-programming constraint-satisfaction

我有一组n个实数。我也有一套功能,

f_1, f_2, ..., f_m.

这些函数中的每一个都以数字列表作为参数。我也有一组m范围,

[l_1, u_1], [l_2, u_2], ..., [l_m, u_m].

我想重复选择k个元素的子集{r_1,r_2,...,r_k},以便

l_i <= f_i({r_1, r_2, ..., r_k}) <= u_i for 1 <= i <= m.

请注意,功能很流畅。更改{r_1,r_2,...,r_k}中的一个元素不会更改f_i({r_1,r_2,...,r_k})。平均值和方差是常用的两个f_i。

这些是我需要满足的m个约束。

此外,我想这样做,以便我选择的子集集均匀地分布在满足这些m个约束的大小为k的所有子集的集合上。不仅如此,我想以有效的方式做到这一点。它运行的速度取决于所有可能解决方案空间内解决方案的密度(如果这是0.0,则算法可以永久运行)。 (假设f_i(对于任何i)可以在恒定的时间内计算。)

请注意,n足够大,我不能暴力破解问题。也就是说,我不能只遍历所有k元素子集并找出哪些满足m个约束。

有办法做到这一点吗?

像这样的CSP通常使用哪种技术?有人可以指向我那些谈论这类问题的好书或文章的方向(不仅仅是CSP,而是涉及连续的CSP,而不是离散值)?

4 个答案:

答案 0 :(得分:1)

考虑到你所描述的问题,你可以统一从每个范围r_i中挑选并扔掉任何不符合标准的m维点。它将是均匀分布的,因为原始是均匀分布的,并且子集的集合是原始的二进制掩码。

在不了解f的形状的情况下,你无法保证时间是否为多项式(或者甚至不知道如何击中满足约束的点)。毕竟,如果f_1 = (x^2 + y^2 - 1)f_2 = (1 - x^2 - y^2)以及约束为f_1 < 0f_2 < 0,则根本无法满足此要求(并且无法访问函数的分析形式) ,你永远不可能确定。)

答案 1 :(得分:1)

假设您正在编写自己的应用程序并使用现有库来执行此操作,可以选择多种语言,例如Python-constraintCreamChoco用于Java,或CSP for C ++。你描述问题的方式听起来像是在寻找一个通用的CSP求解器。您的函数的任何属性是否有助于降低复杂性,例如单调?

答案 2 :(得分:0)

根据你留言中的信息,我不确定它是否可以完成......

考虑:

  • numbers = {1 .... 100}
  • m = 1(保持简单)
  • F1 =平均值
  • L1 = 10
  • U1 = 50

现在,你可以提出多少{1 ... 100}的子集,产生10&amp; 10之间的平均值。 50?

答案 3 :(得分:0)

这看起来像是一个非常难的问题。对于线性函数的最简单情况,您可以看一下线性编程。