Si si zgjidhin problemet NP-të vështira me algoritme parametrike

Puna kërkimore është, ndoshta, pjesa më interesante e edukimit tonë. Ideja është që edhe në universitet të provoni veten në drejtim të zgjedhur. Për shembull, studentët nga degët Software Engineering dhe Machine Learning shpesh kryejnë kërkime në kompani (në shumicën e rasteve, JetBrains ose Yandex, por jo vetëm).

Në këtë postim do të flas për projektin tim në fushën e Shkencës Kompjuterike. Në kuadër të punës, studova dhe implementova në praktikë qasje për zgjidhjen e një prej problemeve më të njohura NP-të vështira: problemi i mbulimit të majave.

Aktualisht, njĂ« qasje interesante ndaj problemeve NP-tĂ« vĂ«shtira po zhvillohet shumĂ« shpejt — algoritmet parametrike. Do tĂ« pĂ«rpiqem t'ju njoh me kĂ«tĂ« çështje, tĂ« flas pĂ«r disa algoritme parametrike tĂ« thjeshta dhe tĂ« pĂ«rshkruaj njĂ« metodĂ« tĂ« fuqishme, e cila mĂ« ka ndihmuar shumĂ«. Rezultatet e mia i prezantova nĂ« garĂ«n PACE Challenge: sipas testeve tĂ« hapura, zgjidhja ime zĂ« vendin e tretĂ«, dhe rezultatet pĂ«rfundimtare do tĂ« njoftohen mĂ« 1 korrik.

Si si zgjidhin problemet NP-të vështira me algoritme parametrike

Për vetë

Jam Vasily AlfĂ«rov, tani po pĂ«rfundoj vitin e tretĂ« nĂ« HSE — ShĂ«n Petersburg. MĂ« janĂ« pĂ«lqyer algoritmet qĂ« nga koha e shkollĂ«s kur isha nĂ« shkollĂ«n 179 tĂ« MoskĂ«s dhe merrja pjesĂ« me sukses nĂ« olimpiada tĂ« informatikĂ«s.

Një numër i fundit specialistësh për algoritmet parametrike hyjnë në një bar...

Shembulli është marrë nga libri «Algoritmet parametrike»

Imagjinoni se jeni roje nĂ« njĂ« bar nĂ« njĂ« qytet tĂ« vogĂ«l. Çdo tĂ« premte, gjysma e qytetit vjen nĂ« barin tuaj pĂ«r t'u relaksuar, çka ju shkakton shumĂ« telashe: duhet tĂ« nxirrni nga barra vizitorĂ«t e trazuar pĂ«r tĂ« parandaluar ndodhitĂ«. NĂ« fund tĂ« fundit, ju mĂ«rzitet dhe vendosni tĂ« merrni masa parandaluese.

Duke qenë se qyteti është i vogël, ju e dini përfundimisht se cilat çifte vizitorësh me probabilitet të lartë do të grinden nëse hynë në bar së bashku. Keni një listë të n personave që do të vijnë sonte në bar. Vendosni të mos i lejoni disa banorë në bar në një mënyrë që askush të mos përfshihet në një rrebesht. Në të njëjtën kohë, shefi juaj nuk dëshiron të humbasë fitimet dhe do të jetë i pakënaqur nëse nuk lejoni më shumë se k persona.

