Maison  >  Article  >  développement back-end  >  L'égalité des sous-ensembles est NP-complète

L'égalité des sous-ensembles est NP-complète

王林
王林avant
2023-08-28 23:41:061389parcourir

Légalité des sous-ensembles est NP-complète

La correspondance de sous-ensemble, également connue sous le nom de problème du « sous-ensemble total », est un problème de calcul NP-complet exemplaire. Étant donné un ensemble de nombres et une valeur objective, la tâche consiste à déterminer s'il existe un sous-ensemble de nombres dont le nombre total est égal à la valeur objective. La capacité NP de ce problème découle de sa capacité à résoudre une variété d’autres problèmes NP-complets par réduction du temps polynomial. Quelle que soit sa définition simple, il n'existe aucun calcul efficace capable de résoudre la « correspondance de sous-ensemble » de tous les événements, ce qui lui confère une grande importance dans l'ingénierie et la simplification de logiciels hypothétiques, ainsi que dans différents domaines (par exemple, la cryptographie, l'allocation d'actifs et les problèmes dynamiques). avec des applications fonctionnelles.

Méthode à utiliser

  • Réduction de la somme du sous-ensemble

  • Réduit de 3SAT

Réduire de la somme du sous-ensemble

Une façon de traiter le fait que « l'équité des sous-ensembles » est un problème NP-complet est de montrer une réduction significative du problème NP-complet (le problème du « nombre total de sous-ensembles »).

Algorithme

  • Étant donné un cas de problème de "Subset Aggregation", il s'agit d'un tas d'entiers S et d'une cible de valeur T.

  • Utilisez un ensemble S similaire et ciblez l'estime de soi 2T pour présenter un autre cas du problème de « l'équité du sous-ensemble ».

  • S'il existe un sous-ensemble de S qui se résume par T dans le problème « d'agrégation de sous-ensembles », alors à ce moment-là, il y aura un sous-ensemble 2T qui se résume par T dans le problème « d'uniformité de sous-ensemble » en ajoutant des sous-ensembles similaires à lui-même.

  • En supposant qu'il n'y a pas de sous-ensemble de S qui se résume à T dans le problème du « total du sous-ensemble », alors il n'y a pas de sous-ensemble qui se résume à 2T dans le problème de « l'équité du sous-ensemble », car tout sous-ensemble avec un total inférieur à la somme de 2T et lui-même ne peut pas dépasser 2T.

  • Cette baisse montre que résoudre le problème de « l'équité des sous-ensembles » est presque aussi difficile que de résoudre le problème de « l'agrégation de sous-ensembles », ce qui en fait un problème NP-complet.

Exemple

#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;
}

Sortie

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.

Réduit de 3SAT

Une autre façon consiste à prouver que la « correspondance de sous-ensemble » est NP-complète en la soustrayant directement d'un problème NP-complet connu (par exemple le problème 3SAT).

Algorithme

  • donne un exemple de question 3SAT contenant une formule booléenne dans une structure ordinaire conjointe avec trois littéraux par condition.

  • Discutons à nouveau du problème de « l'uniformité des sous-ensembles » avec un tas d'entiers et de valeurs cibles, comme suit :

  • a.Pour chaque variable de l'équation 3SAT, créez un nombre avec la valeur 1 dans l'ensemble.

    b. Pour chaque condition supplémentaire dans l'équation 3SAT, générez un nombre avec la valeur 2 dans l'ensemble.

    c. Définissez la valeur cible sur la quantité totale de toutes les conditions supplémentaires et de tous les facteurs de la recette 3SAT.

  • Si le schéma 3SAT peut être satisfait, il existe un sous-ensemble dans le problème « homogénéité du sous-ensemble » qui résume la valeur cible en choisissant une variable pour chaque condition satisfaite.

  • Si la formule 3SAT ne peut pas être satisfaite, alors aucun sous-ensemble du problème de « correspondance de sous-ensembles » ne peut être généralisé à la valeur cible, car tout sous-ensemble légal doit contenir au moins un entier de valeur 2, associé à la clause remplie.

  • Puisque le problème 3SAT est connu pour être NP-complet, cette baisse indique le pic NP de « l'équité du sous-ensemble ».

Exemple

#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;
}

Sortie

3SAT Formula is not satisfiable.
Subset Uniformity has a solution.

Conclusion

Les deux approches montrent que le problème « d'équité de sous-ensemble » ou « d'agrégation de sous-ensembles » est NP-complet, il est donc impossible de suivre des calculs efficaces pour résoudre le problème pour tous les exemples. Les scientifiques utilisent souvent la programmation dynamique ou d’autres procédures d’estimation pour résoudre efficacement des scénarios réalisables pour ce problème.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer