[英]Excel Solver: Is there a way to iterate over 2 changing variables?
我的求解器有一個問題,如下所示(簡化版本):所以我有一個嵌套的If語句,該語句描述2個變化變量(x,y)的條件。 例如:在一個單元格中:IF(AND((x <= 2),(x> = 0.5),(y <= 10),(y> = 5)),1,0
它下面的單元格:IF(AND((x <= 2.5),(x> = 1.9),(y <= 11),(y> = 9)),1,0
目標函數是這兩個變量的總和
求解器或目標搜索器(除非我給它提供遮篷)似乎無法獲得除0,0以外的遮篷。 我的實際問題是我有6個這樣的IF單元,我試圖找到一個最大化目標函數的(x,y)。 我希望excel能夠進行盡可能多的組合。
有什么想法或其他方式嗎? 謝謝。
求解器未在此玩具問題中找到最佳解的原因是因為使用IF
和AND
語句使問題不凸。 對於非凸問題, GRG Nonlinear
求解方法(求解器使用的默認值)不能保證最優解,因為它可能會陷入非最優局部最優解中。
話雖如此,但是有一種方法可以將問題表達為混合整數程序,盡管它仍然是非凸的,但可以使用Solver的“ Simplex LP”方法進行求解,並給出最大的保證值。
模型設定
這是電子表格設置的屏幕截圖:
為了方便起見,我對多個數量使用了命名范圍。 尤其是:
- B2 --> x_var
- C2 --> x_UB1
- D2 --> x_LB1
- E2 --> x_UB2
- F2 --> x_LB2
和第3行我使用相同的約定,但不是x_
我們y_
。
紅色單元格( B4
和E4
)具有您描述的條件,藍色單元格( B5
)具有它們的總和。
例如, B4
的條件為
=IF(AND(x_var<=x_UB1,x_var>=x_LB1,y_var<=y_UB1,y_var>=y_LB1),1,0)
我們將用兩個二進制變量替換這些表達式,如果滿足每個表達式,則它們等於1,否則等於0。
邏輯是,我們可以施加約束來代替IF
表達式:
LB_x * z <= x <= UB_x * z
LB_y * z <= y <= UB_y * z
z is binary
然后z = 1 ==> LB_x <= x <= UB_x LB_y <= y <= UB_y
並且由於我們最大化了兩個z
變量的總和,因此x
和y
將嘗試使i對應於相應的范圍,從而使盡可能多的z
等於1。
綠色單元格H2, J2
具有兩個新的二進制cond1_true, cond2_true
分別稱為cond1_true, cond2_true
。 其他單元格具有上述約束:
例如,對於第一個表達式:
J2: =x_var-cond1_true*x_UB1
J3: =y_var-cond1_true*y_UB1
K2: =x_LB1*cond1_true-x_var
K3: =y_LB1*cond1_true-y_var
在求解器模型中,所有這些像元都必須<= 0
等於<= 0
。
求解器模型:
在該模式下,目標函數單元是二進制變量的總和。 決策變量是x_var, y_yar, cond1_true, cond2_true
。 約束全部為expression <= 0
格式。 這是工作表: https : //www.dropbox.com/s/uek2k9gownhh3ni/excel-solver-is-there-a-way-to-iterate-over-2-changing-variables.xlsx?dl=0
使用此公式,求解器可以遍歷變量的多種組合,並嘗試選擇最佳變量。 它通常可以保證最佳解決方案(小問題幾乎總是這樣)
更新
如果間隔不重疊,則需要將LB_x * z <= x <= UB_x * z取為min(LB_x)*(1-z)+ LB_x * z <= x <= UB_x * z + max(UB_x)* (1-z)
其中min(LB_x)是所有間隔的最小下限(對於UB和y同樣)。 這樣,如果x不落入間隔(z = 0),則僅被迫落入某個其他間隔。
我希望這有幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.