Hogyan lehet NP-nehezen megoldható feladatokat paraméterezett algoritmusokkal megoldani

A tudomĂĄnyos kutatĂĄs talĂĄn a legizgalmasabb rĂ©sze a tanulmĂĄnyainknak. Az ötlet az, hogy mĂ©g az egyetemen prĂłbĂĄljuk ki magunkat a vĂĄlasztott irĂĄnyban. PĂ©ldĂĄul a Software Engineering Ă©s Machine Learning szakos hallgatĂłk gyakran vĂ©geznek kutatĂĄsi projekteket kĂŒlönbözƑ cĂ©geknĂ©l (fƑkĂ©nt a JetBrainsnĂ©l vagy a YandexnĂ©l, de nem csak ott).

Ebben a bejegyzĂ©sben a Computer Science irĂĄnyĂș projektemrƑl fogok beszĂ©lni. A munka keretĂ©ben megvizsgĂĄltam Ă©s gyakorlatba ĂŒltettem a megoldĂĄsok megközelĂ­tĂ©seit az egyik legismertebb NP-nehĂ©z feladatban: a csĂșcsborĂ­tĂĄssal kapcsolatos feladatban.

Jelenleg rendkĂ­vĂŒl gyorsan fejlƑdik egy Ă©rdekes megközelĂ­tĂ©s az NP-nehĂ©z problĂ©mĂĄkhoz — a paramĂ©terezett algoritmusok. MegprĂłbĂĄlom bevezetni önöket a tĂ©mĂĄba, mesĂ©lni nĂ©hĂĄny egyszerƱ paramĂ©terezett algoritmusrĂłl, Ă©s egy hatĂ©kony mĂłdszert bemutatni, amely nagyon segĂ­tett nekem. Az eredmĂ©nyeimet a PACE Challenge versenyen mutattam be: a nyĂ­lt tesztek eredmĂ©nyei szerint a megoldĂĄsom a harmadik helyen ĂĄll, Ă©s a vĂ©gsƑ eredmĂ©nyekre jĂșlius 1-jĂ©n derĂŒl fĂ©ny.

Hogyan lehet NP-nehezen megoldható feladatokat paraméterezett algoritmusokkal megoldani

RĂłlam

Vasiliy Alferov vagyok, jelenleg a harmadik Ă©vet vĂ©gzem a HSE - SzentpĂ©tervĂĄri Egyetemen. Az algoritmusok irĂĄnti Ă©rdeklƑdĂ©sem mĂ©g iskolĂĄs koromban kezdƑdött, amikor a moszkvai 179. iskolĂĄba jĂĄrtam, Ă©s sikeresen rĂ©szt vettem informatikai versenyeken.

VĂ©ges szĂĄmĂș szakĂ©rtƑ a paramĂ©terezett algoritmusokrĂłl bemegy a bĂĄrba...

A pĂ©lda a könyvbƑl szĂĄrmazik «Parameterized algorithms»

KĂ©pzelje el, hogy ön a bĂĄr biztonsĂĄgi Ƒre egy kisvĂĄrosban. Minden pĂ©nteken a vĂĄros fele a bĂĄrjĂĄba jön lazĂ­tani, ami sok gondot okoz önnek: ki kell dobnia a rekedtes lĂĄtogatĂłkat, hogy elkerĂŒlje a verekedĂ©seket. VĂ©gĂŒl mĂĄr eleged van, Ă©s Ășgy döntesz, hogy megelƑzƑ intĂ©zkedĂ©seket teszel.

Mivel a vĂĄros kicsi, pontosan tudja, hogy kik azok a lĂĄtogatĂłk, akik nagy valĂłszĂ­nƱsĂ©ggel össze fognak verekedni, ha egyĂŒtt kerĂŒlnek a bĂĄrba. Van egy listĂĄja n emberekrƑl, akik ma este a bĂĄrba jönnek. Úgy dönt, hogy nem enged be bizonyos vĂĄrosbelieket, Ășgy, hogy senki se verekedjen meg. Közben a fƑnöke nem szeretne profitot veszĂ­teni, Ă©s elĂ©gedetlen lesz, ha nem enged be több mint k embert.

Sajnos a feladat, amely elƑtt ĂĄll, klasszikus NP-nehĂ©z feladat. TalĂĄn ismeri ezt mint Vertex Cover, vagyis a csĂșcsborĂ­tĂĄssal kapcsolatos feladat. Az ilyen feladatokra ĂĄltalĂĄnossĂĄgban nem ismertek olyan algoritmusok, amelyek elfogadhatĂł idƑ alatt mƱködnek. Pontosan megfogalmazva, a nem bizonyĂ­tott Ă©s meglehetƑsen erƑs ETH (ExponenciĂĄlis IdƑhipotĂ©zis) azt ĂĄllĂ­tja, hogy ezt a feladatot nem lehet megoldani Hogyan lehet NP-nehezen megoldhatĂł feladatokat paramĂ©terezett algoritmusokkal megoldani, vagyis hogy nem lĂ©tezik szignifikĂĄnsan jobb megoldĂĄs, mint a teljes keresĂ©s. PĂ©ldĂĄul, tegyĂŒk fel, hogy a bĂĄrba n = 1000 ember kĂ©szĂŒl Ă©rkezni. Akkor a teljes keresĂ©s Hogyan lehet NP-nehezen megoldhatĂł feladatokat paramĂ©terezett algoritmusokkal megoldani kukucskĂĄlĂĄsra Hogyan lehet NP-nehezen megoldhatĂł feladatokat paramĂ©terezett algoritmusokkal megoldani — ƑrĂŒlt sok. SzerencsĂ©re, az irĂĄnyĂ­tĂĄs korlĂĄtozĂĄst ĂĄllĂ­tott fel Ön szĂĄmĂĄra k = 10, Ă­gy a kombinĂĄciĂłk szĂĄma sokkal kevesebb: tĂ­z elem rĂ©szhalmazainak szĂĄma Hogyan lehet NP-nehezen megoldhatĂł feladatokat paramĂ©terezett algoritmusokkal megoldani. Ez mĂĄr jobb, de mĂ©g mindig nem lehet nap alatt kiszĂĄmolni mĂ©g egy erƑteljes klaszteren sem.
Hogyan lehet NP-nehezen megoldható feladatokat paraméterezett algoritmusokkal megoldani
Annak Ă©rdekĂ©ben, hogy kizĂĄrjuk a verekedĂ©s lehetƑsĂ©gĂ©t a lĂĄtogatĂłk közötti ilyen feszĂŒltsĂ©ges konfiguĂĄciĂł esetĂ©n, Bobot, Danielt Ă©s Fyodorot nem szabad beengedni. Olyan megoldĂĄs, amelyben csak ketten maradnak kinn, nem lĂ©tezik.

Jelenti ez, hogy fel kell adnunk Ă©s be kell engednĂŒnk mindenkit? VizsgĂĄljunk meg mĂĄs lehetƑsĂ©geket. PĂ©ldĂĄul, talĂĄn nem engedhetnĂ©nk be csak azokat, akik valĂłszĂ­nƱleg sok emberrel fognak verekedni. Ha valaki legalĂĄbb k + 1 mĂĄsik emberrel viaskodhat, akkor Ƒt biztosan nem szabad beengedni — kĂŒlönben minden olyan k + 1 vĂĄrosit ki kell zĂĄrnunk, akivel összeĂŒtközĂ©sbe lĂ©phet, ami mĂĄr biztosan felbosszantja az irĂĄnyĂ­tĂĄst.

TegyĂŒk fel, hogy eltĂĄvolĂ­totta az összes olyan embert, akit csak tudott, ezen elv alapjĂĄn. Akkor a többiek legfeljebb k emberekkel fognak viaskodni. Ha közĂŒlĂŒk k embert kiszĂłr, akkor legfeljebb Hogyan lehet NP-nehezen megoldhatĂł feladatokat paramĂ©terezett algoritmusokkal megoldani konfliktust tud megelƑzni. TehĂĄt, ha több mint Hogyan lehet NP-nehezen megoldhatĂł feladatokat paramĂ©terezett algoritmusokkal megoldani ember rĂ©szese bĂĄrmely konfliktusnak, akkor biztosan nem tudja megelƑzni mindet. Mivel nyilvĂĄnvalĂł, hogy a teljesen konfliktusmentes embereket biztosan be fogja engedni, ezĂ©rt ĂĄt kell nĂ©zni az összes tĂ­z elemƱ rĂ©szhalmazt a kĂ©tszĂĄz emberbƑl. Ezek körĂŒlbelĂŒl Hogyan lehet NP-nehezen megoldhatĂł feladatokat paramĂ©terezett algoritmusokkal megoldani, Ă©s ezt a mƱveletszĂĄmot mĂĄr meg lehet dolgozni egy klaszteren.

Ha biztonsĂĄgosan be tudunk engedni teljesen konfliktusmentes szemĂ©lyeket, akkor mit mondhatunk azokkal, akik csak egy konfliktusban vesznek rĂ©szt? ValĂłjĂĄban Ƒket is be lehet engedni, ha bezĂĄrjuk a kaput az ellenfelĂŒk elƑtt. Igaz, ha Alice csak Bobbal konfliktĂĄl, ha közĂŒlĂŒk Alice-t engedjĂŒk be, nem veszĂ­tĂŒnk: Bobnak lehetnek mĂĄs konfliktusai, mĂ­g Alice-nak biztosan nincsenek. KĂŒlönösen Ă©rtelmetlen nem engedni be Ƒket kettesĂ©vel. Ilyen mƱveletek utĂĄn nem marad több Hogyan lehet NP-nehezen megoldhatĂł feladatokat paramĂ©terezett algoritmusokkal megoldani vendĂ©g megoldatlan sorssal: összesen Hogyan lehet NP-nehezen megoldhatĂł feladatokat paramĂ©terezett algoritmusokkal megoldani konfliktusunk van, mindegyikben kĂ©t rĂ©sztvevƑvel, Ă©s mindenki legalĂĄbb kettƑben rĂ©szt vesz. TehĂĄt csak annyit kell ĂĄtvizsgĂĄlni, hogy Hogyan lehet NP-nehezen megoldhatĂł feladatokat paramĂ©terezett algoritmusokkal megoldani variĂĄciĂłt, ami egy fĂ©l napra elegendƑ lehet egy laptopon.

ValĂłjĂĄban egyszerƱ Ă©rvelĂ©sekkel mĂ©g vonzĂłbb feltĂ©teleket is elĂ©rhetĂŒnk. VegyĂŒk Ă©szre, hogy mindenkĂ©ppen meg kell oldanunk minden vitĂĄt, tehĂĄt minden konfliktĂĄlĂł pĂĄrbĂłl legalĂĄbb egy embert ki kell vĂĄlasztanunk, akit nem engedĂŒnk be. VegyĂŒnk egy algoritmust: vegyĂŒnk egy konfliktust, amelybƑl eltĂĄvolĂ­tunk egy rĂ©sztvevƑt, Ă©s rekurzĂ­van folytatjuk a maradĂ©kkal, majd tĂĄvolĂ­tsuk el a mĂĄsikat, Ă©s szintĂ©n rekurzĂ­van folytatjuk. Mivel minden lĂ©pĂ©sben valakit eltĂĄvolĂ­tunk, az ilyen algoritmus rekurziĂłs fĂĄja binĂĄris fa mĂ©lysĂ©ge k, ezĂ©rt az algoritmus összessĂ©gĂ©ben Hogyan lehet NP-nehezen megoldhatĂł feladatokat paramĂ©terezett algoritmusokkal megoldani, ahol n — a csĂșcsok szĂĄma, Ă©s m — az Ă©lek szĂĄma. A mi pĂ©ldĂĄnk szerint ez körĂŒlbelĂŒl tĂ­z milliĂł, ami nĂ©hĂĄny mĂĄsodperc alatt kiszĂĄmĂ­thatĂł nemcsak egy laptopon, de mĂ©g egy mobiltelefonon is.

A fent emlĂ­tett pĂ©lda egy parametrikus algoritmus. A parametrikus algoritmusok olyan algoritmusok, amelyek f(k) poly(n), ahol p — polinom, f — tetszƑleges szĂĄmĂ­thatĂł fĂŒggvĂ©ny, Ă©s k — valamilyen paramĂ©ter, amely lehet, hogy sokkal kisebb, mint a feladat mĂ©rete.

Minden eddigi Ă©rvelĂ©s a kernelizĂĄciĂłra vezet. — az egyik ĂĄltalĂĄnos technika a paramĂ©terezett algoritmusok lĂ©trehozĂĄsĂĄra. A kernelizĂĄciĂł a feladat mĂ©retĂ©nek csökkentĂ©se egy paramĂ©tertƑl fĂŒggƑ Ă©rtĂ©kre. A kapott feladatot gyakran a kernel nĂ©ven nevezik. Így, egyszerƱ Ă©rvelĂ©ssel a csĂșcsok fokainĂĄl nĂ©gyzetes kernelt kaptunk a Vertex Cover problĂ©mĂĄhoz, amely a vĂĄlasz mĂ©retĂ©hez van paramĂ©terezve. Vannak mĂĄs paramĂ©terek is, amelyeket vĂĄlaszthatunk ehhez a feladathoz (pĂ©ldĂĄul Vertex Cover Above LP), de mi pontosan ezt a paramĂ©tert fogjuk megvitatni.

Pace Challenge

Verseny PACE Challenge (A ParamĂ©terezett Algoritmusok Ă©s SzĂĄmĂ­tĂĄstechnikai KĂ­sĂ©rletek Versenye) 2015-ben indult, hogy kapcsolatot teremtsen a paramĂ©terezett algoritmusok Ă©s a gyakorlatban alkalmazott megoldĂĄsi megközelĂ­tĂ©sek között a szĂĄmĂ­tĂĄstechnikai problĂ©mĂĄk megoldĂĄsĂĄhoz. Az elsƑ hĂĄrom verseny a grĂĄf fĂĄja szĂ©lessĂ©gĂ©nek keresĂ©sĂ©re, (Treewidth) a Steiner-fĂĄnak keresĂ©sĂ©re (Steiner Tree) Ă©s a visszajelzƑ csĂșcs halmaz keresĂ©sĂ©re (Feedback Vertex Set). IdĂ©n egy olyan feladat volt, amelyre prĂłbĂĄlhattĂĄk a kĂ©pessĂ©geiket, a fent leĂ­rt csĂșcsborĂ­tĂĄsi feladat.

