让我们有两个点,(x1,y1)和(x2,y2)
dx = | x1 - x2 |
dy = | y1 - y2 |
D_manhattan = dx + dy,其中dx,dy> = 0
我有点担心如何让x1 - x2为| x1 - x2 |,我可能会引入一个表示极性的二进制变量,但我不允许将极性开关乘以x1 - x2,因为它们都是未知变量,这将导致二次方。
答案 0 :(得分:1)
如果你正在最小化|x|
的增加函数(或当然最大化递减函数),
您可以始终将lp中任意数量x
的aboslute值作为变量absx
,例如:
absx >= x
absx >= -x
这是有效的,因为值absx
将“趋向于”其下限,因此它将达到x
或-x
。
另一方面,如果您将|x|
的递减函数最小化,则问题不会凸出,也不能建模为lp
。
对于所有这些问题,使用目标添加问题的简化版本会更好,因为它通常对所有这些建模技术都有用。
修改强>
我的意思是没有这类问题的一般解决方案:你通常不能代表线性问题的绝对值,尽管在实际情况下它通常是可能的。
例如,考虑问题:
max y
y <= | x |
-1 <= x <= 2
0 <= y
它有界并且有一个明显的解决方案(2,2),但它不能被建模为lp,因为域不是凸的(它看起来像'M'下的形状如果你画它。)
没有你的模型,就不可能回答我害怕的问题。
修改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
的所有可能值的上限(在您的情况下,这将是您距离的值:如果您的点位于某个有界区域,通常会出现这种情况)