Supposons que j'ai un poset "S" et un prédicat monotone "P" sur S. Je veux trouver un ou tous les éléments maximaux de S satisfaisant P.
EDIT : Je suis intéressé à minimiser le nombre d' évaluations de P .
Quels algorithmes existent pour ce problème et quelles propriétés et opérations supplémentaires nécessitent-ils sur S?
Qu'en est-il des cas spéciaux importants, tels que:
- S est un ordre linéaire - alors la recherche binaire régulière fonctionne, tant que vous avez une opération "find middle"
- S est un réseau
- S est un réseau de sous-ensembles
- S est un réseau multiset
- ...
Les deux derniers cas semblent particulièrement importants, par exemple pour la conception d'expériences - vous avez un ensemble de paramètres booléens ou réels, et vous souhaitez en trouver la plus petite combinaison possible qui reproduise un modèle particulier (par exemple un test qui échoue).
Réponses:
Je n'y ai pas beaucoup réfléchi, alors corrigez-moi si je me trompe.
Disons que est la largeur du poset.w
Pour le poset qui est l'union de chaînes disjointes, vous avez besoin d'au moins évaluations de en appliquant simplement la borne inférieure standard sur la complexité des requêtes de recherche binaire à chaque chaîne.w log n Pw wlogn P
Puisque vous donnez des comparaisons gratuitement, vous pouvez calculer une décomposition en chaîne du poset en chaînes gratuitement. Faites une recherche binaire sur chaque chaîne pour identifier le premier élément qui satisfait . Passez ensuite en revue les éléments identifiés et supprimez ceux qui sont dominés. Le nombre d'évaluations de est . Ceci identifie tous les éléments maximaux, car il peut y avoir au plus un élément maximal par chaîne.P P O ( w log n )w P P O(wlogn)
AJOUT: En fait, je vois un algorithme récursif simple pour faire beaucoup mieux ( ) pour le réseau de sous-ensembles ( EDIT : domotor a décrit la stratégie générale dans sa réponse). Ici, je suppose que est monotone vers le bas (c'est-à-dire que les sous-ensembles forment un ensemble inférieur), ce qui est, je pense, ce que vous voulez dire. Voici donc l'algorithme pour trouver un membre de l'ensemble inférieur:2 [ n ] P { X : P ( X ) = 1 }O(n) 2[n] P {X:P(X)=1}
a) Testez . Si 0, arrêtez.P(∅)
b) Testez .P({n})
bi) Si 0, répétez sur (OK, car aucun ensemble contenant ne peut être dans l'ensemble inférieur). n2[n−1] n
b.ii) Si 1, alors il existe un membre de l'ensemble inférieur dans le sous-réseau . Ce sous-réseau est isomorphe à donc encore une fois, nous pouvons recurse. Plus précisément, nous pouvons exécuter l'algorithme pour , mais lorsque l'algorithme demande d'évaluer , nous évaluons où .{X:n∈X} 2[n−1] 2[n−1] P(Y) P(X) X=Y∪{n}
Donc, à chaque étape, nous recursons sur un sous-réseau qui est la moitié de la taille de celui d'origine. Dans l'ensemble, nous devons évaluer au plus fois (en fait, vous pouvez implémenter l'algorithme pour évaluer le prédicat fois comme le souligne Yoshio, car vous n'avez besoin de vérifier qu'une seule fois).2 n n + 1 ∅P 2n n+1 ∅
la source
Si est un arbre, il existe alors un algorithme polynomial qui construit un arbre de décision optimal.P
Généralisation de la recherche binaire: recherche dans les arbres et les ordres partiels de type forêt
la source
Un article récent de Daskalakis et al montre que pour un poset de taille et de largeur w , des éléments minimaux peuvent être trouvés dans le temps O ( w n ) . Ce qui est intéressant, c'est que dans leur résumé, ils disentn w O(wn)
la source
Si S fait partie de l'entrée, alors le problème de trouver un élément maximal devient déjà `` NP-dur '' (si nous pensons au réseau de telle sorte que ses éléments sont des chaînes longues de n bits), par exemple, vous pouvez dire si CNF (x) n'est pas vrai et CNF (y) est vrai pour certains CNF fixes.x<y
De plus, il pourrait y avoir de nombreux éléments maximaux satisfaisant P, donc même pour les produire tous, cela pourrait prendre beaucoup de temps, donc je pense qu'il n'y a qu'un espoir de trouver un maximal.
En général, la recherche binaire fonctionne si vous pouvez sélectionner de manière récursive des éléments tels qu'après vous être laissé avec les éléments ci-dessus, ou les éléments ci-dessus soient supprimés, et dans chacun de ces ensembles, un rapport fixe des éléments est supprimé.
Par exemple. si S est une grille dimensionnelle fixe, alors il y a un algorithme rapide: Toujours diviser par deux une coordonnée tout en gardant les autres minimales, alors demandez par exemple dans la première étape (n / 2,0, ..., 0).
la source
la source