A verseny Ă©vrƑl Ă©vre nĂ©pszerƱbb. Ha a preliminĂĄris adatoknak hihetĂŒnk, idĂ©n a csĂșcsborĂ­tĂĄsi problĂ©ma megoldĂł versenyĂ©n 24 csapat vett rĂ©szt. Érdemes megjegyezni, hogy a verseny nem nĂ©hĂĄny ĂłrĂĄig, sƑt nem is egy hĂ©tig, hanem több hĂłnapig tart. A csapatoknak lehetƑsĂ©gĂŒk van ĂĄttekinteni az irodalmat, kitalĂĄlni sajĂĄt eredeti ötleteiket Ă©s megprĂłbĂĄlni megvalĂłsĂ­tani azokat. LĂ©nyegĂ©ben ez a verseny kutatĂłmunkĂĄnak minƑsĂŒl. A legjobb megoldĂĄsok ötletei Ă©s a gyƑztesek dĂ­jazĂĄsa egyidejƱleg zajlik az IPEC (Nemzetközi SzimpĂłzium a ParamĂ©terezett Ă©s Pontos SzĂĄmĂ­tĂĄsrĂłl) keretein belĂŒl, amely Europa legnagyobb Ă©ves algoritmikai összejövetelĂ©n zajlik ALGO. A verseny rĂ©szleteirƑl tovĂĄbbi informĂĄciĂłt talĂĄlhatunk a weboldalon, a korĂĄbbi Ă©vek eredmĂ©nyei pedig az alĂĄbbi helyen Ă©rhetƑk el itt.

A megoldås sémåja

A csĂșcsborĂ­tĂĄsi feladat megoldĂĄsĂĄra megprĂłbĂĄltam parametrikus algoritmusokat alkalmazni. Ezek ĂĄltalĂĄban kĂ©t rĂ©szbƑl ĂĄllnak: egyszerƱsĂ­tĂ©si szabĂĄlyokbĂłl (amelyek ideĂĄlisan kernalisĂĄlĂĄshoz vezetnek) Ă©s osztĂĄsi szabĂĄlyokbĂłl. Az egyszerƱsĂ­tĂ©si szabĂĄlyok a bemenet elƑfeldolgozĂĄsĂĄt jelentik polinomiĂĄlis idƑben. Ezek cĂ©lja a feladat ĂĄtkonvertĂĄlĂĄsa egy kisebb mĂ©retƱ, ekvivalens problĂ©mĂĄvĂĄ. Az egyszerƱsĂ­tĂ©si szabĂĄlyok a legidƑigĂ©nyesebb rĂ©sze az algoritmusnak, Ă©s ennek a rĂ©sznek a hasznĂĄlata vezet az összes vĂ©grehajtĂĄsi idƑhöz. Hogyan lehet NP-nehezen megoldhatĂł feladatokat paramĂ©terezett algoritmusokkal megoldani ahelyett, hogy csak polinomiĂĄlis idƑt igĂ©nyelne. Ebben az esetben az osztĂĄsi szabĂĄlyok azon alapulnak, hogy minden csĂșcsra vĂĄlasszunk a vĂĄlaszba vagy magĂĄt a csĂșcsot, vagy annak szomszĂ©djĂĄt.

Az ĂĄltalĂĄnos sĂ©ma a következƑ: alkalmazzuk az egyszerƱsĂ­tĂ©si szabĂĄlyokat, majd kivĂĄlasztunk egy csĂșcsot, Ă©s kĂ©t rekurzĂ­v hĂ­vĂĄst vĂ©gzĂŒnk: az elsƑben ezt a csĂșcsot vegyĂŒk figyelembe, a mĂĄsodikban pedig minden szomszĂ©djĂĄt. Ezt nevezzĂŒk osztĂĄsnak (branching) ennek a csĂșcsnak az alapjĂĄn.

Ehhez a sĂ©mĂĄhoz pontosan egy kiegĂ©szĂ­tĂ©st fogunk tenni a következƑ bekezdĂ©sben.

Az osztåsi (branching) szabålyok ötletei

BeszĂ©ljĂŒk meg, hogyan vĂĄlasszunk egy csĂșcsot, amin osztĂĄs fog törtĂ©nni.
A fƑ ötlet nagyon mohĂł algoritmikus Ă©rtelemben: vĂĄlasszunk egy maximĂĄlis fokĂș csĂșcsot, Ă©s oszlassunk Ă©ppen ezen. MiĂ©rt tƱnik ez a legjobbnak? Mert a rekurzĂ­v hĂ­vĂĄs mĂĄsodik ĂĄgĂĄban Ă­gy nagyon sok csĂșcsot eltĂĄvolĂ­tunk. SzĂĄmĂ­thatunk arra, hogy egy kis grafikon marad, amin gyorsan tudunk dolgozni.

Ez a megközelĂ­tĂ©s, a mĂĄr tĂĄrgyalt egyszerƱ kernalisĂĄlĂĄsi technikĂĄkkal egyĂŒtt, jĂłl teljesĂ­t, nĂ©hĂĄny ezer csĂșcs mĂ©retƱ teszteket megold. De pĂ©ldĂĄul rosszul mƱködik a kubikus grĂĄfokra (azaz azok grĂĄfja, amelyeknek mindegyik csĂșcsĂĄnak foka hĂĄrom).
Van egy Ășjabb ötlet, amely egy elĂ©g egyszerƱ gondolaton alapul: ha a grĂĄf nem összefĂŒggƑ, a kapcsolatkomponensein a feladat fĂŒggetlenĂŒl megoldhatĂł, Ă©s a vĂĄlaszokat a vĂ©gĂ©n össze lehet kombinĂĄlni. Ez egyĂ©bkĂ©nt a korĂĄbban Ă­gĂ©rt kis mĂłdosĂ­tĂĄs a sĂ©mĂĄban, amely jelentƑsen felgyorsĂ­tja a megoldĂĄst: korĂĄbban ilyen esetben az összes komponens vĂĄlaszainak szĂĄmolĂĄsi idejĂ©nek szorzatakĂ©nt dolgoztunk, most viszont az összegek szerint. Az osztĂĄs gyorsĂ­tĂĄsa Ă©rdekĂ©ben a kapcsolt grĂĄfot szĂŒksĂ©ges ĂĄtalakĂ­tani összefĂŒggƑvĂ©.

Hogyan kell ezt megtenni? Ha van egy grafikonban egy vĂĄgĂłpont, akkor pontosan ott kell ĂĄgaznunk. A vĂĄgĂłpont egy olyan csĂșcs, amelynek eltĂĄvolĂ­tĂĄsakor a grafikon elveszĂ­ti a kapcsolatossĂĄgĂĄt. A grafikonban az összes vĂĄgĂłpont megtalĂĄlhatĂł egy klasszikus algoritmus segĂ­tsĂ©gĂ©vel, lineĂĄris idƑ alatt. Ez a megközelĂ­tĂ©s jelentƑsen felgyorsĂ­tja az ĂĄgakra bontĂĄst.
Hogyan lehet NP-nehezen megoldható feladatokat paraméterezett algoritmusokkal megoldani
BĂĄrmelyik kiemelt csĂșcs eltĂĄvolĂ­tĂĄsakor a grafikon eltĂĄvolĂ­tja a kapcsolatossĂĄgait.

Ezt meg fogjuk tenni, de többre vĂĄgyunk. PĂ©ldĂĄul, keresni a grafikonban kis csĂșcsvĂĄgĂĄsokat Ă©s a csĂșcsok mentĂ©n vĂ©gezni az ĂĄgazĂĄst. A leghatĂ©konyabb mĂłdszer, amit ismerek a globĂĄlis minimĂĄlis csĂșcsvĂĄgĂĄs megtalĂĄlĂĄsĂĄra, a Gomori-Hu fa hasznĂĄlata, amely kubikus idƑ alatt Ă©pĂŒl. A PACE Challenge-ben a tipikus grafikon mĂ©rete nĂ©hĂĄny ezer csĂșcs. Ilyen körĂŒlmĂ©nyek között a rekursziĂł fĂĄjĂĄnak minden csĂșcsĂĄban milliĂĄrdnyi mƱveletet kell vĂ©grehajtani. EzĂ©rt a feladatot a rendelkezĂ©sre ĂĄllĂł idƑ alatt egyszerƱen lehetetlen megoldani.

PrĂłbĂĄljuk meg optimalizĂĄlni a megoldĂĄst. A pĂĄr csĂșcs közötti minimĂĄlis csĂșcsvĂĄgĂĄs bĂĄrmelyik maximĂĄlis ĂĄramot Ă©pĂ­tƑ algoritmussal megtalĂĄlhatĂł. Egy ilyen hĂĄlĂłzatra rĂĄ lehet vezĂ©nyelni Dinic algoritmusĂĄt, a gyakorlatban ez nagyon gyorsan mƱködik. GyanĂ­tom, hogy elmĂ©letileg bizonyĂ­tani lehet a futĂĄsi idƑre vonatkozĂł becslĂ©st Hogyan lehet NP-nehezen megoldhatĂł feladatokat paramĂ©terezett algoritmusokkal megoldani, ami mĂĄr teljesen elfogadhatĂł.

Többször megprĂłbĂĄltam vĂĄgĂĄsokat keresni vĂ©letlenszerƱ csĂșcsok között Ă©s a legjobban kiegyensĂșlyozottakat vĂĄlasztani. Sajnos a PACE Challenge nyĂ­lt tesztjein ez rossz eredmĂ©nyeket hozott. ÖsszehasonlĂ­tottam a csĂșcsok maximĂĄlis fokĂĄval foglalkozĂł algoritmussal, Ă©s korlĂĄtozva indĂ­tottam Ƒket a merĂŒlĂ©si mĂ©lysĂ©gre. MiutĂĄn az algoritmus megprĂłbĂĄlta Ă­gy megtalĂĄlni a vĂĄgĂĄst, a nagyobb mĂ©retƱ grafikonok maradtak. Ez azĂ©rt van, mert a vĂĄgĂĄsok nagyon kiegyensĂșlyozatlanok lettek: 5-10 csĂșcs eltĂĄvolĂ­tĂĄsĂĄval csupĂĄn 15-20 tudott levĂĄlni.

Érdemes megjegyezni, hogy a leggyorsabb algoritmusokkal kapcsolatos cikkekben sokkal kifinomultabb technikĂĄkat hasznĂĄlnak a vĂĄgĂĄsra szĂĄnt csĂșcsok kivĂĄlasztĂĄsĂĄra. Ezek a technikĂĄk nagyon bonyolult megvalĂłsĂ­tĂĄssal rendelkeznek, Ă©s gyakran rossz idƑ- Ă©s memĂłriabecslĂ©sekkel bĂ­rnak. Nem tudtam belƑlĂŒk kiemelni elfogadhatĂł megoldĂĄsokat a gyakorlat szĂĄmĂĄra.

Hogyan alkalmazzuk az egyszerƱsítési szabålyokat

MĂĄr van ötletĂŒnk a kernelizĂĄciĂłra. EmlĂ©keztetek:

  1. Ha van egy elszigetelt csĂșcs, tĂĄvolĂ­tsuk el.
  2. Ha van egy 1. fokĂș csĂșcs, töröljĂŒk, Ă©s vegyĂŒk a szomszĂ©djĂĄt vĂĄlaszkĂ©nt.
  3. Ha van legalĂĄbb egy 2. fokĂș csĂșcs, vegyĂŒk azt vĂĄlaszkĂ©nt. k + 1, vegyĂŒk vĂĄlaszkĂ©nt.

Az elsƑ kettƑ tiszta, a harmadik esetĂ©ben van egy trĂŒkk. Ha a vicces feladatban a bĂĄrra korlĂĄtozĂĄst adtunk meg, k, akkor a PACE Challenge-ban egyszerƱen meg kell talĂĄlni a lehetƑ legkisebb csĂșcsborĂ­tĂĄst. Ez a keresĂ©si feladatok (Search Problem) megoldĂĄsi feladatokkĂĄ (Decision Problem) törtĂ©nƑ tipikus ĂĄtalakĂ­tĂĄsa, gyakran nem tesznek kĂŒlönbsĂ©get a kĂ©tfĂ©le feladat között. A gyakorlatban, ha csĂșcsborĂ­tĂĄsi feladatot oldunk meg, a kĂŒlönbsĂ©g szĂĄmĂ­t. PĂ©ldĂĄul a harmadik pontban.

A megvalĂłsĂ­tĂĄs szempontjĂĄbĂłl kĂ©t mĂłdon jĂĄrhatunk el. Az elsƑ megközelĂ­tĂ©s az IteratĂ­v MĂ©lyĂ­tĂ©s. Ez abban ĂĄll, hogy elkezdĂŒnk egy Ă©sszerƱ alsĂł korlĂĄttal a vĂĄlaszra, Ă©s ezutĂĄn elindĂ­tjuk az algoritmusunkat, hasznĂĄlva ezt a korlĂĄtozĂĄst felsƑ korlĂĄtozĂĄskĂ©nt, nem mĂ©lyedve el a rekurziĂłban az alsĂł hatĂĄr alatt. Ha talĂĄlunk valamilyen vĂĄlaszt, az garantĂĄltan optimĂĄlis, kĂŒlönben növeljĂŒk ezt a korlĂĄtot egy egysĂ©ggel Ă©s Ășjra elindulunk.

A mĂĄsik megközelĂ­tĂ©s az, hogy tĂĄrolunk egy aktuĂĄlis optimĂĄlis vĂĄlaszt, Ă©s kisebb mĂ©retƱ vĂĄlaszt keresĂŒnk, ha megtalĂĄljuk, mĂłdosĂ­tva ezt a paramĂ©tert k a felesleges ĂĄgak levĂĄgĂĄsĂĄnak Ă©rdekĂ©ben a keresĂ©sben.

MiutĂĄn nĂ©hĂĄny Ă©jszakai kĂ­sĂ©rletet vĂ©geztem, egyesĂ­tettem ezeket a kĂ©t mĂłdszert: elƑször az algoritmusomat elindĂ­tom egy bizonyos keresĂ©si mĂ©lysĂ©g korlĂĄtozĂĄssal (Ășgy vĂĄlasztva, hogy ez elhanyagolhatĂł idƑt vegyen igĂ©nybe a fƑ megoldĂĄshoz kĂ©pest), Ă©s a legjobb megtalĂĄlt megoldĂĄst hasznĂĄlom mint felsƑ korlĂĄtozĂĄst – azaz ugyanezt k.

A 2. fokĂș csĂșcsok

A 0. Ă©s 1. fokĂș csĂșcsokkal tisztĂĄban vagyunk. KiderĂŒl, hogy a 2. fokĂș csĂșcsokkal is megtehetƑ, de ehhez összetettebb mƱveletek szĂŒksĂ©gesek a grĂĄfban.

