Como minimizar a cardinalidade de um conjunto e partições disjuntas sujeitas a restrições no tempo polinomial?

8

O verdadeiro problema que estou enfrentando é o seguinte.

INSTANCE : tenho conjuntosN:={1,,n} e K:={1,,k} e matriz aij>0 para todos iK e jN.

PERGUNTA : preciso encontrar um subconjuntoS do N de tamanho o menor possível e particione o conjunto K para dentro |S| conjuntos disjuntos Kj cuja união é igual K tal que para todos jS, Eu tenho

jSjjaijaij1,
para todos os .iKj

Exemplo:

Dado e a matriz n=k=3

[0.62.71.21.32.60.81.50.40.6].

Neste exemplo, deve ser igual a S = \ {1, 2 \} e K_1 = \ {3 \} e K_2 = \ {1,2 \} .SS={1,2}K1={3}K2={1,2}

Notei dois fatos:

  • Se houver algum jN tal que aij1 para todos os iK então S={j} e Kj=K ; e
  • Se existir algum iK tal que aij<1 então S= .

Minha pergunta : É possível resolver esse problema de otimização em tempo polinomial (pelo menos com algoritmo de aproximação)?

A primeira coisa que tentei fazer foi transformá-lo em um problema conhecido e depois aplicar um algoritmo conhecido para isso. Pensei em transformá-lo em uma tampa ou caixa de embalagem, mas falhei e também não acho que isso seja interessante.


O problema que tentei formular.

I têm conjuntos e e matriz para todos os e . Além disso, eu tenho conjuntos disjuntos para cada (eu adicionei como entradas porque não poderia formulá-lo de outra forma.)N:={1,,n}K:={1,,k}aij>0iKjNnKjKjNKj

Por fim, recebo o seguinte:

minimizeS|S|subject tojSjjaijaij1,jS,iKj,SN.

Obrigado.

drzbir
fonte
Você tentou reformular como um ILP usando variáveis ​​binárias ? Seu objetivo muda para min com uma alteração semelhante na restrição. Um solucionador de ILP pronto para uso pode lidar perfeitamente com isso. xjxj
Nicholas Mancuso
Mas acho que isso não me daria um algoritmo de tempo polinomial?
drzbir
Talvez na teoria, mas não na prática. Os solucionadores modernos como o CPLEX são incrivelmente bons em encontrar soluções ótimas em um tempo relativamente curto, graças às ramificações e ramificações e outras heurísticas.
Nicholas Mancuso
O all ? Nesse caso, acho que a formulação do seu "problema real" tem um problema, já que é trivialmente otimizado, deixando ser qualquer conjunto de singleton : isso faz com que a soma no LHS da sua função objetivo seja 0 .aij1S{j}
j_random_hacker
Nem todos os são maiores que . aij1
drzbir

Respostas:

4

Mesmo a versão de decisão desse problema, na qual tentamos determinar simplesmente se existe alguma solução viável, é difícil de NP por redução do Exact Cover . (A versão de otimização, onde buscamos uma solução viável que minimize , é claramente pelo menos tão difícil quanto isso.)|S|

A matriz de linha única e coluna única contendo o valor 0,5 é um exemplo de entrada para a qual não há solução viável. Aqui está outro:

[0.243.1350.6].

Criando um gadget "Escolha no máximo um"

Primeiro, observe que, se o valor máximo em alguma linha for , e essa linha contiver (pelo menos) duas cópias de , digamos em e , , não pode conter e , pois se o fez, um dos dois casos a seguir deve surgir, cada um dos quais leva a uma contradição:aix>0xaijaijjjSjj

  1. iKjKj : suponha que wlog . Mas então , contradizendo o requisito que .iKjΣmS,mjaimaij=x=aijΣmS,mjaimaij1
  2. iKjKj : Suponha que . Mas então , e como é o máximo na linha , o mais alto que poderia ser é claramente , então devemos estar violando a mesma desigualdade de antes.iKp,p{j,j}ΣmS,mpaimaij+aij=2xxiaipx

Assim, podemos escolher um valor máximo que é seguramente maior do que a soma de todos os valores não-máximas na linha, e usar cópias deste valor máximo para impor que, no máximo, uma daquelas colunas está incluída no .S

Podemos transformar essa restrição "escolher no máximo uma" em uma restrição "escolher exatamente uma" usando qualquer valor positivo menor que 1 como o valor "não máximo". Isso porque cada linha pertence a alguma parte da partição de linha e, se , o RHS da desigualdade se torna negativo para a linha , portanto não há como satisfazê-la: portanto, pelo menos um deve ser forçado a modo que .iKjaij<1ijSaij1

Portanto, para garantir que exatamente uma das colunas em algum conjunto seja forçada em , crie uma linha seguinte maneira:TNSai

  • Conjunto para cada .aij=n+1jT
  • Defina para todos os outros .aij=0.5j

Assim, a redução da tampa exacta é simples: há uma linha para cada elemento, uma coluna para cada conjunto, com , sempre conjunto inclui elemento e contrário. Ambas as direções ("A instância EC de entrada é uma instância YES instância construída do problema do OP é uma instância YES" e "A instância construída do problema do OP é uma instância YES a instância EC de entrada é uma instância YES") são claros.aij=n+1jiaij=0.5

j_random_hacker
fonte
O exemplo você deu acho que tem uma solução de . 2×2S={2}
drzbir
Eu tenho e . Portanto, minha desigualdade é para . Porque a desigualdade deve ser válida para todos os . S={2}K2=K={1,2}0ai21iK2={1,2}iKj
drzbir
Você está certo, desculpe. Eu vou consertar agora.
Jrandom_hacker
Eu escrevi esse problema como programa inteiro e resolvi-o. Agora, preciso resolvê-lo com um algoritmo ganancioso (melhor, um algoritmo com desempenho garantido). Como você sugeriu, procurei capas exatas para encontrar idéias de como criar um bom algoritmo para isso. Você tem alguma ideia?
drzbir
É NP-difícil, então quase certamente não existe um algoritmo poli-tempo. Eu tentaria verificar todas as colunas únicas, todos os pares de colunas, todos os triplos etc. até encontrar um conjunto satisfatório. O subproblema que você precisa resolver para cada linha (ou seja, decidir qual elemento em escolher para essa linha) é fácil. S
Jrandom_hacker