【发布时间】:2013-10-03 23:49:13
【问题描述】:
让我们有两个点,(x1, y1) 和 (x2,y2)
dx = |x1 - x2|
dy = |y1 - y2|
D_manhattan = dx + dy 其中 dx,dy >= 0
我有点不知道如何使 |x1 - x2| 的 x1 - x2 为正,大概我引入了一个表示极性的二进制变量,但我不允许将极性开关乘以 x1 - x2,因为它们都是未知变量,这将导致二次。
【问题讨论】:
让我们有两个点,(x1, y1) 和 (x2,y2)
dx = |x1 - x2|
dy = |y1 - y2|
D_manhattan = dx + dy 其中 dx,dy >= 0
我有点不知道如何使 |x1 - x2| 的 x1 - x2 为正,大概我引入了一个表示极性的二进制变量,但我不允许将极性开关乘以 x1 - x2,因为它们都是未知变量,这将导致二次。
【问题讨论】:
如果您要最小化|x| 的增函数(当然,或者最大化减函数),
您始终可以将 lp 中任意数量 x 的绝对值作为变量 absx,例如:
absx >= x
absx >= -x
之所以有效,是因为 absx 的值将“趋于”其下限,因此它将达到 x 或 -x。
另一方面,如果您要最小化|x| 的递减函数,则您的问题不是凸的,不能建模为lp。
对于所有这些类型的问题,添加问题的简化版本会更好目标,因为这通常对所有这些建模技术都很有用。
编辑
我的意思是,对于这类问题没有通用解决方案:通常不能在线性问题中表示绝对值,尽管在实际情况下通常是可能的。 p>
例如,考虑问题:
max y
y <= | x |
-1 <= x <= 2
0 <= y
它是有界的并且有一个明显的解 (2, 2),但它不能建模为 lp,因为域不是凸的(如果你画它)。
没有你的模型,恐怕无法回答这个问题。
编辑 2
对不起,我没有正确阅读问题。如果你可以使用二进制变量并且如果你所有的距离都由某个常数M界定,你可以做点什么。
我们使用:
ax来表示数量的绝对值x
sx 表示x 的符号(sx = 1 如果x >= 0)如果x < 0,则始终验证这些约束,否则强制执行ax = x:
ax <= x + M * (1 - sx)
ax >= x - M * (1 - sx)
如果x >= 0,则始终验证这些约束,否则强制执行ax = -x:
ax <= -x + M * sx
ax >= -x - M * sx
这是“大 M”方法的一种变体,通常用于线性化二次项。当然,您需要拥有x 的所有可能值的上限(在您的情况下,这将是您的距离值:如果您的点位于某个有界区域,通常就是这种情况)
【讨论】: