Эта проблема, которую я буду называть CO для упорядочивания столбцов, является NP-сложной . Вот сокращение от NP-трудной проблемы Vertex Cover (VC) к нему:
Решение проблемных форм ВК и СО
Пусть входной экземпляр VC будет ( V, E, к ) . Он представляет собой вопрос: «Учитывая граф ( V, E) , можно ли выбрать набор из не более чем К вершин из V , чтобы каждое ребро в E падало хотя бы на одну выбранную вершину?» Мы построим экземпляр (A,k′) CO, который представляет вопрос: «Учитывая матрицу A с элементами в {−1,0,1}, возможно ли переставить столбцы A , чтобы 1 появлялся перед -1 по крайней мере на k′ строках? "Эти две проблемы изложены в форме решения проблемы , при этом ответом на каждый является либо ДА, либо НЕТ: формально говоря , именно эта форма проблемы является NP-полной (или нет). Нетрудно понять, что более естественная проблема оптимизации форма изложенная в вопросе OP, примерно эквивалентна с точки зрения сложности: бинарный поиск на пороге Параметр может быть использован для решения задачи оптимизации с использованием решателя задачи решения, в то время как для решения проблемы решения достаточно одного вызова решателя задачи оптимизации, а затем одного сравнения.
Построение экземпляра CO из экземпляра VC
Пусть n=|V|и m=|E|, Мы построим матрицу A с (n+1)m+n строками и n+1 столбцами. Верхние (n+1)m строк будут состоять из m блоков по n+1 строк в каждом, причем каждый блок представляет ребро, которое необходимо покрыть . Нижний n строки содержат "флаги" вершин, которые приведут к тому, что столбец (соответствующий вершине) будет нести фиксированную стоимость, если он будет включен в левую часть решения CO (что соответствует вершине, включенной в покрытие вершин ВК решение).
Для каждой вершины vi создайте столбец, в котором:
- среди верхних (n+1)m строк j блок из n+1 строк содержит +1, когда ребро ej падает на vi , и 0 в противном случае, и
- все нижние n строк равны 0, за исключением i , который равен -1.
Создайте еще один столбец «забор», который состоит из (n+1)m копий -1, а затем n копий +1.
И, наконец, установить порог k′ для построенного экземпляра СО: (n+1)m+n−k . Другими словами, мы допускаем не более k строк, в которых -1 стоит перед +1. Давайте назовем это число нарушающих рядов «стоимостью» решения СО.
доказательство
Соответствие между решением экземпляра CO и набором вершин в исходном экземпляре VC: каждый столбец слева от ограждения соответствует вершине в наборе, а каждый столбец справа от ограждения соответствует вершина, которой нет.
n
kk
kk
k(n+1)m(n+1)uvAn+1n+1k≤n<n+1 : противоречие.
m(n+1)m(n+1)mnkkk
Наконец, ясно, что экземпляр CO может быть построен за полиномиальное время из экземпляра VC, что означает, что если бы существовал алгоритм полиномиального времени для решения CO, любой экземпляр VC также мог бы быть решен за полиномиальное время, сначала создав экземпляр CO, как описано выше, а затем решить его. Так как VC NP-жесткий, CO тоже.