Surat-menyurat subset, juga dikenali sebagai masalah "jumlah subset", ialah masalah pengiraan lengkap NP yang boleh dicontohi. Memandangkan sekumpulan nombor dan nilai objektif, tugasnya adalah untuk menentukan sama ada wujud subset nombor yang jumlah nombornya sama dengan nilai objektif. Kapasiti NP masalah ini berpunca daripada keupayaannya untuk menyelesaikan pelbagai masalah lengkap NP lain melalui pengurangan masa polinomial. Terlepas dari definisinya yang mudah, tidak ada pengiraan yang cekap yang dapat menyelesaikan "surat-menyurat subset" semua peristiwa, yang menjadikannya sangat penting dalam kejuruteraan dan penyederhanaan perisian hipotesis, dan dalam bidang yang berbeza (cth. kriptografi, peruntukan aset dan masalah dinamik) dengan aplikasi berfungsi.
Pengurangan jumlah subset
Dikurangkan daripada 3SAT
Satu cara untuk menangani "keadilan subset" sebagai masalah lengkap NP adalah dengan menunjukkan pengurangan ketara dalam masalah lengkap NP (masalah "jumlah subset").
Memandangkan satu kes masalah "penjumlahan subset", ia ialah sekumpulan integer S dan sasaran nilai T.
Gunakan set S yang serupa dan sasarkan harga diri 2T untuk membuat satu lagi kes masalah "ekuiti subset".
Jika terdapat subset S yang diringkaskan sebagai T dalam masalah "subset aggregation", maka pada masa ini, akan ada subset 2T yang diringkaskan sebagai T dalam "subset uniformity" masalah Dengan menambahkan subset yang serupa dengan dirinya sendiri.
Dengan mengandaikan bahawa tiada subset S yang diringkaskan sebagai T dalam masalah "subset total", maka tiada subset yang diringkaskan sebagai 2T dalam masalah "subset fairness", kerana mana-mana subset dengan Subset daripada jumlah yang kurang daripada 2T tidak boleh ditambah pada dirinya sendiri melebihi 2T.
Penurunan ini menunjukkan bahawa menyelesaikan masalah "keadilan subset" hampir sama sukarnya dengan menyelesaikan masalah "penjumlahan subset", menjadikannya masalah lengkap NP.
#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; }
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.
Pendekatan lain adalah untuk membuktikan bahawa "surat-menyurat subset" adalah NP-lengkap dengan menolaknya terus daripada masalah lengkap NP yang diketahui (cth. masalah 3SAT).
memberikan contoh soalan 3SAT yang mengandungi resipi Boolean dalam struktur biasa bersama dengan tiga literal setiap syarat.
Mari kita bincangkan masalah "keseragaman subset" sekali lagi dengan sekumpulan integer dan nilai sasaran, seperti berikut:
a Untuk setiap pembolehubah dalam persamaan 3SAT, cipta nombor dengan nilai 1 dalam set.
b Untuk setiap syarat tambahan dalam persamaan 3SAT, hasilkan nombor dengan nilai 2 dalam set.
c. Tetapkan nilai sasaran kepada kuantiti penuh semua syarat tambahan dan semua faktor dalam resipi 3SAT.
Sekiranya skema 3SAT boleh dipenuhi, maka terdapat subset dalam masalah "keseragaman subset" yang meringkaskan nilai sasaran dengan memilih pembolehubah untuk setiap keadaan yang berpuas hati.
Jika formula 3SAT tidak dapat dipenuhi, maka tiada subset dalam masalah "subset surat-menyurat" boleh digeneralisasikan kepada nilai sasaran, kerana mana-mana subset undang-undang mesti mengandungi tidak kurang daripada satu integer dengan nilai 2, Relates kepada syarat yang telah dipenuhi.
Memandangkan masalah 3SAT diketahui NP-lengkap, penurunan ini menunjukkan puncak NP "ekuiti subset".
#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; }
3SAT Formula is not satisfiable. Subset Uniformity has a solution.
Kedua-dua pendekatan menunjukkan bahawa masalah "ekuiti subset" atau "penjumlahan subset" adalah NP-lengkap, dan oleh itu adalah mustahil untuk menjejaki pengiraan yang cekap untuk menyelesaikan masalah bagi semua contoh. Para saintis sering menggunakan pengaturcaraan dinamik atau prosedur anggaran lain untuk menyelesaikan dengan cekap senario yang boleh dilaksanakan untuk masalah ini.
Atas ialah kandungan terperinci Kesamaan subset ialah NP-lengkap. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!