我试图最小化存储在array
中的80个变量的函数f
。该函数由两个嵌套循环定义:外部一个索引array
,由i
定义,而内部循环执行array[i]
次,并将计算结果添加到运行总数中。计算依赖于一些条件x
和{
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])
并抛出最小值{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]
,其中每个{Y = [0 1 ... n]
你发布的函数可以简化为下面的矩阵乘法A * (A - 1 + Y)'
,其中'
表示矩阵转置,*
表示矩阵乘法。因此,简单地说,当每个ai
最小化时,函数被最小化。因此,如果这是一个更大的优化的一部分,那么您的任务应该集中在寻找A
中每个元素的最小值(如果元素本身是受约束的)。在相关问题 更多 >
编程相关推荐