解决方法存在以下问题(简化版):
所以我有一个嵌套的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
目标函数是这两个变量之和
解决者或目标寻求(除非我给它一个awnser)似乎不会得到除0,0之外的一个芒果。
我的实际问题是我有6个这样的IF单元,我试图找到一个(x,y)最大化我的目标函数。我希望excel能够通过尽可能多的组合。
有任何想法或其他方法吗?谢谢。
答案 0 :(得分:3)
Solver 在此玩具问题中找不到最佳解决方案的原因是因为使用IF
和AND
语句会使问题不凸。对于非凸问题,GRG Nonlinear
求解方法(求解器使用的默认方法)不能保证最优解,因为它可以被困在本地最佳解决方案中,而这些解决方案并非最优。
话虽如此,有一种方法可以将您的问题表示为一个混合整数程序,虽然它仍然是非凸的,但可以使用&#34; Simplex LP&#34;求解器的方法,并保证最大值。
模型设置
以下是电子表格设置的屏幕截图:
为方便起见,我使用了多个数量的命名范围。 特别是:
- 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)
我们将用两个二进制变量替换这些表达式,如果满足每个表达式则等于一,否则为零。
逻辑是我们可以强加约束而不是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
会尝试拟合相应的范围,以便尽可能多地z
等于1。
绿色单元格H2, J2
有两个新的二进制变量,分别称为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
。
解算器型号:
在该模式中,目标函数单元格是二元变量的总和。决策变量为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&lt; = x&lt; = UB_x * z 至 min(LB_x)*(1-z)+ LB_x * z&lt; = x&lt; = UB_x * z + max(UB_x)*(1-z)
其中min(LB_x)是所有区间的最小下限(同样对于UB和y)。这样,如果x不落入区间(z = 0),则仅强制其落入某个其他区间。
我希望这有帮助!