Me deparei com esse problema e estou lutando para encontrar uma maneira de abordá-lo. Qualquer pensamento seria muito apreciado!
Suponha que recebamos uma matriz , por exemplo,
Sem tentar todas as permutações, encontre uma ordem das colunas que maximize o número de linhas para as quais o primeiro elemento diferente de zero é 1 .
Para o exemplo acima, uma dessas ordens (não é exclusiva!) É , ou seja,
Aqui, para de linhas, o primeiro elemento diferente de zero é .
Respostas:
Esse problema, que chamarei de CO para ordenação de colunas, é difícil para NP . Aqui está uma redução do problema NP-difícil Vertex Cover (VC) para ele:
Formulários de problemas de decisão de VC e CO
Deixe a instância do VC de entrada ser(V,E,k) . Ele representa a pergunta: "Dado o gráfico (V,E) , é possível escolher um conjunto de no máximo k vértices de V modo que toda aresta em E incida em pelo menos um vértice escolhido?" Construiremos uma instância (A,k′) de CO que representa a pergunta: "Dada a matriz A com elementos em {−1,0,1} , é possível permutar as colunas de A modo que um 1 apareça antes de -1 em pelo menos k′ linhas? "Esses dois problemas são apresentados na forma de problemas de decisão , em que a resposta para cada um é SIM ou NÃO: formalmente falando , é essa forma de problema que é NP-completa (ou não). Não é muito difícil perceber que a forma mais natural de problema de otimização indicada na pergunta do OP é aproximadamente equivalente em termos de complexidade: pesquisa binária no limiar O parâmetro pode ser usado para resolver o problema de otimização usando um solucionador de problemas de decisão, enquanto uma única chamada de um solucionador de problemas de otimização, seguida por uma comparação única, é suficiente para resolver o problema de decisão.
Construindo uma instância de CO a partir de uma instância de VC
Sejan=|V| e m=|E| . Vamos construir uma matriz A com (n+1)m+n linhas e n+1 colunas. As linhas superiores (n+1)m serão formadas por m blocos de n+1 linhas cada, com cada bloco representando uma aresta que precisa ser coberta . O fundo n linhas contêm "sinalizadores" de vértice, o que fará com que uma coluna (correspondente a um vértice) incorra em um custo fixo se for incluída no lado esquerdo da solução de CO (correspondente a um vértice sendo incluído na capa de vértice da Solução VC).
Para cada vérticevi , crie uma coluna na qual:
Crie mais uma coluna "cerca" que consiste em(n+1)m cópias de -1, seguidas por n cópias de +1.
Por fim, defina o limitek′ para a instância de CO construída: (n+1)m+n−k . Em outras palavras, permitimos no máximo k linhas nas quais um -1 aparece antes de um +1. Vamos chamar esse número de linhas violadas de "custo" de uma solução de CO.
Prova
A correspondência entre uma solução para a instância CO e um conjunto de vértices na instância VC original é: Cada coluna à esquerda da cerca corresponde a um vértice que está no conjunto e cada coluna à direita da cerca corresponde a um vértice que não é.
Intuitivamente, os -1s na parte superior da coluna "cerca" forçam a seleção de um subconjunto de colunas a serem colocadas à esquerda, que juntas contêm + 1s em todas essas posições - correspondendo a um subconjunto de vértices que ocorrem em todos os Beira. Cada uma dessas colunas que aparece à esquerda da "cerca" tem -1 em uma linha distinta em algum lugar nasn linhas inferiores , incorrendo em um custo de 1; os + 1s na parte inferior da "cerca" garantem que todas as colunas colocadas à sua direita não ocorram esse custo.
Claramente, uma solução de VC usando no máximok vértices produz uma solução para a instância de CO construída com custo no máximo k : basta ordenar que as colunas correspondentes aos vértices no vértice cubram arbitrariamente, seguidas pela coluna fence, seguida por todas as colunas restantes em qualquer ordem .
Resta mostrar que uma solução para a instância de CO com custo no máximok corresponde a uma cobertura de vértice com no máximo k vértices.
Suponha que, ao contrário, exista uma solução para a instância de CO com custo no máximok que deixe alguma linha nas linhas superiores (n+1)m com -1 antes de +1. Esta linha pertence a um bloco de (n+1) linhas correspondentes a uma aresta específica uv . Cada linha neste bloco na instância original A é idêntica por construção; colunas permutadoras podem alterar essas linhas, mas não afetam o fato de serem idênticas. Assim, cada uma dessas n+1 linhas idênticas tem -1 antes de +1 na solução, implicando um custo de pelo menosn+1 . Mask≤n<n+1 : contradição.
Como cada um dosm blocos de linhas nas linhas superiores (n+1)m tem +1 antes de -1, cada uma das arestas correspondentes é coberta por um vértice correspondente a uma coluna à esquerda da cerca: isto é , esse subconjunto de vértices constitui uma cobertura de vértice. Como nenhuma das linhas superiores (n+1)m tem -1 antes de +1, o único local em que o custo pode acumular-se na solução é nas n linhas inferiores , das colunas colocadas à esquerda da cerca. Cada uma dessas colunas custou exatamente 1, portanto, dado que o custo é no máximo k , deve haver no máximo k colunas e, portanto, no máximo k vértices na capa.
Finalmente, é claro que a instância CO pode ser construída em tempo polinomial a partir da instância VC, o que significa que, se um algoritmo de tempo polinomial existisse para resolver CO, qualquer instância VC também poderia ser resolvida em tempo polinomial construindo primeiro uma instância CO, conforme descrito acima e depois resolvê-lo. Como VC é NP-difícil, CO também é.
fonte
Não sei se existe realmente uma solução polinomial. No entanto, com base no comentário de Pål GD, você pode criar uma função de simplificação. A matriz inicial é simplificated como a construir a sequência de saídaS .
Então você deve fazer uma exploração completa da combinatória usando iterativamente a seleção de função:
Depois de cada escolha, você pode fazer uma simplificação para reduzir o número de possibilidades a explorar. Sugiro explorar avidamente começando com a coluna com menos -1, assim você pode alcançar um limite inferior, fazendo um critério de parada.
No exemplo dado, a primeira simplificação fornece (como Pål GD explicou no comentário)
No entanto, a simplificação ainda poupa cerca de metade das etapas de exploração. E esse tipo de matriz pode ser dividido em várias sub-matrizes independentes.
fonte