FatkeqĂ«sisht, problemi qĂ« keni pĂ«rpara Ă«shtĂ« njĂ« problem klasik NP-tĂ« vĂ«shtirĂ«. Mund tĂ« ketĂ« qenĂ« e njohur si Mbulimi i Majave, ose si pĂ«r problemin e mbulimit tĂ« pikave. PĂ«r kĂ«to lloje problemesh, nĂ« pĂ«rgjithĂ«si nuk dihen algoritma qĂ« funksionojnĂ« nĂ« njĂ« kohĂ« tĂ« pranueshme. NĂ«se jemi saktĂ«, hipoteza e pa provuar dhe mjaft e fortĂ« ETH (Hipoteza e KohĂ«s Eksponenciale) thotĂ« se ky problem nuk zgjidhet brenda njĂ« kohe Si si zgjidhin problemet NP-tĂ« vĂ«shtira me algoritme parametrike, dmth nuk ka ndonjĂ« zgjidhje qĂ« Ă«shtĂ« dukshĂ«m mĂ« e mirĂ« se sa pĂ«rmbytja e plotĂ«. PĂ«r shembull, le tĂ« supozojmĂ« se do tĂ« vijĂ« nĂ« barin tuaj n = 1000 njerĂ«z. Pastaj, pĂ«rmbytja e plotĂ« do tĂ« pĂ«rmbante Si si zgjidhin problemet NP-tĂ« vĂ«shtira me algoritme parametrike mundĂ«si, qĂ« Ă«shtĂ« pĂ«rafĂ«rsisht Si si zgjidhin problemet NP-tĂ« vĂ«shtira me algoritme parametrike — jashtĂ«zakonisht shumĂ«. PĂ«r fat tĂ« mirĂ«, udhĂ«heqja juaj ju ka vĂ«nĂ« njĂ« kufi k = 10, kĂ«shtu qĂ« numri i kombinimeve qĂ« duhet tĂ« shqyrtoni Ă«shtĂ« shumĂ« mĂ« i vogĂ«l: numri i nĂ«ngrupeve me dhjetĂ« elemente Ă«shtĂ« Si si zgjidhin problemet NP-tĂ« vĂ«shtira me algoritme parametrike. Kjo Ă«shtĂ« mĂ« mirĂ«, por pĂ«rsĂ«ri nuk do tĂ« numĂ«rohet brenda njĂ« dite madje as nĂ« njĂ« klaster tĂ« fuqishĂ«m.
Si si zgjidhin problemet NP-të vështira me algoritme parametrike
Për të përjashtuar mundësinë e një rrethimi në një konfigurim të tillë të tensioneve ndërmjet vizitorëve të barit, duhet të mos lejoni Bobin, Danielin dhe Fyodorin. Zgjidhjet, ku ngelën vetëm dy, nuk ekzistojnë.

A do tĂ« thotĂ« kjo se Ă«shtĂ« koha tĂ« dorĂ«zoheni dhe tĂ« lejoni tĂ« gjithĂ«? Le tĂ« shqyrtojmĂ« mundĂ«si tĂ« tjera. Pra, pĂ«r shembull, mund tĂ« mos lejoni vetĂ«m ata qĂ« pĂ«rballen me njĂ« numĂ«r shumĂ« tĂ« madh njerĂ«zish. NĂ«se dikush mund tĂ« pĂ«rballet me tĂ« paktĂ«n k + 1 njerĂ«z tĂ« tjerĂ«, atĂ«herĂ« ai nuk duhet lejuar — pĂ«rndryshe do tĂ« duhet tĂ« mos lejoni tĂ« gjithĂ« k + 1 banorĂ«t, me tĂ« cilĂ«t mund tĂ« pĂ«rballet, qĂ« do tĂ« shqetĂ«sojĂ« udhĂ«heqjen.

Le të supozojmë se keni hequr të gjithë ata që mundët me këtë parim. Pastaj, të gjithë të tjerët mund të përballen me më shumë se k njerëz. Duke hequr prej tyre k njerëz, mund të parandaloni më shumë se Si si zgjidhin problemet NP-të vështira me algoritme parametrike konflikte. Kështu, nëse gjithsej më shumë se Si si zgjidhin problemet NP-të vështira me algoritme parametrike njerëz marrin pjesë në të paktën një konflikt, atëherë me siguri nuk do të mund të parandaloni të gjithë. Gjithashtu, është e qartë se njerëzit që fare nuk kanë konflikte duhet patjetër t'i lejoni, kështu që duhet të shqyrtoni të gjitha nëngrupet me madhësi dhjetë nga dyqind njerëz. Ato janë përafërsisht Si si zgjidhin problemet NP-të vështira me algoritme parametrike, dhe një sasi e tillë operimesh tashmë mund të shqyrtohet në një klaster.

