2017-06-03 114 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被最小化時,該功能被最小化。因此,如果這是更大優化的一部分,那麼如果元素本身受到限制,則您的任務應該集中在找到每個元素的最小值。