我有一个看起来像这样的函数:f(x) = min(f_1(x_1), ..., f_n(x_n))
其中n
大约为10,所有f_i
都是正单调,平滑,它们的值几乎总是(对于所有{{} 1}}对于所有x_i
)的差异小于10倍。所以他们似乎很适合分析
什么是最好的(快速?)方式来最大化它有这样的约束:
- 所有f_i
都是整数且小于~100
- 所有x_i
的产品应靠近指定值(假设,不超过10%)
任何语言的算法描述都很受欢迎,但如果它是在Python中,那么它会好十倍:)
P.S。:之前我曾使用遗传算法,并首先将它们应用于此任务。然而,它似乎并不是最好的选择:GA很慢,我也想不出有效的交叉操作来解决这个问题。
答案 0 :(得分:1)
我没有立即看到一个更好的解决方案,而不是简单地随机选择一个起始点,用每个输入x_i评估每个函数f_i,确定最小输入,然后递增给出最低结果的函数的输入。它并不优雅,并不复杂,但它是一种很好的基线蛮力方法。
int (**f_is)(int n);
//...
int xs[10];
//...
while(true) {
int i = 0;
int cmin = f_is[0](i);
int cminIndex = 0;
for(i = 1; i < 10; ++i) {
int cfunc = (f_is[i])(i);
if(cmin < cfunc) {
cmin = cfunc;
cminIndex = i;
}
}
++xs[cminIndex];
}
编辑:还有一些事情:如果你并行计算f_i(n_i)和连接并取min,它会快得多,但你仍然需要一种方法来传达产生的函数的索引最小值返回给调用者。我建议使用Haskell作为一种很好的语言来编写它,因为它的方式方式比python更快,在某些情况下,你可以毫不费力地获得很好的并发支持。