Linear programming 或工具-使决策变量彼此尽可能接近,并尽可能远离边界
我有一个线性规划问题,我无法找到我想象中的正确目标函数。这是:Linear programming 或工具-使决策变量彼此尽可能接近,并尽可能远离边界,linear-programming,or-tools,Linear Programming,Or Tools,我有一个线性规划问题,我无法找到我想象中的正确目标函数。这是: 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设置为a
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和/或工具编写的代码:
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)
听起来你想要的是两个目标的组合:
您可以通过添加一个非负数量ε来实现第一部分,该ε将是您试图摆脱的所有约束的一部分,
l而不试图准确理解您正在做什么,通常的方法imho将包含一些绝对值线性化(或者更好的方法:二次目标)。所以我猜你想要的是:max abs(x-a1)+abs(y-b2)-(abs(x-y))
。这(除了潜在的权重因素)在我看来是合理的。现在剩下的障碍是制定abs
。这种情况看起来很糟糕,因为你需要最大化(正)abs值,这不允许自然线性化。您可以将其表述为MILP,但是GLOP
无法解决它(我猜只有LP),因此最简单但仍然不太有趣的方法是实现上述目标+基于MILP的abs线性化(请参阅)。从优化的角度来看,这项任务对于那些您期望的解算器来说可能更复杂(凸性!)。
max epsilon
w.r.t.
epsilon >= 0
a1 + epsilon <= x <= a2 - epsilon
b1 + epsilon <= y <= b2 - epsilon
(1 - c1) * y >= (1 + c2) * x
delta >= x - y >= -delta
max d1*epsilon - d2*delta (for d1, d2 in Q+)