我正在尝试确定在MILP 中值中找到第二个最大值所需的逻辑。
找到最大值很容易:
forall(val in Array):
maxVal >= val
然而,第二大价值更难(如果不可能?)。
我尝试过以下方法:
forall(val in Array | val != maxVal):
secondMaxVal >= val
这个逻辑在MILP中失败了(我用Mosel编程 - FICO Xpress语言),也许是因为我的Array
实际上有两个维度而包含决策变量。由于这两个维度,我的程序中的逻辑看起来更像:
forall(i in Index1):
maxVal >= sum(j in Index2) Array(i, j)
forall(i in Index1 | sum(j in Index2) Array(i, j) != maxVal):
secondMaxVal >= sum(j in Index2) Array(i, j)
请注意,|
被解释为"其中"。该程序在!=
语句处调用,称之为invalid logic
- 可能是因为Array
包含决策变量,即值由目标函数确定,这有效地最小化了{{1}中的值} {} Array
中的所有值都是> 0
是否可以在MILP中的决策变量数组中定义第二个最大值?