我正在尝试最小化存储在数组
中的约80个变量的函数f
。该函数由两个嵌套循环定义:外部循环按 i
索引 array
,而内部循环则执行 array[i]
次,将计算结果添加到运行总计中。计算取决于一些条件x
和y
,并且每次执行时都会略有变化,这就是我需要循环结构的原因。以下是 Python 中的一个最小工作示例:
def f[array]:
total = 0
x = 0
y = 0
for i in range(len(array)):
for j in range(array[i]):
result = 2*x + y
total = total + result
x = x+1
x = 0
y = y+1
return total
例如,print f([2,1])
返回 3,因为 [(2*0) + 0] + [(2*1) + 0] + [(2 *0) + 1] = 0+2+1 = 3。
我想找到 array
中使 f
的值最小的条目。然而,当我告诉(例如)Mathematica 最小化 f([x1, x2, ..., x80])
并吐出最小化 array
时,程序会提示,因为它无法执行定义 f
的循环不确定的次数。
鉴于此,我的问题如下:
How do I minimize a multivariate function whose parameters describe the number of times a given loop is to be iterated?
我最初尝试在 Mathematica 中实现这一点,但发现我无法通过上面的过程定义 f
。我能做的最好的事情就是告诉 Mathematica 执行上面的循环,然后在计算 total
后定义 f[array_] := total
。当我运行代码时,Mathematica 自然地声称它无法计算 f
,甚至在执行我的命令 NMinimize[{f[array] array ϵ Integers}, array] 之前就抛出错误
。事实上,Mathematica 在 NMinimize
中调用 f
之前尝试计算它,这表明我不太了解函数在 Mathematica 中的工作原理。任何帮助解决这种情况的帮助将不胜感激!
最佳答案
正如所写,您的函数具有分析最小值,无需进行数值优化。不幸的是,StackOverflow 不允许我展示它的数学原理(如果你在 MathExchange 上询问,我可以提供推导),但给定一个数组 A = [a0 a1 ... an]
其中每个ai
是一个正整数,数组 Y = [0 1 ... n]
您发布的函数可简化为以下矩阵乘法 A * (A - 1 + Y)'
其中 '
表示矩阵转置,*
表示矩阵乘法。因此,简单地说,当每个ai
最小化时,函数也最小化。因此,如果这是更大优化的一部分,那么您的任务应该集中于查找 A
的每个元素的最小值(如果元素本身受到约束)。
关于python - 最小化循环迭代的多变量函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44347220/