python - 最小化循环迭代的多变量函数

标签 python arrays loops wolfram-mathematica minimization

我正在尝试最小化存储在数组中的约80个变量的函数f。该函数由两个嵌套循环定义:外部循环按 i 索引 array,而内部循环则执行 array[i] 次,将计算结果添加到运行总计中。计算取决于一些条件xy,并且每次执行时都会略有变化,这就是我需要循环结构的原因。以下是 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/

相关文章:

python - 是否有 "pandas"方法来识别 DataFrame 中的哪些行不存在于合并结果中?

python - 从 Django 导入 .so 文件

python - 指定和不指定 dtype 的 numpy.array 行为很奇怪

java - 对数字字符串的 ArrayList 进行排序

c - 想要通过遍历结构来减少函数

python - 使用模型继承并遇到不可为空的字段错误

c++ - 为什么这两个相似的功能之一崩溃而一个工作正常?

r - 对于需要条件检查的东西,有没有比 while 循环更有效的方法?

C - 将未初始化的变量传递给数组元素

python - 正则表达式与 Python re 从行尾开始匹配