Цикл по подмножеству переменных в ограничении перехода

#loops #constraints #julia #julia-jump #network-flow

#циклы #ограничения #юлия #джулия-прыжок #сетевой поток

Вопрос:

Я пытаюсь реализовать проблему с дуговым потоком, когда у меня есть набор дуг в массиве. Каждая дуга представляет собой пользовательскую структуру данных, состоящую из узлов from / to . Я хочу добавить ограничение, в котором я включаю только дуги, которые идут от определенного узла (1), что-то вроде:

 @constraint(m, sum(x[a] for a in arcs; a.from==1) == 1)
  

Это не работает. Каков наилучший подход для решения этой проблемы? Есть ли способ сделать это без предварительного вычисления всех исходящих дуг из каждого узла в первую очередь? Если да, есть ли способ добавить дополнительные условия?
Заранее спасибо

Бернардо

Ответ №1:

Я предполагаю, что синтаксис, который вы ищете, является

 @constraint(m, sum(x[a] for a in arcs if a.from==1) == 1)
  

Это следует из стандартного синтаксиса Julia для выражений генератора.

Однако выражение так же неэффективно, как и в обычном Julia, потому что оно перебирает все дуги. Если этот цикл становится узким местом, вам нужно будет переформулировать выражение другим способом, например, путем предварительного вычисления исходящих дуг из каждого узла.

Комментарии:

1. Да, это решило мою проблему. Я забыл упомянуть, что я не беспокоюсь о цикле по всем дугам при построении ограничения.

Ответ №2:

Вам нужно переопределить вашу x матрицу смежности, то есть квадратную матрицу, которая имеет 1 (или вес ребра), где есть дуга между парой узлов и 0 в противном случае.

Предполагая, что рассматриваемый вами набор вершин N (например N = 1:10 , для 10 вершин), ваше ограничение теперь может выглядеть следующим образом:

 @constraint(m, arcConstraint[n in N], sum(x[n,k] for k ∈ N) == 1 )
  

Обратите внимание, что arcConstraint это просто имя ограничения, чтобы вы могли ссылаться на него позже.

Также sum можно записать так, как sum(x[n,:]) если бы вы действительно знали, что просматриваете весь столбец (зависит от вашего точного сценария).

Комментарии:

1. Не будет ли это связано с созданием переменных NxN? В моем случае количество дуг в задаче значительно меньше, чем NxN, и я хочу избежать такого количества переменных (только по одной на дугу).

2. У вас не может быть условных инструкций в модели перехода (поскольку решатели ее не поддерживают). Если ваша цель — выбрать дуги для графика размером N, естественно, у вас есть NxN переменных (или половина этого для неориентированного графика). Если ваше N больше, чем в зависимости от некоторых конкретных характеристик вашей проблемы, вы можете попытаться переструктурировать его, но это скорее математическое моделирование, чем проблема перехода Джулии