Nëse mund të marrim personalitete tërësisht jo konfliktuale, çfarë ndodh me ata që marrin pjesë vetëm në një konflikt? Në të vërtetë, ata gjithashtu mund të priten, duke mbyllur dyert përpara kundërshtarit të tyre. Në fakt, nëse Alicia ka një konflikt vetëm me Bobin, nëse pranojmë Alician nga ata dy, ne nuk do të humbim: Bobi mund të ketë konflikte të tjera, ndërsa Alicia sigurisht nuk ka. Për më tepër, është pa kuptim të mos lejojmë asnjërin. Pas këtyre operacioneve, mbeten jo më shumë se Si si zgjidhin problemet NP-të vështira me algoritme parametrike mysafirë me fatin e pazgjidhur: gjithsej kemi Si si zgjidhin problemet NP-të vështira me algoritme parametrike konflikte, ku secili ka dy pjesëmarrës dhe secili merr pjesë të paktën në dy. Pra, mbetet të zgjidhen vetëm Si si zgjidhin problemet NP-të vështira me algoritme parametrike mundësi, që mjafton për të llogaritur brenda një gjysmë dite në një laptop.

NĂ« tĂ« vĂ«rtetĂ«, me arsyetim tĂ« thjeshtĂ« mund tĂ« arrijmĂ« kushte edhe mĂ« atraktive. VĂ«rejmĂ« se na nevojitet tĂ« zgjidhim tĂ« gjitha mosmarrĂ«veshjet, pra nga çdo çift konfliktual tĂ« zgjedhim tĂ« paktĂ«n njĂ« njeri, qĂ« nuk do ta pranojmĂ«. Le tĂ« shqyrtojmĂ« njĂ« algoritĂ«m tĂ« tillĂ«: tĂ« marrim ndonjĂ« konflikt, nga i cili heqim njĂ« pjesĂ«marrĂ«s dhe tĂ« fillojmĂ« rekursivisht nga pjesa qĂ« mbetet, pastaj tĂ« heqim tjetrin dhe gjithashtu tĂ« fillojmĂ« rekursivisht. Duke qenĂ« se nĂ« çdo hap heqim dikĂ«, struktura e rekursions sĂ« kĂ«tij algoritmi Ă«shtĂ« njĂ« pemĂ« binarĂ« me thellĂ«si k, pra algoritmi punon pĂ«r njĂ« total prej Si si zgjidhin problemet NP-tĂ« vĂ«shtira me algoritme parametrikeindex n – numri i majave, dhe m – numri i faltave. NĂ« shembullin tonĂ«, ky numĂ«r Ă«shtĂ« rreth dhjetĂ« milionĂ«, qĂ« llogaritet pĂ«r shpejtĂ«si nĂ«n sekonda jo vetĂ«m nĂ« laptop, por edhe nĂ« njĂ« telefon mobil.

Shembulli i mĂ«sipĂ«rm Ă«shtĂ« njĂ« shembull i algoritmit tĂ« parametrizuar. Algoritmet e parametrizuar janĂ« ato algoriteme qĂ« punojnĂ« nĂ« kohĂ« f(k) poly(n)index p – polinom, f – funksion i llogaritshĂ«m, dhe k – ndonjĂ« parameter, i cili, Ă«shtĂ« tepĂ«r mundshĂ«m, do tĂ« jetĂ« shumĂ« herĂ« mĂ« i vogĂ«l se madhĂ«sia e problemit.

