2017-06-03 87 views
1

我想尽量减少存储在array中的80个变量的函数f。该函数由两个嵌套循环定义:外部一个索引array by i,而内部循环执行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.

我想查找使f的值最小的条目array。然而,当我告诉(例如)Mathematica尽量减少f([x1, x2, ..., x80])并吐出最小值array时,程序会抱怨,因为它无法执行定义f的循环的不确定次数。

鉴于此,我的问题是:

如何最小化多元函数,它的参数描述的次数给定的循环被重复?

我原本试图在Mathematica中实现这一点,但发现我无法通过上述过程定义f。我能做的最好的是告诉Mathematica执行上面的循环,然后在total已被计算后定义f[array_] := total。当我运行我的代码时,Mathematica自然声称它不能评估f,甚至在它执行我的命令NMinimize[{f[array] array ϵ Integers}, array]之前抛出一个错误。 Mathematica试图在NMinimize之前调用f这一事实表明我不太了解Mathematica中的函数是如何工作的。任何帮助解决这种情况将不胜感激!

+0

首先,您可以查看[this](https://en.m.wikipedia.org/wiki/Mathematical_optimization)关于函数优化的Wikipedia页面。鉴于你无法区分这个功能,很多可能的技术都变得不适用,这很遗憾。 – ForceBru

+0

如果您可以创建一个具体的示例问题,这个问题可能比您的真实问题简单十到二十倍,但它保留了问题的基本特征,并且您可以编辑您的帖子以包含示例问题的完整定义和详细信息,那么有人可能会把你的例子放到他们的笔记本中,稍微调整记号和定义,并显示一两种方法来最小化这个例子。然后,您可能会将该技术映射回您真正的问题。 – Bill

+0

@ForceBru是的,整数约束消除了许多数值方法,但我更关心的是如何让程序在'f'上执行或多或少的_any_函数调用,因为它的参数变成可变数量的循环迭代。 –

回答

2

正如您所写的,您的函数具有最小的分析性,并且不需要数值优化。不幸的是,StackOverflow不会让我显示它的数学(如果你问MathExchange我可以提供派生),但给定一个数组A = [a0 a1 ... an],其中每个ai是一个正整数,并且数组Y = [0 1 ... n]您发布的函数减少到下面的矩阵乘法A * (A - 1 + Y)'其中'表示矩阵转置并且*表示矩阵乘法。所以,简单地说,当每个ai被最小化时,该功能被最小化。因此,如果这是更大优化的一部分,那么如果元素本身受到限制,则您的任务应该集中在找到每个元素的最小值。