У меня есть DAG с N узлами, то есть 1, 2, ..., N
, и каждый узел имеет вес (мы можем назвать его временем) x_1, x_2, ..., x_N
. Я хочу сделать топологическую сортировку, но сложность в том, что у меня есть целевая функция при сортировке. Моя целевая функция — минимизировать общее время между несколькими парами узлов.
Например, у меня есть DAG с 6 узлами, и мне нужна определенная топологическая сортировка, чтобы (1,3) + (2,4)
было сведено к минимуму, где (A,B)
обозначает время между двумя узлами A и B. Например, если у нас есть сортировка [1, 6, 3, 2, 5, 4, 7]
, (1,3) = x_6
и (2,4) = x_5
. На основе DAG я хочу найти сортировку, минимизирующую (1,3) + (2,4)
.
Я думал над этой проблемой какое-то время. Генерация всех возможных топологических сортировок (ссылка ссылка) и вычисление целевой функции один за другим всегда возможное решение, но оно занимает слишком много времени, если N велико. Мне также было предложено использовать обрезку с привязкой к ветвям при создании всех возможных сортировок (я не очень хорошо знаком с привязкой к ветвям, но я думаю, что это не сильно уменьшит сложность).
Любой (оптимальный или эвристический) алгоритм для такого рода проблем? Было бы идеально, если бы алгоритм можно было применять и к другим целевым функциям, таким как минимизация общего времени запуска для некоторых узлов. Любое предложение приветствуется.
PS: Или, альтернативно, можно ли сформулировать эту проблему как задачу линейной целочисленной оптимизации?
(u,v)
к целевой функции, которую необходимо минимизировать); ... - person j_random_hacker   schedule 18.07.2016(1,3)
или(2,4)
в вашем примере) умножаться на отдельный вес, то таким же образом можно свести NP-трудную квадратичную задачу о назначениях к этой задаче. Возможно, даже частный случай QAP, где каждый вес равен 1, по-прежнему NP-труден — это означало бы, что ваша проблема тоже — но я не смог подтвердить это с помощью нескольких Google. - person j_random_hacker   schedule 18.07.2016