Nehmen wir an, wir haben 10 Leute mit jeweils einer Liste von Lieblingsbüchern. Für eine bestimmte Person X möchte ich eine spezielle Untergruppe von Xs Büchern finden, die nur von X gemocht werden, dh es gibt keine andere Person, die alle Bücher in Xs spezieller Untergruppe mag. Ich betrachte diese spezielle Untergruppe als einen einzigartigen "Fingerabdruck" für X.
Ich würde mich über Vorschläge für einen Ansatz zur Suche nach solchen Sets freuen. (Während dies wie ein Hausaufgabenproblem liest, hängt es mit einem Problem in meiner Biologieforschung zusammen, das ich zu lösen versuche.)
algorithms
sets
edron79
quelle
quelle
Antworten:
Ich gehe davon aus, dass der Fingerabdruck so klein wie möglich sein soll. Dann ist dies das Hitting Set- Problem: Erstellen Sie für jede Person eine Liste aller Bücher, die X gefallen, aber nicht dieser Person. Ziel ist es dann, mindestens ein Buch aus jeder Liste auszuwählen. Das Problem ist NP-schwer, daher können Sie nicht erwarten, einen Algorithmus zu finden, der es in der Polynomzeit immer optimal löst. Der gierige Algorithmus hat eine schlechte theoretische Worst-Case-Grenze, funktioniert aber in der Praxis oft recht anständig. Wenn Sie es optimal lösen möchten, sollte ein Integer Linear Programming Solver in der Lage sein, Instanzen von bis zu 1000 oder vielleicht 10000 Büchern zu lösen. Wenn Sie mehr Details zur Größe und Struktur Ihrer Instanzen angeben, können wir andere Ansätze vorschlagen.
quelle
Dies ist kein besonders cleverer Algorithmus, aber er ist polynomisch und ich denke, er sollte funktionieren. Nimm ein beliebiges Set. Zählen Sie für jedes Element in dieser Menge die Anzahl der verbleibenden Mengen, die es nicht enthalten, und merken Sie sich, welche Mengen es enthalten. Wählen Sie das Element mit der höchsten Anzahl aus und wiederholen Sie die Anzahl der verbleibenden Elemente. Ignorieren Sie dabei die Mengen, denen das gerade ausgewählte Element fehlt. Fahren Sie fort, bis alle verbleibenden Sätze nicht mehr berücksichtigt wurden.
Ich habe nicht viel darüber nachgedacht, aber intuitiv scheint es, als sollte es funktionieren. Die Idee ist, gierig als nächstes Element des Fingerabdrucksatzes den Gegenstand zu nehmen, der die am meisten ungedeckten Sätze abdeckt.
quelle
fingerprint books
Lassen Sie mich am Python-Code demonstrieren:
Der Code druckt:
quelle
Dies ist das OP (wurde bei der ersten Einreichung nicht registriert, daher kann ich jetzt nicht richtig kommentieren). Vielen Dank für das Feedback - die ursprüngliche gierige Algorithmuslösung hat mich in die richtige Richtung gebracht. Der gesamte Speicherplatz, an dem ich arbeite, betrifft Hunderte von Einzelpersonen und Tausende von "Büchern". Wenn dies mit dem ganzzahligen Programmieransatz möglich ist, würde ich gerne mehr darüber erfahren.
quelle