Heim > Backend-Entwicklung > C++ > Teilmengengleichheit ist NP-vollständig

Teilmengengleichheit ist NP-vollständig

王林
Freigeben: 2023-08-28 23:41:06
nach vorne
1458 Leute haben es durchsucht

Teilmengengleichheit ist NP-vollständig

Teilmengenkorrespondenz, auch als „Teilmengengesamtproblem“ bekannt, ist ein beispielhaftes NP-vollständiges Rechenproblem. Bei einer gegebenen Menge von Zahlen und einem objektiven Wert besteht die Aufgabe darin, zu bestimmen, ob es eine Teilmenge von Zahlen gibt, deren Gesamtzahl dem objektiven Wert entspricht. Die NP-Kapazität dieses Problems ergibt sich aus seiner Fähigkeit, eine Vielzahl anderer NP-vollständiger Probleme durch Polynomialzeitreduktion zu lösen. Unabhängig von der einfachen Definition gibt es keine effiziente Berechnung, die die „Teilmengenkorrespondenz“ aller Ereignisse lösen kann, weshalb sie für die hypothetische Softwareentwicklung und -vereinfachung sowie in verschiedenen Bereichen (z. B. Kryptographie, Asset-Allokation und dynamische Probleme) von großer Bedeutung ist. mit funktionalen Anwendungen.

Anwendungsmethode

  • Reduzierung der Teilmengensumme

  • Reduziert von 3SAT

Von der Teilmengensumme reduzieren

Eine Möglichkeit, damit umzugehen, dass „Teilmengengerechtigkeit“ ein NP-vollständiges Problem ist, besteht darin, eine signifikante Reduzierung des NP-vollständigen Problems (des „Gesamtzahl-von-Teilmengen“-Problems) zu zeigen.

Algorithmus

  • Bei einem Fall des Problems „Teilmengenaggregation“ handelt es sich um eine Reihe ganzer Zahlen S und ein Ziel mit dem Wert T.

  • Verwenden Sie einen ähnlichen Satz S und das Zielselbstwertgefühl 2T, um einen weiteren Fall des „Teilmengen-Gerechtigkeitsproblems“ darzustellen.

  • Wenn es eine Teilmenge von S gibt, die im Problem der „Teilmengenaggregation“ als T zusammengefasst wird, dann gibt es zu diesem Zeitpunkt eine Teilmenge 2T, die im Problem der „Teilmengeneinheitlichkeit“ als T zusammengefasst wird, indem Teilmengen hinzugefügt werden, die ähnlich sind sich selbst.

  • Unter der Annahme, dass es keine Teilmenge von S gibt, die sich im „Teilmengen-Gesamt“-Problem zu T zusammenfassen lässt, dann gibt es keine Teilmenge, die sich im „Teilmengen-Gesamtproblem“ zu 2T zusammenfassen lässt, weil jede Teilmenge mit einer Gesamtsumme unter der Summe von 2T liegt und selbst darf 2T nicht überschreiten.

  • Dieser Rückgang zeigt, dass die Lösung des „Teilmengen-Fairness“-Problems fast genauso schwierig ist wie die Lösung des „Teilmengen-Aggregations“-Problems, was es zu einem NP-vollständigen Problem macht.

Beispiel

#include <iostream>
#include <vector>
using namespace std;

bool isSubsetSum(vector<int>& set, int n, int sum) {
   if (sum == 0) return true;
   if (n == 0) return false;

   if (set[n - 1] > sum) return isSubsetSum(set, n - 1, sum);

   return isSubsetSum(set, n - 1, sum) || isSubsetSum(set, n - 1, sum - set[n - 1]);
}

bool isSubsetAggregateReduction(vector<int>& set, int n, int sum) {
   return !isSubsetSum(set, n, sum) && !isSubsetSum(set, n, 2 * sum);
}

int main() {
   vector<int> set = {3, 34, 4, 12, 5, 2};
   int sum = 18; 
   if (isSubsetAggregateReduction(set, set.size(), sum)) {
      cout << "No subset exists in Subset Aggregate issue that sums to " << sum << " and no subset exists that sums to " << 2 * sum << " by adding the same subset with itself." << endl;
   } else {
      cout << "There exists a subset in Subset Aggregate issue that sums to " << sum << " or a subset in Subset Equity issue that sums to " << 2 * sum << " by adding the same subset with itself." << endl;
   }

   return 0;
}
Nach dem Login kopieren

