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.

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
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 , 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
, 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
kukucskĂĄlĂĄsra
â Ć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
. Ez mĂĄr jobb, de mĂ©g mindig nem lehet nap alatt kiszĂĄmolni mĂ©g egy erĆteljes klaszteren sem.

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
konfliktust tud megelĆzni. TehĂĄt, ha több mint
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
, é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
vendég megoldatlan sorssal: összesen
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
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
, 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 (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, () a Steiner-fĂĄnak keresĂ©sĂ©re () Ă©s a visszajelzĆ csĂșcs halmaz keresĂ©sĂ©re (). 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 (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 . A verseny rĂ©szleteirĆl tovĂĄbbi informĂĄciĂłt talĂĄlhatunk a , a korĂĄbbi Ă©vek eredmĂ©nyei pedig az alĂĄbbi helyen Ă©rhetĆk el .
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.
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.

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 , a gyakorlatban ez nagyon gyorsan mƱködik. GyanĂtom, hogy elmĂ©letileg bizonyĂtani lehet a futĂĄsi idĆre vonatkozĂł becslĂ©st
, 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:
- Ha van egy elszigetelt csĂșcs, tĂĄvolĂtsuk el.
- Ha van egy 1. fokĂș csĂșcs, töröljĂŒk, Ă©s vegyĂŒk a szomszĂ©djĂĄt vĂĄlaszkĂ©nt.
- 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.
- 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.
- 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.

Ă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
kereshetjĂŒk. kell hasznĂĄlnunk a maximĂĄlis pĂĄrosĂtĂĄs megtalĂĄlĂĄsĂĄhoz, majd alkalmazni kell a .
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,
és
mĂg minden Ă©l helyett u â v kĂ©t Ă©lt teremtĂŒnk.
és
A 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
idĆ alatt tudtĂĄk megoldani. Ăn azonban kidolgoztam ennek az algoritmusnak a megvalĂłsĂtĂĄsĂĄt
idĆ 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 . A bemutatott , 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
