Hallo July,
mir fallen da zwei Ansätze ein. Beim ersten bin ich mir nicht sicher, ob der in jedem Fall zu einem globalen Minimum führt, aber er sollte einfacher zu implementieren sein.
Für beide Ansätze kannst du vorher aber eine Bereinigung durchführen. Suche die Objekte heraus, die nur durch einen Parameter beschrieben werden. Diese Parameter werden in jedem Fall gebraucht. Entferne dann alle Objekte, die durch diese Parameter beschrieben werden. Das dient nur der Beschleunigung der Berechnung.
Ansatz 1
Merke dir zu jedem Parameter, welche Objekte durch ihn beschrieben werden. Suche dir den Parameter mit der größten Liste und übernimm diesen in die Ergebnisliste. Subtrahiere von allen verbleibenden Listen die Objekte aus der Liste des übernommenen Parameters. Sobald alle Listen leer sind, bist du fertig. Die Listen entsprechen dann den Objekten, die durch einen Parameter,aber von keinem schon übernommenen beschrieben werden.
Ansatz 2
Wir interpretieren das ganze als Graph. Die Knoten sind dabei alle Teilmengen der Objektmenge. Wir müssen nicht alle nutzen, sonst ergibt das ja eine exponentielle Zeit- und Platzkomplexität. Die Kanten sind gerichtet und beschreiben jeweils einen Parameter. Eine Kante P von Knoten M1 nach Knoten M2 bedeutet, dass M2 aus M1 durch Subtraktion aller durch P beschriebenen Objekte entsteht. Alle Kanten haben das Gewicht 1. Aufgabe ist es nun, den kürzesten Weg von Knoten mit der Objektmenge zum Knoten mit der leeren Menge zu finden. Dafür können bekannte Algorithmen (bspw. Dijkstra oder A*) verwendet werden. Für A* muss allerdings eine sinnvolle Heuristik gefunden werden. Eventuell kann man die Mächtigkeit der Knotenmengen verwenden.
Nico