Я столкнулся с этой проблемой и изо всех сил пытаюсь найти способ приблизиться к ней. Любые мысли будут с благодарностью!
Предположим, нам дана матрица , например,
Не пробуя каждую перестановку, найдите порядок столбцов который максимизирует количество строк, для которых первый ненулевой элемент равен .
Для приведенного выше примера один такой порядок (он не уникален!) Является , т.е.
Здесь для из строк первый ненулевой элемент равен .
Ответы:
Эта проблема, которую я буду называть 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 копий -1, а затем n копий +1.
И, наконец, установить порогk′ для построенного экземпляра СО: (n+1)m+n−k . Другими словами, мы допускаем не более k строк, в которых -1 стоит перед +1. Давайте назовем это число нарушающих рядов «стоимостью» решения СО.
доказательство
Соответствие между решением экземпляра CO и набором вершин в исходном экземпляре VC: каждый столбец слева от ограждения соответствует вершине в наборе, а каждый столбец справа от ограждения соответствует вершина, которой нет.
Наконец, ясно, что экземпляр CO может быть построен за полиномиальное время из экземпляра VC, что означает, что если бы существовал алгоритм полиномиального времени для решения CO, любой экземпляр VC также мог бы быть решен за полиномиальное время, сначала создав экземпляр CO, как описано выше, а затем решить его. Так как VC NP-жесткий, CO тоже.
источник
Затем вы должны выполнить полное исследование комбинаторики, используя итеративный выбор функции:
После каждого выбора вы можете сделать упрощение, чтобы уменьшить количество возможностей для изучения. Я предлагаю исследовать жадно, начиная со столбца с меньшим -1, поэтому вы можете достичь нижней границы, делая критерий остановки.
На приведенном примере первое упрощение дает (как пояснил в комментарии Пол Г.Д.)
Я думаю, что матрица, делающая этот метод довольно неэффективным, будет иметь ровно один 1 и один -1 на строку / столбец, что-то вроде⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢−1100001−1000000−1100001−1000000−1100001−1⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥
Тем не менее, упрощение все еще экономит около половины этапов разведки. И этот тип матрицы может быть разбит на несколько независимых субматриц.
источник