2010-11-26 10 views
1

Dans le problème Set Covering, on nous donne un univers U, tel que | U | = n, et les ensembles S1, ......, Sk sont des sous-ensembles de U. Une couverture d'ensemble est une collection C de certains des ensembles de S1, ......, Sk dont l'union est l'univers entier U.un algorithme pour trouver la couverture de jeu de taille minimum pour le problème Set-cover

J'essaie de trouver un algorithme qui va trouver le nombre minimum de mettre en couverture pour que je puisse montrer que l'algorithme glouton pour la couverture de l'ensemble trouve parfois plus de sets.

Voici ce que je suis venu avec:

répétition pour chaque ensemble. 1. Couvrir < -Seti (i = 1 ,,, n) 2. Si un ensemble n'est pas un sous-ensemble d'autres ensembles, alors prenez ce jeu en couverture.

mais cela ne fonctionne pas dans certains cas. S'il vous plaît aidez-moi à trouver un algorithme pour trouver la couverture minimale.

Je rencontre toujours des problèmes pour trouver cet algorithme en ligne. Quelqu'un a une suggestion?

+1

Um. L'algorithme glouton ne trouve pas toujours plus de jeux. Par exemple dans le cas trivial où les sous-ensembles sont tous disjoints, il trouve exactement le minimum, c'est-à-dire tous. –

+0

Vous avez raison. J'ai corrigé ma question. – sap

+0

mais avez-vous des suggestions sur la façon de trouver un algorithme qui trouvera toujours le nombre minimum de jeux?Merci – sap

Répondre

6

La couverture de l'ensemble est NP-difficile, il est donc peu probable qu'il y ait un algorithme beaucoup plus efficace que de regarder toutes les combinaisons d'ensembles possibles et de vérifier si chaque combinaison est une couverture.

Fondamentalement, regardez toutes les combinaisons de 1 jeu, puis 2 jeux, etc. jusqu'à ce qu'ils forment un couvercle.

EDIT

Voici un exemple pseudocode. Notez que je ne prétends pas que c'est efficace. Je demande simplement qu'il n'y a pas un algorithme beaucoup plus efficace (algorithmes sera pire que le temps polynomiale à moins que quelque chose vraiment cool est découvert)

for size in 1..|S|: 
    for C in combination(S, size): 
      if (union(C) == U) return C 

combination(K, n) retourne tous les ensembles possibles de taille n dont les éléments proviennent de K.

EDIT

Cependant, je ne suis pas trop sûr pourquoi vous avez besoin d'un algorithme pour trouver le minimum. Dans la question, vous indiquez que vous voulez montrer que l'algorithme glouton pour la couverture d'ensemble trouve parfois plus de jeux. Mais ceci est facilement réalisé via un contre-exemple (et un contre-exemple est montré dans l'entrée wikipedia pour la couverture du set). Donc je suis assez perplexe.

EDIT

Une mise en œuvre possible de combination(K, n) est:

if n == 0: return [{}] //a list containing an empty set 
r = [] 
for k in K: 
    K = K \ {k} // remove k from K. 
    for s in combination(K, n-1): 
     r.append(union({k}, s)) 
return r 

Mais en combinaison avec le problème de la couverture, on veut probablement effectuer le test de la couverture du boîtier de base n == 0 à la place. Bien.

+0

Je ne suis pas sûr de ce que vous voulez dire. Pouvez-vous s'il vous plaît me montrer le pseudo code. Merci beaucoup d'avance. – sap

+0

parce que j'ai écrit un programme qui utilise alg avide. pour trouver la min-couverture et je voulais juste écrire un autre programme qui trouve min-couverture sans méthode gourmande mais pas tellement efficace – sap

+0

Toujours ne comprends pas. Quel est l'objectif? Est-ce pour montrer que l'algorithme glouton n'obtient pas toujours la couverture minimale? – lijie

Questions connexes