Учитывая масштаб проблемы, мы могли бы успешно атаковать ее с помощью целочисленной программы. Для каждого направленного ребра e
пусть x(e)
будет неотрицательной целочисленной переменной, представляющей количество раз, когда мы используем ребро, а y(e)
будет переменной 0-1, представляющей количество раз, когда мы получаем прибыль от ребра. Для каждой вершины v
пусть w(v)
будет переменной 0-1, указывающей, посещается ли v
, а z(v)
будет переменной 0-1, указывающей, является ли v
конечной вершиной. Простая часть целочисленной программы - это
maximize sum_e p(e) y(e)
subject to
y(e) <= x(e) # can't profit from an edge if we don't use it
for all e, y(e) <= w(head(e)) # can't profit unless we visit
for all e, y(e) <= w(tail(e)) # can't profit unless we visit
sum_e d(e) x(e) <= D # bounded distance
sum_v z(v) = 1 # exactly one ending vertex
# path constraints
for all vertices v, sum_{e with head v} x(e) - sum_{e with tail v} x(e) =
z(v) - 1 if v is the starting vertex,
z(v) otherwise.
Жесткая часть - предотвращение циклов в никуда (аналог ограничения исключения субтура для TSP). Если нам это удастся, то мы сможем найти след Эйлера в подграфе, чьи ребра имеют кратность, обозначенную y(e)
.
Мы используем ту же стратегию, что и TSP - пишем экспоненциальное количество ограничений, применяем их после c.
for all sets of vertices S containing the starting vertex,
for all vertices v not in S,
sum_{directed edges e entering S} y(e) >= w(v)