Вот подход, который адаптирован из TSP, собирающего призы (например, этот документ ). Пусть V
будет множеством всех узлов. Я предполагаю, что V
включает в себя узел depot , назовите его узлом 1, который должен быть в туре. (Если нет, вы, вероятно, можете добавить фиктивный узел, который выполняет эту роль.)
Пусть x[i]
будет переменной решения, равной 1, если мы посетим узел i
хотя бы один раз, и 0 в противном случае. (Возможно, у вас уже есть такая переменная решения в вашей модели.)
Добавьте эти ограничения, которые определяют x[i]
:
x[i] <= sum {j in V} N[i,j] for all i in V
M * x[i] >= N[i,j] for all i, j in V
Другими словами: x[i]
не может быть равно 1, если ребра не выходят из узла i
, и x[i]
должно равняться 1, если есть ребра, выходящие из узла i
.
(Здесь N[i,j]
равно 1, если мы переходим от i
к j
, а M
- достаточно большое число, возможно, равное максимальному числу раз, которое вы можете пройти через один край.)
Здесь приведено ограничение удаления субтуров, определенное для всех подмножеств S
из V
, так что S
включает в себя узел 1, а для всех узлов i
в V \ S
:
sum {j in S} (N[i,j] + N[j,i]) >= 2 * x[i]
Другими словами, если мы посетим узел i
, который не находится в S
, то должно быть как минимум два ребра в или из S
. (Подземный обход нарушил бы это ограничение для S
, равного узлам, которые находятся на подземном обходе, который содержит 1.)
Нам также нужно ограничение, требующее, чтобы узел 1 находился в туре:
x[1] = 1
Возможно, я играю немного быстро и свободно с индексами направления, т. Е. Я не уверен, что ваша модель устанавливает N[i,j] = N[j,i]
или что-то в этом роде, но, надеюсь, идея достаточно ясна, и вы можете изменить мой подход как необходимо.