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;
有人可以帮助我使用此代码行的等效数学公式吗?
答案 0 :(得分:1)
有人可以帮助我使用相同的数学公式 这段代码?
其中:
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,指的是对称旅行商问题(从i
到j
的费用与从{{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)
是一个数组,对于每个城市subtour
,i
是subtour[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
)。
在逻辑术语中,约束条件表示任何给定的城市组都应该连接,不允许使用子区。
我希望这有帮助!