IBM Cplex中对称旅行商的子消除约束

时间:2014-08-13 21:15:31

标签: combinatorics cplex traveling-salesman

IBM Cplex中有一个旅行商问题的示例代码。它将子消除约束定义为:

   forall (s in subtours)
   sum (i in Cities : s.subtour[i] != 0)
      x[<minl(i, s.subtour[i]), maxl(i, s.subtour[i])>]
       <= s.size-1;

有人可以帮助我使用此代码行的等效数学公式吗?

1 个答案:

答案 0 :(得分:1)

  

有人可以帮助我使用相同的数学公式   这段代码?

enter image description here

其中:

xij = 1 if the the salesman traverses the link from city i to city j, 0 otherwise
S = a subtour, which is a subset of cities (which in turn is an ordered set).
i, j = two cities that belong to the subtour

该公式取自here,指的是对称旅行商问题(从ij的费用与从{{1}开始的费用相同到j)。因此,变量i仅针对xij&lt; i

我不是j期望,但会解释如下代码:

OPL是一个元组,就像一个C / C ++ subtours

struct

我了解tuple Subtour { int size; int subtour[Cities]; } {Subtour} subtours = ...; 定义为subtours类型,它包含一个数组,在城市上定义,但大小由Subtour变量指定(因为并非所有城市都可能成为给定子语的一部分。)

size不言自明,与制定的每个部分相对应。

forall (s in subtours)

我在源代码中看到sum (i in Cities : s.subtour[i] != 0)是一个数组,对于每个城市subtourisubtour[i]的后继者。因此,给定一个小计,这条线将所有拥有后继城市的城市相加。

i

这是指变量x[<minl(i, s.subtour[i]), maxl(i, s.subtour[i])>] <= s.size-1;,但是要注意xij这一事实,因为在对称TSP中,没有必要为i < j和{{1}定义变量}}

在源代码中动态添加了地形消除约束(在大多数实现中,因为它们的数量是指数的,i < j,所以j < i)。

在逻辑术语中,约束条件表示任何给定的城市组都应该连接,不允许使用子区。

我希望这有帮助!