TĂ« gjitha arsyetimet deri nĂ« kĂ«tĂ« algoritĂ«m çojnĂ« nĂ« shembullin kĂ«rnelizimit — njĂ« nga teknikĂ«t e zakonshme pĂ«r krijimin e algoritmĂ«ve tĂ« parameterizuar. Kernelizimi Ă«shtĂ« zvogĂ«limi i madhĂ«sisĂ« sĂ« detyrĂ«s nĂ« njĂ« vlerĂ« tĂ« kufizuar nga funksioni i parametrave. Detyra e marrĂ« shpesh quhet bĂ«rthamĂ«. KĂ«shtu, me arsyetime tĂ« thjeshta mbi shkallĂ«t e pikĂ«ve, arritĂ«m njĂ« bĂ«rthame katrore pĂ«r detyrĂ«n e Vertex Cover, e parametrizuar sipas madhĂ«sisĂ« sĂ« pĂ«rgjigjes. EkzistojnĂ« edhe parametra tĂ« tjerĂ« qĂ« mund tĂ« zgjidhen pĂ«r kĂ«tĂ« detyrĂ« (pĂ«r shembull, Vertex Cover Above LP), por ne do tĂ« diskutojmĂ« pikĂ«risht kĂ«tĂ« parametrin.

Pace Challenge

Garë PACE Challenge (The Parameterized Algorithms and Computational Experiments Challenge) u themelua në vitin 2015 për të vendosur lidhjen midis algoritmëve të parametrizuar dhe qasjeve që përdoren në praktikë për zgjidhjen e problemeve kompjuterike. Garat e para tre ishin të dedikuara për kërkimin e gjerësi së pemës së grafit (Treewidth), kërkimin e pemës së Steinert (Steiner Tree) dhe kërkimin e një grupi pikash që prishin ciklet (Feedback Vertex Set). Në këtë vit, një nga detyrat në të cilat mund të provoheshin aftësitë ishte detyra e mbuluar nga pika e përmendur më sipër.

Gara po fiton popullaritet çdo vit. Nëse besoni të dhënat paraprak, këtë vit në garën për zgjidhjen e detyrës së mbulimit të pikave morën pjesë 24 ekipe. Vlen të theksohet se gara nuk zgjat disa orë dhe as një javë, por disa muaj. Ekipet kanë mundësinë të studiojnë literaturën, të mendojnë një ide origjinale dhe të përpiqen ta realizojnë atë. Në thelb, kjo garë përfaqëson një punë kërkimore. Ideja e zgjidhjeve më efektive dhe shpallja e fituesve do të ndodhin së bashku me konferencën IPEC (International Symposium on Parameterized and Exact Computation) brenda mbledhjes më të madhe vjetore algorithmi në Europë ALGO. Informacione më të hollësishme mbi garën vetë mund të gjenden në website, dhe rezultatet e viteve të kaluara janë të vendosura këtu.

Schemi i zgjidhjes

Për të përballuar detyrën e mbulimit të majave, provova të aplikoj algoritme të parametrizuara. Ato, në përgjithësi, përbëhen nga dy pjesë: rregullat e thjeshtimit (të cilat në mënyrë ideale çojnë në kernelizim) dhe rregullat e ndarjes. Rregullat e thjeshtimit janë një përgatitje e hyrjes në kohë polinomiale. Qëllimi i aplikimit të këtyre rregullave është të reduktojë detyrën në një detyrë ekuivalente me një madhësi më të vogël. Rregullat e thjeshtimit janë pjesa më e kushtueshme e algoritmit, dhe aplikimi i kësaj pjesë çon në një kohë totale të funksionimit Si si zgjidhin problemet NP-të vështira me algoritme parametrike në vend të kohës së thjeshtë polinomiale. Në rastin tonë, rregullat e ndarjes janë të bazuara në faktin se për çdo majë duhet të marrim si përgjigje ose atë, ose fqinjën e saj.

Schemi i përgjithshëm është ky: aplikojmë rregullat e thjeshtimit, pastaj zgjedhim ndonjë majë dhe bëjmë dy thirrje_recursive: në të parën ne e marrim atë si përgjigje, ndërsa në të dytën marrim të gjithë fqinjët e saj. Kjo e quajmë ndarje (brancho) nëpërmjet kësaj maje.

