我有一个数组P = [1, 5, 3, 6, 4, ...]
,大小为N
,平均值为A
。
我想找到最有效的方法来最大化以下3D功能:
f(x, y) = 1 / ( (1+e^(-6(x-2))) * (1+e^(-6(y-2))) * (1+e^(-0.1x-0.3y+1.5)) )
其中x = c(S) = Count(S)
和y = m(S) = Min(S[0]/A, S[1]/A, ..., S[n]/A)
,而S
是P
的子集。该子集在P
中不必是连续的。
我觉得可以将其简化为子集和问题的某些变体,但是除了排序P
之外,我真的不知道从哪里开始。目的是在PHP中实现该算法,但实际上任何伪代码都会有很大帮助。
答案 0 :(得分:2)
如果您正在寻找聪明的数学简化方法,请与他人达成共识,这是数学交换的地方。否则,从Math_Combinatorics库开始。然后,您应该可以使用以下方法遍历S的所有唯一组合:
require_once 'Math/Combinatorics.php';
$combos = new Math_Combinatorics;
$P = [1, 5, 3, 6, 4, ...];
for ($n = 1; $n <= count($P); $n++) {
foreach ($combos->combinations($P, $n) as $S) {
... your calculations on S go here ...
}
}