Ehhez valahogyan jelölnĂŒnk kell a csĂșcsokat. NevezzĂŒk a 2. fokĂș csĂșcsot csĂșcsnak v, a szomszĂ©dait pedig csĂșcsoknak x Ă©s y. EzutĂĄn kĂ©t esetben lesz dolgunk.

  1. Amikor x Ă©s y — szomszĂ©dok. Ekkor vĂĄlaszkĂ©nt elfogadhatjuk, hogy x Ă©s y, Ă©s v törölni kell. ValĂłban, ebbƑl a hĂĄromszögbƑl legalĂĄbb kĂ©t csĂșcsnak szerepelnie kell a vĂĄlaszban, Ă©s biztosan nem veszĂ­tĂŒnk, ha vĂĄlasztunk x Ă©s y: valĂłszĂ­nƱleg van mĂ©g szomszĂ©djuk, a v nincs.
  2. Amikor x Ă©s y — nem szomszĂ©dok. Ekkor azt ĂĄllĂ­tjuk, hogy mindhĂĄrom csĂșcsot össze lehet ragasztani egybe. Az ötlet az, hogy ilyenkor van egy optimĂĄlis vĂĄlasz, amibe vagy v, vagy mindkĂ©t csĂșcsot x Ă©s ybe kell vennĂŒnk. RĂĄadĂĄsul az elsƑ esetben az összes szomszĂ©dot is be kell vennĂŒnk x Ă©s y, mĂ­g a mĂĄsodik esetben nem feltĂ©tlenĂŒl. Ez pontosan megfelel azoknak az eseteknek, amikor nem vesszĂŒk be a ragasztott csĂșcsot a vĂĄlaszba, Ă©s amikor belefoglaljuk. Csak annyit kell megjegyezni, hogy mindkĂ©t esetben az ilyen mƱvelet ĂĄltal adott vĂĄlasz egy egysĂ©ggel csökken.

Hogyan lehet NP-nehezen megoldható feladatokat paraméterezett algoritmusokkal megoldani

Érdemes megjegyezni, hogy az ilyen megközelĂ­tĂ©st tisztĂĄn lineĂĄris idƑ alatt meglehetƑsen nehĂ©z pontosan megvalĂłsĂ­tani. A csĂșcsok összeragasztĂĄsa bonyolult mƱvelet, szĂŒksĂ©ges a szomszĂ©dok listĂĄit lemĂĄsolni. Ha ezt nem figyelmesen csinĂĄljuk, akkor aszimptotikusan nem optimĂĄlis mƱködĂ©si idƑt kaphatunk (pĂ©ldĂĄul ha minden egyes összeragasztĂĄs utĂĄn sok Ă©lt mĂĄsolunk). LeĂĄlltam a 2 fokĂș csĂșcsokbĂłl ĂĄllĂł egĂ©sz utak keresĂ©sĂ©n, Ă©s sok egyedi eset, pĂ©ldĂĄul ilyen csĂșcsokbĂłl ĂĄllĂł ciklusok vizsgĂĄlatĂĄnĂĄl.

Ezen kĂ­vĂŒl szĂŒksĂ©ges, hogy ez a mƱvelet visszafordĂ­thatĂł legyen, hogy a rekurziĂłbĂłl valĂł visszatĂ©rĂ©skor a grĂĄfot az eredeti ĂĄllapotĂĄba tudjuk helyreĂĄllĂ­tani. Ennek biztosĂ­tĂĄsa Ă©rdekĂ©ben nem töröltem az összeragasztott csĂșcsok Ă©llistĂĄit, Ă­gy egyszerƱen tudtam, hogy mely Ă©leket hovĂĄ kell irĂĄnyĂ­tani. Az ilyen grĂĄfok megvalĂłsĂ­tĂĄsa is ĂłvatossĂĄgot igĂ©nyel, viszont biztosĂ­tja a tisztĂĄn lineĂĄris idƑt. A több tĂ­zezer Ă©lbƑl ĂĄllĂł grĂĄfok pedig jĂłl belefĂ©rnek a processzor gyorsĂ­tĂłtĂĄrĂĄba, ami nagy sebessĂ©gelƑnyöket biztosĂ­t.

LineĂĄris mag

VĂ©gĂŒl, a mag legĂ©rdekesebb rĂ©sze.

Kezdetben emlĂ©kezzĂŒnk arra, hogy bipartit grĂĄfokban a minimĂĄlis csĂșcsborĂ­tĂĄst Hogyan lehet NP-nehezen megoldhatĂł feladatokat paramĂ©terezett algoritmusokkal megoldanikereshetjĂŒk. Ehhez a Hopcroft-Karp algoritmust kell hasznĂĄlnunk a maximĂĄlis pĂĄrosĂ­tĂĄs megtalĂĄlĂĄsĂĄhoz, majd alkalmazni kell a König-EgervĂĄri tĂ©tele.

A lineĂĄris mag ötlete a következƑ: elƑször bipartit grĂĄfot kĂ©szĂ­tĂŒnk, azaz minden csĂșcs helyett v kĂ©t csĂșcsot hozunk lĂ©tre, Hogyan lehet NP-nehezen megoldhatĂł feladatokat paramĂ©terezett algoritmusokkal megoldani Ă©s Hogyan lehet NP-nehezen megoldhatĂł feladatokat paramĂ©terezett algoritmusokkal megoldanimĂ­g minden Ă©l helyett u — v kĂ©t Ă©lt teremtĂŒnk. Hogyan lehet NP-nehezen megoldhatĂł feladatokat paramĂ©terezett algoritmusokkal megoldani Ă©s Hogyan lehet NP-nehezen megoldhatĂł feladatokat paramĂ©terezett algoritmusokkal megoldaniA kapott grĂĄf bipartit lesz. MegkeressĂŒk benne a minimĂĄlis csĂșcsborĂ­tĂĄst. NĂ©hĂĄny csĂșcs az eredeti grĂĄfban kĂ©tszer, nĂ©hĂĄny egyszer, mĂ­g nĂ©hĂĄny egyĂĄltalĂĄn nem kerĂŒl be. A Nemhauser-Trotter-tĂ©tel szerint ilyenkor eltĂĄvolĂ­thatjuk azokat a csĂșcsokat, amelyek egyĂĄltalĂĄn nem szerepeltek, Ă©s vĂĄlaszthatjuk azokat, amelyek kĂ©tszer szerepeltek. TovĂĄbbĂĄ azt is mondja, hogy a megmaradt csĂșcsok közĂŒl (azok, amelyek egyszer szerepeltek) legalĂĄbb a felĂ©t vĂĄlasszuk ki a vĂĄlaszban.

Most tanultuk meg, hogy a grĂĄfban nem hagyunk több mint 2k csĂșcsot. Igaz, ha a vĂĄlaszban legalĂĄbb a csĂșcsok fele benne van, akkor az összes csĂșcs szĂĄma nem lehet több mint 2k.

Itt sikerĂŒlt egy kis elƑrelĂ©pĂ©st tennem. NyilvĂĄnvalĂł, hogy Ă­gy Ă©pĂ­tett mag egyĂĄltalĂĄn attĂłl fĂŒgg, hogy melyik minimĂĄlis csĂșcsborĂ­tĂĄst vĂĄlasztottuk a bipartit grĂĄfban. Azt szeretnĂ©nk, ha a megmaradt csĂșcsok szĂĄma minimĂĄlis lenne. Eddig ezt csak Hogyan lehet NP-nehezen megoldhatĂł feladatokat paramĂ©terezett algoritmusokkal megoldaniidƑ alatt tudtĂĄk megoldani. Én azonban kidolgoztam ennek az algoritmusnak a megvalĂłsĂ­tĂĄsĂĄt Hogyan lehet NP-nehezen megoldhatĂł feladatokat paramĂ©terezett algoritmusokkal megoldaniidƑ alatt, Ă­gy ezt a magot akĂĄr szĂĄzezres csĂșcsĂș grĂĄfokban is kereshetjĂŒk a branchenk minden egyes lĂ©pĂ©sĂ©ben.

Eredmény

A gyakorlat azt mutatja, hogy a megoldĂĄsom jĂłl mƱködik nĂ©hĂĄny szĂĄz csĂșcs Ă©s nĂ©hĂĄny ezer Ă©l tesztjein. Ilyen teszteknĂ©l teljesen elvĂĄrhatĂł, hogy a megoldĂĄs fĂ©l Ăłra alatt megtalĂĄlhatĂł legyen. A vĂĄlasz megtalĂĄlĂĄsĂĄnak esĂ©lye alapvetƑen nƑ, ha a grĂĄfban sok a nagy fokĂș csĂșcs, pĂ©ldĂĄul 10-es Ă©s annĂĄl nagyobb fokĂș.

A versenyhez a megoldĂĄsokat be kellett kĂŒldeni a optil.io. A bemutatott tĂĄblĂĄzat, a megoldĂĄsom a nyĂ­lt teszteken a hĂșszbĂłl a harmadik helyen ĂĄll, nagy kĂŒlönbsĂ©ggel a mĂĄsodik utĂĄn. Ha teljesen Ƒszinte akarok lenni, akkor nem teljesen vilĂĄgos, hogyan fogjĂĄk Ă©rtĂ©kelni a megoldĂĄsokat magĂĄn a versenyen: pĂ©ldĂĄul az Ă©n megoldĂĄsom kevesebb teszten teljesĂ­t, mint a negyedik helyezettĂ©, de azokban, amelyeket sikerĂŒlt megoldania, gyorsabban dolgozik.

A zĂĄrt teszteken elĂ©rt eredmĂ©nyek jĂșlius elsejĂ©n vĂĄlnak ismerttĂ©.

ForrĂĄs: habr.com

MegbĂ­zhatĂł hosting vĂĄsĂĄrlĂĄsa weboldalak szĂĄmĂĄra, DDoS vĂ©delemmel, VPS VDS szerverek. đŸ”„ MegbĂ­zhatĂł webtĂĄrhely vĂĄsĂĄrlĂĄsa DDoS vĂ©delemmel, VPS VDS szerverek | ProHoster