Në këtë skemë do të bëhet pikërisht një shtesë në paragrafin e ardhshëm.

Ide për rregullat e ndarjes (brancho)

Le të diskutojmë si të zgjedhim një majë, për të cilën do të ndodhë ndarja.
Ideja kryesore është shumë lakmitare në kuptimin algoritmik: le të marrë një majë me gradë maksimale dhe të ndajmë përmes saj. Pse duket se kështu është më mirë? Sepse në degën e dytë të thirrjes_recursive ne në këtë mënyrë do të heqim shumë maja. Mund të presim se do të mbeten një grafik i vogël dhe mbi të do të punojmë shpejt.

Ky qasje me teknikat e thjeshta të diskutuar për kernelizimin tregon rezultate të mira, zgjidh disa teste me mijëra maja. Por, për shembull, nuk funksionon mirë për grafikat kubike (domethënë grafikat, ku grada e çdo maje është e barabartë me tre).
Ka një ide tjetër, e bazuar në një mendim mjaft të thjeshtë: nëse grafiku është i palidhur, detyrën mbi komponentët e tij lidhur mund ta zgjidhim në mënyrë të pavarur, duke kombinuar përgjigjet në fund. Kjo, për fat të keq, është një modifikim i vogël i premtuar në skemë, që do të përshpejtojë zgjidhjen: më parë në një rast të tillë ne punonim me shumën e kohëve të llogaritjes së përgjigjeve të komponentëve, ndërsa tani punojmë me shifrën e tyre. Dhe për të përshpejtuar ndarjen, duhet të kthejmë grafikun e lidhur në një grafik të palidhur.

Si si e bërë? Nëse grafi ka një pikë bashkimi, duhet të branchojmë pikërisht aty. Pika e bashkimin është maja e tillë, me zhdukje të së cilës grafi humbet lidhshmërinë. Të gjitha pikët e bashkimit në graf mund të gjenden me një algoritëm klasik në kohë lineare. Ky qasje ndjeshëm përshpejton branchoimin.
Si si zgjidhin problemet NP-të vështira me algoritme parametrike
Me heqjen e cilësdo prej kulmëve të veçuara, grafi do të shpërbëhet në componente lidhshmërie.

Këtë do ta bëjmë, por dëshirojmë më shumë. Për shembull, të kërkojmë në graf prerje të vogla kulmore dhe të kryejmë ndarje sipas kulmëve në të. Mënyra më efikase që e njoh për të gjetur prerjen minimale globale kulmore është të përdorim pemën Gomori-Hu, e cila ndërtohet në kohë kubike. Në PACE Challenge, përmasat tipike të grafit janë disa mijëra kulme. Në këtë rast, në secilën kulm të recursit duhen kryer miliarda operacione. Kështu, zgjidhja e problemit brenda kohës së caktuar është thjesht e pamundur.

Le të përpiqemi të optimizojmë zgjidhjen. Prerja minimale kulmore midis një çifti kulmesh mund të gjendet me ndihmën e çdo algoritmi që ndërton fluks maksimal. Mund të përdorim në një rrjet të tillë algoritmin e Dinic, në praktikë ai punon shumë shpejt. Kam dyshime se teorikisht është e mundur të provohet një vlerësim për kohën e funksionimit Si si zgjidhin problemet NP-të vështira me algoritme parametrike, që është tashmë mjaft e pranueshme.

Kam provuar disa herë të kërkoj prerje midis çifteve të kulmeve të rastësishme dhe të marr nga ato më të balancuara. Fatkeqësisht, në provat e hapura të PACE Challenge, kjo jap një rezultat të keq. Kam krahasuar me algoritmin që ndan në kulmet me gradën maksimale, duke i drejtuar ato me një kufizim në thellësinë e zbritjes. Pas algoritmit që përpiqet të gjejë prerjen në këtë mënyrë, mbetën grafe të mëdha. Kjo është për shkak se prerjet ishin shumë të papërshtatshme: duke hequr 5-10 kulme, arrinim të izolojmë vetëm 15-20.

