У меня есть двоичная матрица n * m (0 и 1). Проблема состоит в том, чтобы покрыть все единицы неперекрывающимися блоками, все элементы которых равны 1.
Примере:
1111
0110
0110
Блок может быть представлен с координатами и длиной в каждой координате (x,y,lx,ly)
. Этот пример покрыт двумя полями { (0,0,1,4), (1,1,2,2) }
.
Ищу, как найти укрытие с минимальным количеством ящиков.
Благодарность
2 ответа
Эта задача называется разбиением прямолинейного многогранника. Есть хороший ответ < / a> на аналогичный вопрос biziclop разместил в комментарии.
Идея алгоритма состоит в том, чтобы свести задачу к максимальному согласованию двудольного графа (вершины - это возможные разрезы).
3D
Моя первоначальная проблема была в той же теме в 3D. Показано, что эта версия NP-полная: - /
После некоторого исследования я реализовал решение, основанное на эвристике, описанной в статьях Ануджа Джайна:
Моя проблемная область - вычислительная химия, и здесь мы решаем огромные многомерные задачи. Здесь могут быть применены два общих алгоритма глобальной оптимизации, которые также были успешно применены к системам, содержащим десятки тысяч атомов:
А) генетические алгоритмы
http://en.wikipedia.org/wiki/Genetic_algorithm
Б) имитация отжига
http://www.gnu.org/software/gsl/
ftp://ftp.alumni.caltech.edu/pub/ingber
http://www.taygeta.com/annealing/simanneal.html
http://www2.cs.uni-paderborn.de/ cs / ag-monien / ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ / PARSA /
http://www.codeproject.com/KB/recipes/SimulatedAnnealing.aspx
Оба алгоритма имеют хорошо зарекомендовавшие себя реализации, являющиеся общественным достоянием, и хорошо изученные свойства оптимальности.
Похожие вопросы
Новые вопросы
algorithm
Алгоритм - это последовательность четко определенных шагов, которые определяют абстрактное решение проблемы. Используйте этот тег, если ваша проблема связана с дизайном алгоритма.