3

我有一个看起来像这样的函数:大约是 10 并且所有f(x) = min(f_1(x_1), ..., f_n(x_n))都是正单调的、平滑的,并且它们的值几乎总是(对于所有的)相差小于 10 倍。因此,它们似乎非常适合分析。 什么是最好的(快速?)方法来最大化它有这样的约束: -都是整数并且小于〜100 - 所有的产品应该靠近指定的值(假设,不超过它的10%)nf_ix_if_i

x_i
x_i

任何语言的算法描述都值得赞赏,但如果是 Python,那么它会好十倍:)

PS:早些时候我使用过遗传算法,并首先将它们应用于这项任务。然而,它似乎不是最好的选择:GA 很慢,我也想不出有效的交叉操作来解决这个问题。

4

1 回答 1

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) 并连接并取最小值,它会快得多,但你仍然需要一种方法来传达产生最小值的函数的索引给来电者。我会推荐 Haskell 作为一种很好的语言来编写它,因为它python 快得多,并且在某些情况下,您可以毫不费力地获得出色的并发支持。

于 2012-08-11T22:38:10.213 回答