Я ищу здесь несколько указателей, поскольку я не совсем знаю, с чего начать исследование этого.Сортировка бинарной 2D-матрицы?
У меня есть 2D матрицу с 0 или 1 в каждой ячейке, например:
1 2 3 4
A 0 1 1 0
B 1 1 1 0
C 0 1 0 0
D 1 1 0 0
И я хотел бы, чтобы отсортировать его так, как «верхний треугольный», насколько это возможно, например, так:
4 3 1 2
B 0 1 1 1
A 0 1 0 1
D 0 0 1 1
C 0 0 0 1
Строки и столбцы должны оставаться неповрежденными, т.е. элементы нельзя перемещать индивидуально и их можно заменить только «целыми».
Я понимаю, что там, вероятно, будет патологические случаи, когда матрица имеет несколько возможных отсортированных результатов (то есть ту же самую форму, но различаются по идентичности «первоначальных» строк/столбцов.)
Так, может кто-нибудь подскажите, где я могу найти некоторые отправные точки для этого? Существующая библиотека/алгоритм будет замечательной, но я соглашусь узнать имя проблемы, которую я пытаюсь решить!
Я сомневаюсь, что это проблема линейной алгебры как таковая, и, возможно, есть какая-то техника обработки изображений, которая применима.
Любые другие идеи в сторону, мое первоначальное предположение просто написать простой вставки сортировку строк, то столбцы и перебирать, что до тех пор, пока не стабилизируется (и надеемся, что обнаружение патологических случаев не слишком сложно.)
Подробнее: Дополнительная информация о том, что я пытаюсь сделать, может помочь прояснить. Каждая строка представляет участника, каждый столбец представляет собой вызов. Каждый 1 или 0 представляет «успех» для участника по конкретной задаче.
Сортируя матрицу так, чтобы все 1s находились в правом верхнем углу, я надеюсь затем предоставить рейтинг внутренней сложности каждой задачи и ранжирования конкурентов (что будет учитывать сложность проблем, которые они испытывают удалось добиться успеха не только по количеству успехов.)
Замечание об принятом ответе: Я принял Имитированный отжиг как «ответ» с предостережением о том, что этот вопрос не имеет правильного ответа. Это похоже на хороший подход, хотя на самом деле мне не удалось найти функцию подсчета очков, которая работает для моей проблемы.
Вопросы: (1) Обратите внимание, что нет ничего, что вы можете сделать с матрицей всех 1s: Вы хорошо с этим? (2) Как только нет нулей ниже диагонали, вам небезразлично, где 1s находятся выше диагонали? (3) Минимизирует число 1s ниже диагонали достаточно хорошего критерия? Как просто минимизировать количество строк, которые имеют (по крайней мере) 1 ниже диагонали? – ShreevatsaR
Ответ 1) Да, все нули или все-одни никогда не произойдут, и если они это сделают, они по определению все будут считаться эквивалентными, поэтому их сортировка в какую-то другую перестановку не будет проблемой. – Tom
Ответ 2 + 3) Да, я хочу, чтобы 1s был как можно ближе к верхней части каждого столбца, т. Е. Как можно больше 1s в верхнем правом углу. Обратите внимание, что под диагональю может быть 1s и 0s над ней, это не строго треугольная матрица. – Tom