Duhet të theksohet se në artikujt që flasin për algoritmet më të shpejta teorike, përdoren teknika shumë më të avancuara për zgjedhjen e kulmeve për ndarje. Këto teknika kanë një realizim shumë të komplikuar dhe shpesh ofrojnë vlerësime të dobëta për kohën dhe kujtesën. Nuk arrita të theksoj ndonjë nga to si mjaft të pranueshme për praktikën.

Si të aplikoni rregullat e thjeshtimit

Kemi tashmë ide për kernelizimin. Më kujtohet:

  1. Nëse ka një kulm të izoluar, hiqeni atë.
  2. Nëse ka një kulm me gradë 1, hiqeni atë dhe merrni fqinjit e saj si përgjigje.
  3. Nëse ka një kulm me gradë të paktën k + 1, merreni atë si përgjigje.

Me dy të parat gjithçka është e qartë, me të tretin ka një hile. Nëse në problemin e humorit rreth barit na u dha një kufizim të sipërm për k, në PACE Challenge thjesht duhet të gjejmë një mbulim kulmor të madhësisë minimale. Ky është një transformim tipik i problemeve të kërkimit (Search Problem) në problemet e zgjidhjes (Decision Problem), shpesh nuk bëhet ndonjë dallim midis dy llojeve të problemeve. Në praktikë, nëse ne shkruajmë një zgjidhës për problemin e mbulimit kulmor, dallimi mund të ekzistojë. Për shembull, siç është në pikën e tretë.

Nga pikëpamja e zbatimit, mund të veprohet në dy mënyra. Qasja e parë quhet Iterative Deepening. Ajo përbëhet nga kjo: ne mund të fillojmë me një kufizim të arsyeshëm poshtë për përgjigjen, dhe më pas të fillojmë algoritmin tonë duke përdorur këtë kufizim si kufizim të sipërm për përgjigjen, pa shkuar në rekursivë më poshtë se ky kufizim. Nëse kemi gjetur një përgjigje, ajo është garantuar të jetë optimale, ndryshe mund të rrisim këtë kufizim me një dhe të fillojmë përsëri.

Qasja tjetër është të mbajmë një ndonjë përgjigje aktuale optimale dhe të kërkojmë një përgjigje me një madhësi më të vogël, duke ndryshuar këtë parametër kur e gjejmë k për të bërë ndonjë prerje të madhe të degëve të kota në kërkim.

Pas disa eksperimenteve gjatĂ« natĂ«s, u ndala te kombinimi i kĂ«tyre dy mĂ«nyrave: fillimisht e filloj algoritmin tim me njĂ« kufizim pĂ«r thellĂ«sinĂ« e kĂ«rkimit (duke e zgjedhur atĂ«, qĂ« tĂ« marrĂ« njĂ« kohĂ« tĂ« parĂ«ndĂ«sishme nĂ« krahasim me zgjidhjen kryesore) dhe e pĂ«rdor zgjidhjen mĂ« tĂ« mirĂ« tĂ« gjetur si kufizim tĂ« sipĂ«rm pĂ«r pĂ«rgjigjen — pra, pĂ«r ate tĂ« njĂ«jtĂ«n k.

Kulmet me gradë 2

Me kulmet me gradë 0 dhe 1 e dimë. Raste që kjo mund të bëhet edhe me kulmet me gradë 2, por për këtë do të kërkohen operacione më të ndërlikuara në graf.

