Algorithm 约束满足:选择具有一定特征的实数
我有一组n个实数。我还有一套功能Algorithm 约束满足:选择具有一定特征的实数,algorithm,statistics,constraint-programming,constraint-satisfaction,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. l_i鉴于您所描述的问题,您可以从每个范围r_i中统一选择,并丢弃任何不符
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.
l_i鉴于您所描述的问题,您可以从每个范围r_i
中统一选择,并丢弃任何不符合标准的m维点。它将是均匀分布的,因为原始数据是均匀分布的,并且子集集是原始数据上的二进制掩码
如果不进一步了解f
的形状,就无法保证时间是否为多项式(甚至不知道如何找到满足约束的点)。毕竟,如果f_1=(x^2+y^2-1)
和f_2=(1-x^2-y^2)
并且约束条件是f_1<0
和f_2<0
,你根本无法满足这一点(如果没有函数的分析形式,你永远无法确定)假设你正在寻找编写自己的应用程序并使用现有的库来执行这一点,那么在许多语言中,如、或java、C++都有选择。您描述问题的方式听起来像是在寻找通用CSP解决方案。您的函数是否有一些属性可以帮助降低复杂性,例如单调性?根据您的消息中的信息,我不确定是否可以做到这一点
考虑:
- 数字={1…100}
- m=1(保持简单)
- F1=平均值
- L1=10
- U1=50
现在,你能想出多少个{1…100}的子集,它们的平均值在10到50之间?这看起来是一个非常困难的问题。对于线性函数的最简单情况,你可以看看线性规划。当你说“k元素的子集{r_1,r_2,…,r_k}”是r_1,r_2指的是范围或实数?对不起。我用同样的符号表示两件不同的事情。我更正了。n是你选择的集合中实数的数目。我很困惑-为什么不选择r_1。。。从你的n个数字中随机选取一组,测试它们是否满足你的约束条件,然后重复,直到找到一个满足你的约束条件为止?您允许运行时间随满意解决方案的密度而变化……盲目地测试组合是不够有效的。您必须使用函数平滑的事实来指导您的搜索(这就是您真正了解的函数)。正因为如此,我在尝试爬山,但我不知道这是否是最好的解决方案。有趣的是,我们三个人在问题发布后17分钟内回答了问题。它运行的速度取决于所有可能解空间内的解密度(如果这是0.0,那么算法可以永远运行).功能顺畅。改变{r_1,r_2,…,r_k}中的一个元素不会使f_i({r_1,r_2,…,r_k})改变太多。@Paul-数学平滑没有多大帮助。你知道一些关于一阶偏导数的知识,以及关于高阶导数大小的界限吗?这可能会有所帮助。平均值和方差是两种常用的f_i。我不知道一阶偏导数和高阶导数大小的界限是什么。我们还使用了一两个更复杂的统计函数。不幸的是,它们不是线性的。是的,我同意这很难!