quadratic_assignment(method='faq')#
- scipy.optimize.quadratic_assignment(A, B, метод='faq', опции=None)
Решить квадратичную задачу назначения (приближенно).
Эта функция решает задачу квадратичного назначения (QAP) и задачу сопоставления графов (GMP) с использованием быстрого приближённого алгоритма QAP (FAQ) [1].
Квадратичное назначение решает задачи следующего вида:
\[\begin{split}\min_P & \ {\ \text{trace}(A^T P B P^T)}\\ \mbox{s.t. } & {P \ \epsilon \ \mathcal{P}}\\\end{split}\]где \(\mathcal{P}\) является множеством всех матриц перестановок, \(A\) и \(B\) являются квадратными матрицами.
Сопоставление графов пытается максимизировать той же целевой функции. Этот алгоритм можно рассматривать как поиск выравнивания узлов двух графов, которое минимизирует количество индуцированных расхождений рёбер или, в случае взвешенных графов, сумму квадратов разностей весов рёбер.
Обратите внимание, что задача квадратичного назначения является NP-трудной. Результаты, приведённые здесь, являются приближениями и не гарантируют оптимальности.
- Параметры:
- A2-D массив, квадратный
Квадратная матрица \(A\) в целевой функции выше.
- B2-D массив, квадратный
Квадратная матрица \(B\) в целевой функции выше.
- методstr в {'faq', '2opt'} (по умолчанию: 'faq')
Алгоритм, используемый для решения задачи. Это специфичная для метода документация для 'faq'. ‘2opt’ также доступен.
- Возвращает:
- resOptimizeResult
OptimizeResultсодержащий следующие поля.- col_indОдномерный массив
Индексы столбцов, соответствующие наилучшей найденной перестановке узлов B.
- funfloat
Целевое значение решения.
- nitint
Количество выполненных итераций Франка-Вольфа.
Смотрите также
Для документации по остальным параметрам см.
scipy.optimize.quadratic_assignment- Опции:
- ——-
- максимизироватьbool (по умолчанию: False)
Максимизирует целевую функцию, если
True.- partial_match2-D массив целых чисел, опционально (по умолчанию: None)
Исправляет часть сопоставления. Также известен как "начальное значение" [2].
Каждая строка partial_match задаёт пару сопоставленных узлов: узел
partial_match[i, 0]of A соответствует узлуpartial_match[i, 1]of B. Массив имеет форму(m, 2), гдеmне больше, чем количество узлов, \(n\).- rng{None, int,
numpy.random.Generator, опционально Состояние генератора псевдослучайных чисел. См.
quadratic_assignmentподробности.- P02-D массив, "барицентр" или "рандомизированный" (по умолчанию: "барицентр")
Начальная позиция. Должна быть дважды стохастической матрицей [3].
Если начальная позиция является массивом, она должна быть дважды стохастической матрицей размера \(m' \times m'\) где \(m' = n - m\).
Если
"barycenter"(по умолчанию), начальная позиция — это барицентр многогранника Биркгофа (пространства дважды стохастических матриц). Это \(m' \times m'\) матрица со всеми элементами, равными \(1 / m'\).Если
"randomized"начальная позиция поиска — \(P_0 = (J + K) / 2\), где \(J\) является барицентром и \(K\) является случайной дважды стохастической матрицей.- shuffle_inputbool (по умолчанию: False)
Установить в True для разрешения вырожденных градиентов случайным образом. Для невырожденных градиентов эта опция не имеет эффекта.
- maxiterint, положительное (по умолчанию: 30)
Целое число, задающее максимальное количество итераций Франка-Вольфа.
- tolfloat (по умолчанию: 0.03)
Допуск для завершения. Итерация Франка-Вольфа завершается, когда \(\frac{||P_{i}-P_{i+1}||_F}{\sqrt{m'}} \leq tol\), где \(i\) — это номер итерации.
Примечания
Алгоритм может быть чувствителен к начальной матрице перестановок (или "позиции" поиска) из-за возможности нескольких локальных минимумов в допустимой области. Инициализация барицентром с большей вероятностью приведет к лучшему решению, чем единичная случайная инициализация. Однако, вызов
quadratic_assignmentнесколько раз с разными случайными инициализациями может привести к лучшему оптимуму за счёт большего общего времени выполнения.Ссылки
[1]J.T. Vogelstein, J.M. Conroy, V. Lyzinski, L.J. Podrazik, S.G. Kratzer, E.T. Harley, D.E. Fishkind, R.J. Vogelstein, и C.E. Priebe, «Fast approximate quadratic programming for graph matching», PLOS one, vol. 10, no. 4, p. e0121002, 2015, DOI:10.1371/journal.pone.0121002
[2]D. Fishkind, S. Adali, H. Patsolic, L. Meng, D. Singh, V. Lyzinski, C. Priebe, “Seeded graph matching”, Pattern Recognit. 87 (2019): 203-215, DOI:10.1016/j.patcog.2018.09.014
[3]“Дважды стохастическая матрица,” Википедия. https://en.wikipedia.org/wiki/Doubly_stochastic_matrix
Примеры
Как упомянуто выше, инициализация барицентром часто даёт лучшее решение, чем единичная случайная инициализация.
>>> from scipy.optimize import quadratic_assignment >>> import numpy as np >>> rng = np.random.default_rng() >>> n = 15 >>> A = rng.random((n, n)) >>> B = rng.random((n, n)) >>> options = {"rng": rng} >>> res = quadratic_assignment(A, B, options=options) # FAQ is default method >>> print(res.fun) 47.797048706380636 # may vary
>>> options = {"rng": rng, "P0": "randomized"} # use randomized initialization >>> res = quadratic_assignment(A, B, options=options) >>> print(res.fun) 47.37287069769966 # may vary
Однако, рассмотрите запуск из нескольких рандомизированных инициализаций и сохранение лучшего результата.
>>> res = min([quadratic_assignment(A, B, options=options) ... for i in range(30)], key=lambda x: x.fun) >>> print(res.fun) 46.55974835248574 # may vary
Метод '2-opt' может быть использован для попытки улучшения результатов.
>>> options = {"partial_guess": np.array([np.arange(n), res.col_ind]).T, "rng": rng} >>> res = quadratic_assignment(A, B, method="2opt", options=options) >>> print(res.fun) 46.55974835248574 # may vary