Për ta shpjeguar këtë, duhet ndonjëherë të shënohet kulmi. Le ta quajmë kulmin me gradë 2 si kulm v, dhe fqinjit e tij si kulmet x dhe y. Më pas do të kemi dy raste.

  1. Kur x dhe y — fqinjit. AtĂ«herĂ« mund tĂ« marrim si pĂ«rgjigje x dhe y, ndĂ«rsa v heqim. Dhe me tĂ« vĂ«rtetĂ«, nga ky trekĂ«ndĂ«sh duhet tĂ« marrim sĂ« paku dy kulme nĂ« pĂ«rgjigje dhe ne me siguri nuk do tĂ« humbasim, nĂ«se marrim x dhe y: ndoshta kanĂ« edhe fqinj tjetĂ«r, ndĂ«rsa v ata nuk kanĂ«.
  2. Kur x dhe y — nuk janĂ« fqinj. AtĂ«herĂ« pretendohet se tĂ« tri majat mund tĂ« ngjiten nĂ« njĂ«. Ideja Ă«shtĂ« qĂ« nĂ« kĂ«tĂ« rast ka njĂ« odgovor optimal, nĂ« tĂ« cilin do tĂ« marrim ose v, ose tĂ« dy majat x dhe y. NdĂ«rsa nĂ« rastin e parĂ« do tĂ« duhet tĂ« marrim nĂ« pĂ«rgjigje tĂ« gjithĂ« fqinjĂ«t x dhe y, ndĂ«rsa nĂ« tĂ« dytin nuk Ă«shtĂ« e domosdoshme. Kjo saktĂ«sisht pĂ«rputhet me rastet kur ne nuk marrim majĂ«n e ngjitur nĂ« pĂ«rgjigje dhe kur marrim. Mbetet vetĂ«m tĂ« theksojmĂ« se nĂ« tĂ« dy rastet, pĂ«rgjigja nga njĂ« operacion i tillĂ« zvogĂ«lohet me njĂ« njĂ«si.

Si si zgjidhin problemet NP-të vështira me algoritme parametrike

Duket se ky qasje është mjaft e komplikuar për t'u realizuar me saktësi në kohë lineare. Ngjitja e majave është një operacion kompleks, duhet të kopjoni listat e fqinjëve. Nëse kjo nuk bëhet me kujdes, mund të merrni një kohë funksionimi asimptotikisht jo optimale (p.sh., nëse pas çdo ngjitjeje kopjoni shumë boshte). U ndala në kërkimin e rrugëve të plota nga majat me gradë 2 dhe analizimin e shumë rasteve të veçanta, si ciklet nga këto maja ose nga të gjitha këto maja përveç një.

Për më tepër, është e nevojshme që ky operacion të jetë i kthyeshëm, në mënyrë që gjatë kthimit nga rekursioni të rikthejmë grafikun në formën e tij fillestare. Për ta siguruar këtë, nuk e pastruar listat e boshteve të majave të bashkuara, pasi e dija thjesht se cilat boshte duhej të dërgoheshin në cilin drejtim. Kjo realizim e grafikëve gjithashtu kërkon kujdes, por siguron kohë të drejtë lineare. Dhe për grafikët me disa dhjetëra mijëra boshte, ajo përshtatet mirë në cache-in e procesorit, që jep përparësi të mëdha në shpejtësi.

Nukleusi lineare

Së fundi, pjesa më interesante e nukleusit.

Për të filluar, le të kujtojmë se në grafikët bipartit minimal mbulimi i majave mund të kërkohet për Si si zgjidhin problemet NP-të vështira me algoritme parametrike. Për këtë nevojitet të shfrytëzohet algoritmi Hopcroft-Karp për të gjetur aty përputhjen maksimale, dhe më pas të shfrytëzojmë teoremën Köning-Egervari.

