Problemă partiție - Partition problem
În teoria numerelor și informatică , problema partiției sau partiționarea numerelor este sarcina de a decide dacă un S multiset dat de numere întregi pozitive poate fi partiționat în două subseturi S 1 și S 2 astfel încât suma numerelor din S 1 să fie egală cu suma numerelor din S 2 . Deși problema partiției este NP-completă , există o soluție de programare dinamică în timp pseudo-polinomială și există euristici care rezolvă problema în multe cazuri, fie în mod optim, fie aproximativ. Din acest motiv, a fost numită „cea mai ușoară problemă dificilă”.
Există o versiune de optimizare a problemei partiției, care este de a partiția multiset S în două subseturi S 1 , S 2 astfel încât diferența dintre suma elementelor din S 1 și suma elementelor din S 2 este minimizată. Versiunea de optimizare este NP-hard , dar poate fi rezolvată eficient în practică.
Problema partiției este un caz special al două probleme conexe:
- În problema sumelor de subseturi , scopul este de a găsi un subset de S a cărui sumă este un anumit număr țintă T dat ca intrare (problema partiției este cazul special în care T este jumătate din suma lui S ).
- În partiționarea numerelor cu mai multe căi , există un parametru întreg k și scopul este de a decide dacă S poate fi partiționat în k subseturi de sumă egală (problema partiției este cazul special în care k = 2).
- Cu toate acestea, este destul de diferit de problema cu 3 partiții : în această problemă, numărul de subseturi nu este fixat în avans - ar trebui să fie | S | / 3, unde fiecare subset trebuie să aibă exact 3 elemente. 3-partiție este mult mai greu decât partiția - nu are algoritm de timp pseudo-polinomial decât dacă P = NP .
Exemple
Dat fiind S = {3,1,1,2,2,1}, o soluție validă la problema partiției sunt cele două seturi S 1 = {1,1,1,2} și S 2 = {2,3}. Ambele seturi însumează 5, și au partiție S . Rețineți că această soluție nu este unică. S 1 = {3,1,1} și S 2 = {2,2,1} este o altă soluție.
Nu fiecare multiset de numere întregi pozitive are o partiție în două subseturi cu sumă egală. Un exemplu de astfel de set este S = {2,5}.
Duritatea de calcul
Problema partiției este NP greu. Acest lucru poate fi dovedit prin reducerea de la problema sumelor subset . O instanță a SubsetSum constă dintr-un set S de numere întregi pozitive și o sumă țintă T <S; scopul este de a decide dacă există un subset de S cu suma exacta T .
Având în vedere o astfel de instanță, construiți o instanță de partiție în care setul de intrare conține setul original plus două elemente: z 1 și z 2 , cu z 1 = sumă (S) și z 2 = 2 T. Suma acestui set de intrare este suma (S) + z 1 + z 2 = 2 suma (S) +2 T, deci suma țintă pentru partiția este suma (S) + T.
- Să presupunem că există o soluție S 'pentru instanța SubsetSum. Atunci suma (S ') = T, deci suma (S' u { z 1 }) = suma (S) + T, deci S 'u { z 1 } este o soluție pentru instanța de partiție.
- În schimb, să presupunem că există o soluție S '' pentru instanța de partiție. Apoi, S "trebuie să conțină fie z 1, fie z 2 , dar nu ambele, deoarece suma lor este mai mare decât suma (S) + T. Dacă S" conține z 1 , atunci trebuie să conțină elemente din S cu o sumă de exact T, deci S '' minus z 1 este o soluție pentru instanța SubsetSum. Dacă S '' conține z 2 , atunci trebuie să conțină elemente din S cu o sumă exactă de sumă (S) -T, deci celelalte obiecte din S sunt o soluție pentru instanța SubsetSum.
Algoritmi de aproximare
Așa cum s-a menționat mai sus, problema partiției este un caz special de partiționare pe mai multe căi și sub-sumă. Prin urmare, poate fi rezolvat prin algoritmi dezvoltați pentru fiecare dintre aceste probleme. Algoritmii dezvoltați pentru partiționarea numerelor pe mai multe căi includ:
- Partiționarea numărului lacom - bucle peste numere și plasează fiecare număr în set a cărui sumă curentă este cea mai mică. Dacă numerele nu sunt sortate, atunci timpul de rulare este O ( n ), iar raportul de aproximare este de cel mult 3/2 („raportul de aproximare” înseamnă suma mai mare din ieșirea algoritmului, împărțită la suma mai mare dintr-o partiție optimă). Sortarea numerelor crește timpul de rulare la O ( n log n ) și îmbunătățește raportul de aproximare la 7/6. Dacă numerele sunt distribuite uniform în [0,1], atunci raportul de aproximare este cel mult aproape sigur șiîn așteptare.
- Cea mai mare metodă de diferențiere (numită și algoritmul Karmarkar-Karp ) sortează numerele în ordine descrescătoare și înlocuiește în mod repetat numerele prin diferențele lor. Complexitatea runtime este O ( n log n ). În cel mai rău caz, raportul său de aproximare este similar - cel mult 7/6 . Cu toate acestea, în cazul mediu, acesta funcționează mult mai bine decât algoritmul lacom: atunci când numerele sunt distribuite uniform în [0,1], raportul său de aproximare este cel multîn așteptare. De asemenea, funcționează mai bine în experimentele de simulare.
- Multifit Algoritmul folosește binar de căutare combinat cu un algoritm de ambalare bin . În cel mai rău caz, raportul său de aproximare este de 8/7 .
- Problema sumei subsetului are un FPTAS care poate fi utilizat și pentru problema partiției, prin setarea sumei țintă la suma ( S ) / 2.
Algoritmi exacți
Există algoritmi exacți , care găsesc întotdeauna partiția optimă. Deoarece problema este NP-hard, astfel de algoritmi ar putea dura exponențial în general, dar pot fi practic utilizabili în anumite cazuri. Algoritmii dezvoltați pentru partiționarea numerelor pe mai multe căi includ:
- Pseudopolynomial timp numărul de partiționare are memorie, în cazul în care m este cel mai mare număr din intrare.
- Complet algoritmul greedy (CGA) consideră că toate partițiile prin construirea unui arbore binar . Fiecare nivel din arbore corespunde unui număr de intrare, unde rădăcina corespunde cu cel mai mare număr, nivelul de mai jos cu următorul cel mai mare număr etc. Fiecare ramură corespunde unui set diferit în care poate fi pus numărul curent. Traversarea arborelui în ordinea adâncimii-prime necesită doar spațiu, dar ar putea dura timp. Timpul de rulare poate fi îmbunătățit folosind o euristică lacomă: în fiecare nivel, dezvoltați mai întâi ramura în care numărul curent este introdus în setul cu cea mai mică sumă. Acest algoritm găsește mai întâi soluția găsită de partiționarea lacomă a numărului , dar apoi continuă să caute soluții mai bune. Unele variații ale acestei idei sunt scheme de aproximare complet polinomiale-timp pentru problema sub-sumă și, prin urmare, și pentru problema partiției.
- Complet Algoritmul Karmarkar-Karp (CKK) consideră că toate partițiile prin construirea unui arbore binar. Fiecare nivel corespunde unei perechi de numere. Ramura din stânga corespunde plasării lor în diferite subseturi (adică înlocuirea lor cu diferența lor), iar ramura din dreapta corespunde plasării lor în același subset (adică înlocuirea lor cu suma lor). Acest algoritm găsește mai întâi soluția găsită prin cea mai mare metodă de diferențiere , dar apoi continuă să găsească soluții mai bune. Funcționează mult mai rapid decât CGA în instanțe aleatorii. Avantajul său este mult mai mare atunci când există o partiție egală și poate fi de mai multe ordine de mărime. În practică, problemele de dimensiuni arbitrare pot fi rezolvate de CKK dacă numerele au cel mult 12 cifre semnificative . CKK poate rula, de asemenea, ca un algoritm oricând : găsește mai întâi soluția KK și apoi găsește soluții progresiv mai bune pe măsură ce timpul permite (posibil necesitând timp exponențial pentru a ajunge la optimitate, în cele mai rele cazuri). Necesită spațiu, dar în cel mai rău caz ar putea dura ceva timp.
Algoritmii dezvoltați pentru suma subsetului includ:
- Horowitz și Sanhi - rulează în timp , dar necesită spațiu.
- Schroeppel și Shamir - rulează în timp și necesită mult mai puțin spațiu - .
- Howgrave-Graham și Joux - rulează în timp , dar este un algoritm randomizat care rezolvă doar problema deciziei (nu problema optimizării).
Instanțe dificile și tranziție de fază
Seturile cu o singură partiție sau fără partiții tind să fie mai greu (sau mai scumpe) de rezolvat în comparație cu dimensiunile lor de intrare. Când valorile sunt mici în comparație cu dimensiunea setului, partițiile perfecte sunt mai probabil. Se știe că problema suferă o „ tranziție de fază ”; fiind probabil pentru unele seturi și puțin probabil pentru altele. Dacă m este numărul de biți necesari pentru a exprima orice număr din set și n este mărimea setului, atunci tinde să aibă multe soluții și tinde să aibă puține sau deloc soluții. Pe măsură ce n și m cresc, probabilitatea unei partiții perfecte merge la 1 sau respectiv 0. Acest lucru a fost susținut inițial pe baza dovezilor empirice de către Gent și Walsh, apoi folosind metode din fizica statistică de Mertens, și mai târziu dovedit de Borgs , Chayes și Pittel .
Versiune probabilistică
O problemă conexă, oarecum similară cu paradoxul zilei de naștere , este aceea de a determina dimensiunea setului de intrare astfel încât să avem o probabilitate de jumătate că există o soluție, în ipoteza că fiecare element din set este selectat aleator cu uniform distribuție între 1 și o anumită valoare dată. Soluția la această problemă poate fi contra-intuitivă, cum ar fi paradoxul zilei de naștere.
Variante și generalizări
Partiția cu cardinalitate egală este o variantă în care ambele părți ar trebui să aibă un număr egal de itemi, pe lângă faptul că au o sumă egală. Această variantă este și NP-hard, așa cum sa dovedit în problema [SP12]. Consultați partiționarea numerică echilibrată .
Partiția distinctă este o variantă în care toate numerele întregi de intrare sunt distincte. Această variantă este și NP-hard.
Partiția produsului este problema partiționării unui set de numere întregi în două seturi cu același produs (mai degrabă decât aceeași sumă). Această problemă este puternic NP-hard .
Kovalyov și Pesch discută despre o abordare generică pentru a demonstra duritatea NP a problemelor de tip partiție.
Aplicații
O aplicație a problemei partiției este manipularea alegerilor . Să presupunem că există trei candidați (A, B și C). Un singur candidat ar trebui să fie ales folosind o regulă de vot bazată pe punctaj, de ex. Regula veto (fiecare alegător vetoează un singur candidat și câștigă candidatul cu cel mai mic veto). Dacă o coaliție dorește să se asigure că C este ales, ar trebui să-și împartă voturile între A și B astfel încât să maximizeze cel mai mic număr de vetouri pe care le primește fiecare dintre ele. Dacă voturile sunt ponderate, atunci problema poate fi redusă la problema partiției și, prin urmare, poate fi rezolvată eficient folosind CKK. Același lucru este valabil pentru orice altă regulă de vot care se bazează pe scor.
Note
Referințe
- Borgs, creștin; Chayes, Jennifer; Pittel, Boris (2001), "Tranziție de fază și scalare de dimensiuni finite pentru problema de partiționare întreagă", Structuri aleatoare și algoritmi , 19 (3-4): 247-288, CiteSeerX 10.1.1.89.9577 , doi : 10.1002 / rsa .10004
- Gent, Ian; Walsh, Toby (august 1996). „Tranziții de fază și teorii recocite: partiționarea numerelor ca studiu de caz”. În Wolfgang Wahlster (ed.). Lucrările celei de-a 12-a Conferințe europene privind inteligența artificială . ECAI-96. John Wiley și Sons. pp. 170–174. CiteSeerX 10.1.1.2.4475 .
- Gent, Ian; Walsh, Toby (1998), "Analiza euristicii pentru partiționarea numerelor", Inteligența computațională , 14 (3): 430–451, CiteSeerX 10.1.1.149.4980 , doi : 10.1111 / 0824-7935.00069 , S2CID 15344203
- Korf, Richard E. (1998), „Un algoritm complet oricând pentru partiționarea numerelor”, Inteligență artificială , 106 (2): 181–203, CiteSeerX 10.1.1.90.993 , doi : 10.1016 / S0004-3702 (98) 00086- 1 , ISSN 0004-3702
- Mertens, Stephan (noiembrie 1998), „Tranziția fazei în problema partiționării numerelor”, Physical Review Letters , 81 (20): 4281–4284, arXiv : cond-mat / 9807077 , Bibcode : 1998PhRvL..81.4281M , doi : 10.1103 /PhysRevLett.81.4281 , S2CID 119541289
- Mertens, Stephan (2001), „A physicist’s approach to number partitioning”, Theoretical Computer Science , 265 (1-2): 79–108, arXiv : cond-mat / 0009230 , doi : 10.1016 / S0304-3975 (01) 00153 -0 , S2CID 16534837
- Mertens, Stephan (2006). „Cea mai ușoară problemă dificilă: partiționarea numerelor” . În Allon Percus; Gabriel Istrate; Cristopher Moore (eds.). Complexitatea calculațională și fizica statistică . SUA: Oxford University Press. pp. 125–140. arXiv : cond-mat / 0310317 . Bibcode : 2003cond.mat.10317M . ISBN 9780195177374.
- Mertens, Stephan (1999), „Un algoritm complet oricând pentru partiționarea numerică echilibrată”, arXiv : cs / 9903011