OR 工具 - 使决策变量尽可能彼此接近并远离边界

问题描述

我有一个线性规划问题,我找不到我想象的正确目标函数。这是:

a1,a2,b1,b2,c1,c2 ∈ Q+

Decision variables:
x: [a1,a2],y: [b1,b2]

Constraints:
(1 - c1) * y >= (1 + c2) * x

作为一个目标,我试图让 x 和 y 尽可能接近,让 x 离 a1 尽可能远,让 y 离 b2 尽可能远。

我目前的目标函数是这样的:

max x - a1 + b2 - y

不幸的是,很多时候,这个目标函数要么将 x 设置为 a1,要么将 y 设置为 b2,但正如我所说,我需要 x 和 y 彼此接近。你能帮我建立正确的方法吗?谢谢!

作为参考,这是我用 Python 和 OR 工具编写的代码

solver = pywraplp.solver.CreateSolver("GLOP")

x = solver.NumVar(lb=a1,ub=a2,name="X")
y = solver.NumVar(lb=b1,ub=b2,name="Y")

solver.Add(constraint=(1 - c1) * y >= (1 + c2) * x)

solver.Maximize(x - a1 + b2 - y)

解决方法

听起来您想要的是 2 个目标的组合:

  1. 最大化 x 和 y 使其远离它们的边界,并且
  2. 最小化 x 和 y 之间的差值

有很多方法可以重新表述这一点。这是留在 LP 中的一个。

您可以通过添加一个非负量 epsilon 来实现第一部分,该 epsilon 将成为您试图摆脱的所有约束的一部分,l <= r 将被重写为 l + epsilon <= r。用数学写成:

max epsilon 
w.r.t.
epsilon >= 0
a1 + epsilon <= x <= a2 - epsilon
b1 + epsilon <= y <= b2 - epsilon
(1 - c1) * y >= (1 + c2) * x

(为了好玩,你可以回过头来看看这个变换是如何创建一个边长为 2*epsilon 的 d 维立方体围绕一个可行点 (x,y)。这也意味着如果任何约束是“退化的",epsilon 将为 0,转换将无济于事。)

第二部分可以通过最小化delta = abs(x-y)来实现。我们可以用变量 delta >= abs(x-y) 来限制差异,而不是准确地捕获相等性。我们可以这样写:

delta >= x - y >= -delta

并最大化 -delta 以将 x 和 y 推得更近。 (为了好玩,如果 delta=abs(x-y) 的客观系数为负,您可以确认极大解中的 max d1*epsilon - d2*delta (for d1,d2 in Q+) 。)

我们可以通过最大化来结合这两个目标:

REGEXP_REPLACE

d1 和 d2 的选择取决于您。这可能意味着最大化组合目标无法实现您要实现的两个目标之间的平衡。

由于 x 和 y 是有界的,因此您无需担心可行的无界 epsilon 值。