Ideja e nukleusit linear Ă«shtĂ« kĂ«shtu: fillimisht e dyfishojmĂ« grafikĂ«n, dmth nĂ« vend tĂ« çdo maja v ngremĂ« dy maja Si si zgjidhin problemet NP-tĂ« vĂ«shtira me algoritme parametrike dhe Si si zgjidhin problemet NP-tĂ« vĂ«shtira me algoritme parametrike, dhe nĂ« vend tĂ« çdo boshte u — v ngremĂ« dy boshte Si si zgjidhin problemet NP-tĂ« vĂ«shtira me algoritme parametrike dhe Si si zgjidhin problemet NP-tĂ« vĂ«shtira me algoritme parametrikeGrafiku i marrĂ« do tĂ« jetĂ« dypartiak. Ne do tĂ« gjejmĂ« mbulimin minimal tĂ« qosheve nĂ« tĂ«. Disa qoshe tĂ« grafikut fillestar do tĂ« bien aty dy herĂ«, disa vetĂ«m njĂ« herĂ«, dhe disa asnjĂ«herĂ«. Teorema e Nemhauser-Trotter thotĂ« se nĂ« kĂ«tĂ« rast mund tĂ« hiqen qoshet qĂ« nuk kanĂ« rĂ«nĂ« asnjĂ«herĂ« dhe tĂ« merret si pĂ«rgjigje atyre qĂ« ra dy herĂ«. MĂ« shumĂ« se kaq, ajo thotĂ« se nga qoshet e mbetura (ato qĂ« kanĂ« rĂ«nĂ« njĂ« herĂ«), duhet tĂ« merret si pĂ«rgjigje tĂ« paktĂ«n gjysma.

Sapo mësuam të lëmë në graf më pak se 2k qoshe. Në të vërtetë, nëse në mbetje përgjigja është të paktën gjysma e të gjitha qosheve, atëherë numri i përgjithshëm i qosheve nuk është më shumë se 2k.

KĂ«tu arrita tĂ« bĂ«j njĂ« hap tĂ« vogĂ«l pĂ«rpara. ËshtĂ« e qartĂ« se bĂ«rthama e ndĂ«rtuar nĂ« kĂ«tĂ« mĂ«nyrĂ« varet nga cili mbulim minimal i qosheve nĂ« grafikun dypartiak kemi marrĂ«. DĂ«shironi tĂ« merrni njĂ« tĂ« tillĂ« qĂ« numri i qosheve tĂ« mbetura tĂ« jetĂ« minimal. MĂ« parĂ«, kjo ka qenĂ« e mundur tĂ« bĂ«het vetĂ«m pĂ«r njĂ« kohĂ« Si si zgjidhin problemet NP-tĂ« vĂ«shtira me algoritme parametrike. UnĂ« shpika njĂ« realizim tĂ« kĂ«tij algoritmi pĂ«r njĂ« kohĂ« Si si zgjidhin problemet NP-tĂ« vĂ«shtira me algoritme parametrike, kĂ«shtu qĂ« kjo bĂ«rthamĂ« mund tĂ« kĂ«rkohet nĂ« grafika me qindra mijĂ«ra qoshe nĂ« çdo etapĂ« tĂ« branchnimit.

Rezultati

Praktika tregon se zgjidhja ime funksionon mirë në testet me disa qindra qoshe dhe disa mijëra brezash. Në këto teste, është plotësisht e mundur të pritet që zgjidhja të gjendet brenda gjysmë ore. Shtysa për të gjetur një përgjigje brenda një kohe të pranueshme në parim rritet nëse në grafik ka mjaft qoshe me grado të madhe, për shembull grado 10 dhe më sipër.

Për të marrë pjesë në garë, zgjidhjet duhej të dërgoheshin në optil.io. Duke gjykuar nga tabela e paraqitur atje tabelë, zgjidhja ime në testet e hapura zë vendin e tretë nga vinte me shumë distancë nga vendi i dytë. Nëse të jesh krejtësisht i sinqertë, nuk është krejtësisht e qartë se si do të vlerësohen zgjidhjet në garën e vërtetë: për shembull, zgjidhja ime kalon më pak teste se zgjidhja e vendit të katërt, por në ato që kalon, funksionon më shpejt.

Rezultatet në testet e mbyllura do të bëhen të njohura më parë se 1 korriku.

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster