我有一组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,而不是离散值)?
答案 0 :(得分:1)
考虑到你所描述的问题,你可以统一从每个范围r_i
中挑选并扔掉任何不符合标准的m维点。它将是均匀分布的,因为原始是均匀分布的,并且子集的集合是原始的二进制掩码。
在不了解f
的形状的情况下,你无法保证时间是否为多项式(或者甚至不知道如何击中满足约束的点)。毕竟,如果f_1 = (x^2 + y^2 - 1)
和f_2 = (1 - x^2 - y^2)
以及约束为f_1 < 0
和f_2 < 0
,则根本无法满足此要求(并且无法访问函数的分析形式) ,你永远不可能确定。)
答案 1 :(得分:1)
假设您正在编写自己的应用程序并使用现有库来执行此操作,可以选择多种语言,例如Python-constraint或Cream或Choco用于Java,或CSP for C ++。你描述问题的方式听起来像是在寻找一个通用的CSP求解器。您的函数的任何属性是否有助于降低复杂性,例如单调?
答案 2 :(得分:0)
根据你留言中的信息,我不确定它是否可以完成......
考虑:
现在,你可以提出多少{1 ... 100}的子集,产生10&amp; 10之间的平均值。 50?
答案 3 :(得分:0)
这看起来像是一个非常难的问题。对于线性函数的最简单情况,您可以看一下线性编程。