Ausgabe

There exists a subset in Subset Aggregate issue that sums to 18 or a subset in Subset Equity issue that sums to 36 by adding the same subset with itself.
Nach dem Login kopieren

Von 3SAT reduziert

Eine andere Möglichkeit besteht darin, zu beweisen, dass die „Teilmengenkorrespondenz“ NP-vollständig ist, indem man sie direkt von einem bekannten NP-vollständigen Problem (z. B. dem 3SAT-Problem) subtrahiert.

Algorithmus

  • gibt ein Beispiel für eine 3SAT-Frage, die eine boolesche Formel in einer gemeinsamen gewöhnlichen Struktur mit drei Literalen pro Bedingung enthält.

  • Lassen Sie uns das Problem der „Teilmengeneinheitlichkeit“ noch einmal mit einer Reihe von Ganzzahlen und Zielwerten besprechen, wie folgt:

  • a.Erstellen Sie für jede Variable in der 3SAT-Gleichung eine Zahl mit dem Wert 1 im Satz.

    b. Generieren Sie für jede zusätzliche Bedingung in der 3SAT-Gleichung eine Zahl mit dem Wert 2 im Satz.

    c. Setzen Sie den Zielwert auf die volle Menge aller Zusatzbedingungen und aller Faktoren im 3SAT-Rezept.

  • Wenn das 3SAT-Schema erfüllt werden kann, gibt es im Problem der „Teilmengenhomogenität“ eine Teilmenge, die den Zielwert zusammenfasst, indem für jede erfüllte Bedingung eine Variable ausgewählt wird.

  • Wenn die 3SAT-Formel nicht erfüllt werden kann, kann keine Teilmenge im Problem der „Teilmengenkorrespondenz“ auf den Zielwert verallgemeinert werden, da jede zulässige Teilmenge nicht weniger als eine Ganzzahl mit dem Wert 2 enthalten darf, die der erfüllten Klausel zugeordnet ist.

  • Da bekannt ist, dass das 3SAT-Problem NP-vollständig ist, zeigt dieser Rückgang den NP-Höhepunkt der „Teilmengengerechtigkeit“ an.

Beispiel

#include <iostream>
#include <vector>
using namespace std;

bool ThreeSAT_Satisfiable(const vector<vector<int>>& clauses) {
   return false;
}

class SubsetUniformity {
private:
   vector<int> numbers;
   int targetValue;

public:
   SubsetUniformity(const vector<int>& vars, const vector<int>& clauses) {
      for (int v : vars) {
         numbers.push_back(1);
      }
      for (int c : clauses) {
         numbers.push_back(2);
      }
      targetValue = vars.size() + clauses.size();
   }

   bool isSubsetSumPossible(int idx, int sum) {
      if (sum == targetValue) {
         return true;
      }
      if (idx >= numbers.size() || sum > targetValue) {
         return false;
      }
      return isSubsetSumPossible(idx + 1, sum) || isSubsetSumPossible(idx + 1, sum + numbers[idx]);
   }

   bool hasSolution() {
      return isSubsetSumPossible(0, 0);
   }
};

int main() {
   vector<vector<int>> clauses = {
      {1, 2, -3},
      {-1, -2, 3},
      {-1, 2, 3}
   };

   bool isSatisfiable = ThreeSAT_Satisfiable(clauses);
   SubsetUniformity su(clauses[0], clauses[1]);

   cout << "3SAT Formula is " << (isSatisfiable ? "satisfiable." : "not satisfiable.") << endl;
   cout << "Subset Uniformity has " << (su.hasSolution() ? "a" : "no") << " solution." << endl;

   return 0;
}
Nach dem Login kopieren

Ausgabe

3SAT Formula is not satisfiable.
Subset Uniformity has a solution.
Nach dem Login kopieren

Fazit

Beide Ansätze zeigen, dass das Problem „Teilmengengleichheit“ oder „Teilmengenaggregation“ NP-vollständig ist, sodass es unmöglich ist, effiziente Berechnungen zur Lösung des Problems für alle Beispiele zu verfolgen. Wissenschaftler nutzen häufig dynamische Programmierung oder andere Schätzverfahren, um mögliche Szenarien für dieses Problem effizient zu lösen.

Das obige ist der detaillierte Inhalt vonTeilmengengleichheit ist NP-vollständig. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:tutorialspoint.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage