Матроиды - Алгоритмика
Матроиды

Матроиды

автор Сергей Слотин
опубликовано 2017

Понятие матроида нужно, чтобы придумывать и доказывать некоторые жадные алгоритмы в задачах, где нужно набрать какое-то множество объектов максимального веса. Например, минимальный остов, максимальное вершинно-взвешенное паросочетание или выполнение заказов с ограничениями по времени.

Если вы не специалист по абстрактной алгебре, рекомендуется подсматривать примеры матроидов в конце статьи.

#Определение

Матроидом называется пара (X,I)(X, I), где XX — множество элементов, называемое носителем матроида, а II — некоторое множество подмножеств XX, называемое семейством независимых множеств. В матроиде должны выполняться следующие свойства:

  • Пустое множество является независимым: I\varnothing \in I

  • Любое подмножество независимого множества тоже независимо:

AB,BI    AI A \subset B, B \in I \implies A \in I
  • Если в независимом множестве AA меньше элементов, чем в независимом множестве BB, то будет существовать элемент из BB, дополняющий AA до независимого множества размера A+1|A|+1:
A,BI,A<B    xBA:A{x}I A, B \in I, |A| < |B| \implies \exists x \in B \setminus A: A \cup \{x\} \in I

Матроид называется взвешенным, если на нем есть аддитивная весовая функция: w(A)=w(ai)w(A) = \sum w(a_i).

#Алгоритм Радо-Эдмондса

Пусть нам нужно найти независимое множество, которое будет включать как можно больше элементов и при этом иметь как можно меньший вес. Утверждается, что можно просто отсортировать элементы по возрастанию весов и пытаться в таком порядке добавлять их в ответ:

X.sort()
s = []
for x in X:
    if good(s + [x]):
        s += [x]

Здесь под good имеется в виду sxIs \cup x \in I.

Корректность этого алгоритма для произвольного матроида следует из следующего утверждения:

Теорема Радо-Эдмондса. Пусть AIA \in I — множество минимального веса среди всех независимых подмножеств XX мощности kk. Возьмем x:AxI,;xA,;w(x)x: A \cup x \in I,;x \notin A,;w(x) — минимальна. Тогда AxA \cup x — множество минимального веса среди независимых подмножеств XX мощности k+1k + 1.

Доказательство:

Рассмотрим BB — множество минимального веса среди независимых подмножеств XX мощности k+1k + 1.

Из свойств матроида: yBA:AyI\exists y \in B \setminus A : A \cup y \in I.

Тогда верны два неравенства:

{w(Ay)=w(A)+w(y)w(B)    w(A)w(B)w(y)w(By)=w(B)w(y)w(A)    w(A)w(B)w(y) \begin{cases} w(A \cup y) = w(A) + w(y) \geq w(B) \implies w(A) \geq w(B) - w(y) \\ w(B \setminus y) = w(B) - w(y) \geq w(A) \implies w(A) \leq w(B) - w(y) \end{cases}

Величина w(A)w(A) с двух сторон ограничивает величину w(B)w(y)w(B) - w(y). Значит, они равны. Следовательно, w(Ay)=w(A)+w(y)=w(B)w(A \cup y) = w(A) + w(y) = w(B).

Получаем, что если объединить множество AA с xx — минимальным из таких, что AxIA \cup x \in I, — то получим множество минимального веса среди независимых подмножеств XX мощности k+1k + 1.

Иными словами, если у нас есть оптимальное kk-элементарное независимое множество, то мы можем индуктивно построить оптимальное (k+1)(k+1)-элементарное множество, добавив к нему минимальный элемент, оставляющий построенное множество независимым.

#Примеры

Для доказательства жадников нужно просто (а иногда не просто) показать, что рассматриваемое множество является матроидом. Первые два критерия доказывать тривиально, третий сложнее.

#Минимальный остов

Рассмотрим неориентированный граф G=(V,E)G = (V, E). Пусть II — множество лесов графа (ациклических подмножеств EE). Тогда M=(E,I)M = (E, I) является матроидом:

  • Граф без ребер является лесом.
  • Если удалить из леса ребра, он останется лесом.
  • Пусть есть два леса AB|A| \leq |B|. В AA будет VA|V| - |A| компонент связности, в BB будет VB|V|-|B| компонент связности. Так как в BB компонент связности меньше, то будет существовать какое-то ребро xx, связывающее две компоненты связности из AA. Его и возьмем: AxA \cup {x} тоже будет лесом, так как xx только соединило две разные компоненты связности.

Применив к этому матроиду теорему Радо-Эдмондса, мы получаем обоснование алгоритма Крускала для нахождения минимального остова.

#Расписания

Пусть у нас есть nn заданий, на выполнение каждого требуется 11 час. Награда за выполнение ii-го задания не позже did_i-того часа равна wiw_i. В один час разрешено сделать только одно задание. Цель — максимизировать сумму наград.

Назовём правильными те наборы заданий, для которых существует порядок, при котором можно их всех успеть сделать до их дедлайнов. Проверять фиксированный набор можно так: отсортировать по дедлайнам (did_i) и проверить, что diid_i \geq i для всех ii.

Тогда M=M = (множество всех заданий, множество правильных наборов заданий) является матроидом:

  • Пустой набор заданий всегда можно сделать.
  • Если у нас стало меньше заданий, то их сделать мы тоже успеем.
  • Пусть есть два правильных набора AB|A| \leq |B|. Тогда в BB будет существовать задание xx с дедлайном позже A|A|. Все задания AA можно сделать не позже A|A|-го часа, а в (A+1)(|A|+1)-й час будем делать xx. Значит, AxA \cup x — тоже правильный набор.

Значит, можно отсортировать задания по убыванию их стоимости и пытаться в таком порядке добавлять в ответ, проверяя правильность какой-нибудь структурой данных.

#Паросочетания

Рассмотрим двудольный граф G=(L,R,E)G = (L, R, E). Пусть II — множество наборов вершин левой доли, которых можно покрыть каким-нибудь паросочетанием. Тогда M=(L,I)M = (L, I) является матроидом:

  • Любое паросочетание покрывает пустое множество вершин.
  • Исходное паросочетание покрывает также и любое подмножество исходных вершин.
  • Пусть есть два множества вершин AB|A| \leq |B|. Раскрасим ребра из паросочетания, соответствующего AA в красный цвет, BB — в синий, а ребра из обоих паросочетаний — в пурпурный. Рассмотрим граф из красных и синих ребер. Любая компонента связности в нём представляет собой либо путь, либо цикл, состоящий из чередующихся красных и синих ребер. В любом цикле будет равное число красных и синих ребер, а так как всего синих ребер больше, то должен существовать путь, начинающийся и оканчивающийся синим ребром. Поменяем в этом пути красный и синий цвета и сделаем пурпурные ребра обратно красными. Теперь в графе из красных ребер на одно ребро больше, а значит к множеству AA добавилась какая-то вершина из левой доли, принадлежавшая ранее BB.

Пусть у вершин левой доли есть веса, и нам нужно найти максимальное паросочетание минимального веса. Согласно теореме, мы можем отсортировать вершины левой доли по их весам, а затем пытаться добавлять их в паросочетание. Сделать это можно стандартным алгоритмом Куна.

#Линейно независимые вектора

Множество nn-мерных векторов называется линейно независимым, если никакой его вектор нельзя получить линейной комбинацией (взвешенной суммой) других.

Рассмотрим какое-то множество векторов VV. Пусть II — множество всех его линейно независимых подмножеств. Тогда M=(V,I)M = (V, I) является матроидом:

  • В пустом множестве нельзя получить какой-либо вектор.
  • Подмножество линейно независимого множество тоже линейно независимо: способов набрать вектора стало ещё меньше.
  • Пусть есть два линейно независимых множества AA и BB, и BB больше. Пусть в нём нельзя выбрать вектор, совместимый с AA. Тогда получается, что все вектора BB можно выразить из AA. Значит, размерность BB уж точно не больше — противоречие.

Пример задачи: набрать базис максимального веса, если каждый вектор сколько-то стоит.

Примечание: Z2Z_2 — это тоже пространство, и там тоже можно ввести линейную независимость. Это значит, что то же самое распространяется на задачи в духе «набрать максимальное множество чисел, из которых ксором нельзя получить ноль».