如何在混合整数编程中编码曼哈顿距离

时间:2013-10-03 23:49:13

标签: linear-programming

让我们有两个点,(x1,y1)和(x2,y2)

dx = | x1 - x2 |

dy = | y1 - y2 |

D_manhattan = dx + dy,其中dx,dy> = 0

我有点担心如何让x1 - x2为| x1 - x2 |,我可能会引入一个表示极性的二进制变量,但我不允许将极性开关乘以x1 - x2,因为它们都是未知变量,这将导致二次方。

1 个答案:

答案 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的所有可能值的上限(在您的情况下,这将是您距离的值:如果您的点位于某个有界区域,通常会出现这种情况)