Joukkopakkaus on klassinen NP-täydellinen ongelma laskennallisen monimutkaisuuden teoriassa ja kombinatoriikassa , ja se on yksi Karpin 21:stä NP-täydestä tehtävästä .
Kuvittele, että meillä on äärellinen joukko S ja lista joukon S osajoukoista . Pakkausongelma kysyy, onko luettelossa k osajoukkoa, jotka ovat pareittain hajallaan.
Muodollisemmin, jos joukko ja joukon osajoukkojen perhe annetaan , pakkaus on joukkojen alaperhe siten, että kaikki joukot alkaen ovat pareittain hajallaan, ja sitä kutsutaan pakkauksen kooksi. Pakkauksen ratkaistavuusongelmassa syöte on pari ja luku . Kysymys on selvittää, onko paketissa kokoa tai enemmän. Pakkauksen optimointitehtävässä syöte on pari ja tehtävänä on löytää pakkaus käyttämällä mahdollisimman montaa joukkoa.
On selvää, että ongelma kuuluu NP :lle , koska annettuna k osajoukkoa voidaan yksinkertaisesti tarkistaa, että ne ovat pareittain disjunktia polynomiajassa .
Tehtävän optimointiversio , joukkojen maksimipakkaus , kysyy listan parikohtaisten disjunktioiden enimmäismäärästä. Tämä ongelma voidaan luonnollisesti muotoilla lineaariseksi kokonaislukuohjelmointitehtäväksi , se kuuluu pakkaustehtävien luokkaan ja sen kaksoislineaarinen ohjelmointitehtävä on joukkopeittotehtävä [1] .
Maksimipakkauksen löytämisen ongelma voidaan muotoilla seuraavaksi lineaariseksi kokonaislukuohjelmointitehtäväksi .
maksimoida | (etsi suurin osajoukko) | ||
olosuhteissa | kaikille | (valittujen sarjojen on oltava pareittain erillään) | |
kaikille . | (jokainen sarja on joko pakattu tai ei) |
Oletetaan esimerkiksi, että sinulla on keittiössäsi kokoelma erilaisia ruokia ( ) ja sinulla on keittokirja, jossa on kokoelma reseptejä ( ). Jokainen resepti vaatii tietyn sarjan tuotteita. Haluat valmistaa keittokirjan enimmäismäärän ruokia (olettaen, että tuotetta käytetään vain yhdessä ruoassa). Tässä tapauksessa etsit sarjapakkausta ( ) by ( ) - reseptisarjaa, jossa tuote ei sisälly kahteen eri reseptiin.
Toisena esimerkkinä kuvitellaan ulkomaisten edustajien kokous, joista jokainen puhuu englantia ja useita muita kieliä. Haluat ilmoittaa päätöksestä jollekin edustajaryhmälle, mutta et luota heihin etkä halua heidän keskustelevan päätöksestä keskenään kielellä, jota et ymmärrä. Tämän saavuttamiseksi valitset ryhmän siten, että kaksi edustajaa ei puhu muuta kieltä kuin englantia. Toisaalta haluat välittää päätöksesi mahdollisimman suurelle määrälle edustajia. Tässä tapauksessa joukon elementit ovat muita kieliä kuin englanti, ja osajoukot ovat kieliä, joita tietyt edustajat puhuvat. Jos nämä kaksi ryhmää eivät mene päällekkäin, edustajat eivät voi puhua muuta kieltä kuin englantia. Maksimipakkaus valitsee suurimman mahdollisen määrän edustajia annettujen rajoitusten mukaisesti. Vaikka ongelma on yleensä käsittämätön, tässä esimerkissä hyvä heuristiikka olisi valita edustajat, jotka puhuvat yhtä kieltä (muuta kuin englantia), jotta monia muita ei tarvitse sulkea pois.
Joukon pakkausongelmasta on painotettu versio, jossa jokaiselle osajoukolle on määritetty paino (reaaliluku) ja haluamme maksimoida kokonaispainon:
Ensimmäisessä esimerkissä voimme antaa reseptille painon, joka vastaa ruoasta pivien ystävien määrää, jotta illallinen miellyttää maksimimäärää ystäviä.
Paino näyttää vaikeuttavan ongelmaa, mutta suurin osa tunnetuista tuloksista ongelmalle ilman painoja pätee myös painotettuun ongelmaan.
Pakkausongelma voi olla vaikea jollekin k :lle , mutta ei välttämättä ole vaikea löytää k :tä , joka on helppo ratkaista tietyille syötteille. Voimme esimerkiksi käyttää ahnealgoritmia , jossa etsimme joukon, joka leikkaa vähiten muita joukkoja, lisäämme sen ratkaisuun ja poistamme joukot, joiden kanssa se leikkaa. Jatkamme samaa niin kauan kuin sarjoja riittää. Saamme jonkin kokoisen paketin, vaikka ei välttämättä maksimikokoa. Vaikka mikään algoritmi ei voi aina antaa lähelle maksimitulosta (katso seuraava osa), monissa käytännön sovelluksissa tämä heuristinen algoritmi antaa hyviä tuloksia.
Paitsi joukon pakkausongelma NP-täydellinen, optimointiversio on osoittautunut yhtä vaikeaksi arvioida kuin maksimiklikkiongelma . Erityisesti sitä ei voida approksimoida millään vakiokertoimella [2] . Tunnetuin algoritmi approkimoi kertoimella [3] . Painotettu muunnos voidaan approksimoida samassa määrin [4] .
Ongelmalla on kuitenkin muunnelma, joka on muokattavampi - jos emme salli osajoukoissa olla enemmän kuin k ≥ 3 alkiota, vastaus voidaan approksimoida kertoimella k / 2 + ε mille tahansa ε > 0:lle. 3-elementtijoukkojen ongelma voidaan approksimoida kertoimella, joka on lähellä 50%. Toisessa muokattavammassa muunnelmassa, sillä ehdolla, että mikään alkio ei ole useammassa kuin k osajoukossa, vastaus voidaan approksimoida tekijällä k . Sama pätee painotettuun versioon.
Itsenäisen joukkotehtävän ja joukon pakkausongelman välillä on yksi yhteen lyheneminen :
Pelkistys on kaksisuuntainen PTAS-vähennys ja se osoittaa, että näitä kahta ongelmaa on yhtä vaikea arvioida.
Matching ja 3D matching ovat sarjapakkauksen erikoistapauksia. Maksimikoon vastaavuus löytyy polynomiajasta, mutta suurimman 3-ulotteisen sovituksen tai suurimman riippumattoman joukon löytäminen on NP-kovia ongelmia.
Sarjan pakkaus kuuluu sarjan osien peittämiseen tai erottamiseen liittyvien ongelmien perheeseen. Yksi asiaan liittyvistä ongelmista on sarjan peittämisongelma . Tässä annetaan myös joukko S ja joukko joukkoja, mutta haasteena on määrittää, voimmeko valita k joukkoa, jotka yhdessä sisältävät kaikki S :n alkiot . Nämä sarjat voivat olla päällekkäisiä. Optimointiversio etsii tällaisten sarjojen vähimmäismäärää. Maksimipakkausongelma ei edellytä kaikkien elementtien peittämistä poikkeuksetta.
NP-täydellinen tarkka kattavuus -tehtävä puolestaan edellyttää, että jokainen elementti sisältyy täsmälleen yhteen osajoukkoon. Tällaisen tarkan kattavuuden löytäminen koosta riippumatta on NP-täydellinen tehtävä.
Karp osoitti joukon pakkausongelman NP-täydellisyyden vähentämällä siihen klikkiongelman .
Katso myös: Hypergraafien pakkaukset .
Pakkaustehtävät | |
---|---|
Pakkaa ympyrät |
|
Ilmapallon pakkaus |
|
Muut paketit | |
Palapeli |