Uma abordagem para resolver esse problema seria usar a programação linear inteira (ILP). Vamos abordar a versão de decisão do problema: dado , existe uma maneira de contratar vértices da mesma cor para obter um DAG de tamanho ≤ k ?k≤k
Isso pode ser expresso como uma instância de ILP usando técnicas padrão. Recebemos a cor de cada vértice no gráfico original. Sugiro que rotulemos cada vértice com um rótulo em ; todos os vértices com a mesma etiqueta e a mesma cor serão contratados. Portanto, o problema de decisão se torna: existe uma rotulagem, de modo que a contratação de todos os vértices da mesma cor da mesma etiqueta produza um DAG?{1,2,…,k}
Para expressar isso como um programa linear inteiro, introduza uma variável inteira para cada vértice v , para representar o rótulo no vértice v . Adicione a desigualdade 1 ≤ ℓ v ≤ k .ℓvvv1≤ℓv≤k
A próxima etapa é expressar o requisito de que o gráfico contratado deve ser um DAG. Observe que, se houver uma rotulagem do formulário listado acima, sem perda de generalidade, existe uma rotulagem em que os rótulos induzem uma classificação topológica no gráfico contratado (ou seja, se precede w no gráfico contratado, o rótulo de v é menor que o rótulo de w ). Portanto, para cada aresta v → w no gráfico original, adicionaremos a restrição de que v e w têm a mesma etiqueta e a mesma cor, ou então o rótulo de v é menor que o rótulo de w . Especificamente, para cada aresta vvwvwv→wvwvw no gráfico inicial em que v , w tem a mesma cor, adicione a desigualdade ℓ v ≤ ℓ w . Para cada aresta v → w onde v , w tem cores diferentes, adicione a desigualdade ℓ v < ℓ w .v→wv,wℓv≤ℓwv→wv,wℓv<ℓw
Agora veja se existe alguma solução viável para esse programa linear inteiro. Haverá uma solução viável se, e somente se, a etiqueta tiver a forma desejada (por exemplo, a contratação de todos os vértices da mesma etiqueta da mesma cor produz um DAG). Em outras palavras, haverá uma solução viável se, e somente se, houver uma maneira de contratar o gráfico original para um DAG de tamanho . Podemos usar qualquer solucionador de programação linear inteiro; se o solucionador de ILP nos der uma resposta, temos uma resposta para o problema de decisão original.≤k
Obviamente, isso não garante que seja concluído em tempo polinomial. Não há garantias. No entanto, os solucionadores de ILP ficaram muito bons. Eu esperaria que, para um gráfico de tamanho razoável, você tenha uma chance decente de que um solucionador de ILP possa resolver esse problema em um período de tempo razoável.
Também é possível codificar isso como uma instância SAT e usar um solucionador SAT. Não sei se isso seria mais eficaz. A versão do ILP é provavelmente mais fácil de se pensar.
(Espero que esteja certo. Não verifiquei todos os detalhes com cuidado; portanto, verifique novamente meu raciocínio! Espero não ter dado errado em algum lugar.)
Atualização (21/10): Parece que os ILPs deste formulário podem ser resolvidos em tempo linear, processando o DAG em ordem topológica e mantendo o controle do limite inferior no rótulo de cada vértice. Isso me desconfia da minha solução: cometi um erro em algum lugar?