Si si të zgjidhni probleme NP-të vështira duke përdorur algoritme parametrike

Puna kërkimore është ndoshta pjesa më interesante e studimeve tona. Ideja është që që në universitet të provoni veten në drejtimin e përzgjedhur. Për shembull, studentët që studiojnë Inxhinieri Softuerësh dhe Mësimin e Makinerive shpesh angazhohen në kërkime në kompani (shumica në JetBrains ose Yandex, por jo vetëm).

Në këtë post, do të flas për projektin tim në drejtimin e Shkencës Kompjuterike. Gjatë punës, kam studiuar dhe zbatuar në praktikë qasje për zgjidhjen e një prej problemeve më të njohura NP-të vështira: problemin e mbulimit të pikave.

Aktualisht, njĂ« qasje interesante Ă«shtĂ« duke u zhvilluar shumĂ« shpejt pĂ«r problemet NP-tĂ« vĂ«shtira — algoritmet parametrike. Do tĂ« pĂ«rpiqem t'ju fut nĂ« informacion, tĂ« flas pĂ«r disa algoritme parametrike tĂ« thjeshta dhe tĂ« pĂ«rshkruaj njĂ« metodĂ« tĂ« fuqishme qĂ« mĂ« ndihmoi shumĂ«. Rezultatet e mia i paraqita nĂ« garĂ«n PACE Challenge: pas testeve tĂ« hapura, zgjidhja ime zĂ« vendin e tretĂ«, ndĂ«rsa rezultatet pĂ«rfundimtare do tĂ« bĂ«hen tĂ« njohura mĂ« 1 Korrik.

Si si të zgjidhni probleme NP-të vështira duke përdorur algoritme parametrike

Rreth meje

MĂ« quajnĂ« Vasiliy Alfyorov, tani po pĂ«rfundoj vitin e tretĂ« nĂ« HSE — ShĂ«n Petersburg. UnĂ« merrem me algoritme qĂ« nga koha e shkollĂ«s, kur studioja nĂ« shkollĂ«n 179 tĂ« MoskĂ«s dhe kam marrĂ« pjesĂ« me sukses nĂ« olimpiadat e informatikĂ«s.

Numri i fundshëm i specializuarve në algoritmet parametrike po hyjnë në bar...

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

Imagjinoni qĂ« jeni roje i barit nĂ« njĂ« qytet tĂ« vogĂ«l. Çdo tĂ« premte, gjysma e qytetit vjen nĂ« barin tuaj pĂ«r t'u relaksuar, e kjo ju shkakton shumĂ« shqetĂ«sime: duhet tĂ« dilni nga bari vizitorĂ«t problematikĂ« pĂ«r tĂ« parandaluar pĂ«rleshjet. NĂ« fund tĂ« fundit, ju mĂ«rzitet dhe vendosni tĂ« merrni masa parandaluese.

Duke qenë se qyteti juaj është i vogël, e dini saktësisht se cilat palë vizitorësh kanë një probabilitet të madh të përleshen nëse hyjnë në bar së bashku. Keni një listë prej n njerëzish që do të vijnë sonte në bar. Vendosni të mos lejoni ndonjë qytetar në bar, në mënyrë që askush të mos përleshet. Në të njëjtën kohë, drejtuesit tuaj nuk duan të humbasin fitimin dhe do të jenë të pakënaqur nëse nuk lejoni më shumë se k njerëz.

Fatkeq, detyra qĂ« keni pĂ«rpara Ă«shtĂ« njĂ« detyrĂ« klasike NP-e vĂ«shtirĂ«. Mund tĂ« keni njohuri pĂ«r tĂ« si Mbulimi i Shenjave, ose si problemi i mbulimit tĂ« pikave. PĂ«r kĂ«to probleme, nĂ« pĂ«rgjithĂ«si nuk dihen algoritme qĂ« punojnĂ« brenda njĂ« kohe tĂ« pranueshme. NĂ«se jemi tĂ« saktĂ«, njĂ« hipotezĂ« e fortĂ« e paprovuar ETH (Hipoteza e KohĂ«s Eksponenciale) thotĂ« se ky problem nuk mund tĂ« zgjidhet nĂ« mĂ«nyrĂ« Si si tĂ« zgjidhni probleme NP-tĂ« vĂ«shtira duke pĂ«rdorur algoritme parametrike, domethĂ«nĂ« se nuk mund tĂ« mendoni asgjĂ« qĂ« punon dukshĂ«m mĂ« mirĂ« se shflektimi i plotĂ«. PĂ«r shembull, supozoni se nĂ« barin tuaj do tĂ« vijnĂ« n = 1000 njerĂ«z. KĂ«shtu qĂ« shflektimi i plotĂ« do tĂ« ketĂ« Si si tĂ« zgjidhni probleme NP-tĂ« vĂ«shtira duke pĂ«rdorur algoritme parametrike opsione, e cila Ă«shtĂ« afĂ«rsisht Si si tĂ« zgjidhni probleme NP-tĂ« vĂ«shtira duke pĂ«rdorur algoritme parametrike — jashtĂ«zakonisht shumĂ«. PĂ«r fat tĂ« mirĂ«, drejtimi juaj ka vendosur njĂ« kufizim k = 10, kĂ«shtu qĂ« numri i kombinimeve qĂ« duhet tĂ« shqyrtoni Ă«shtĂ« shumĂ« mĂ« i vogĂ«l: numri i nĂ«ngrupeve prej dhjetĂ« elementesh Ă«shtĂ« Si si tĂ« zgjidhni probleme NP-tĂ« vĂ«shtira duke pĂ«rdorur 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 të zgjidhni probleme NP-të vështira duke përdorur algoritme parametrike
Për të eliminuar mundësinë e një zënke në një konfiguratë të tillë të tensioneve midis vizitorëve të barit, duhet të mos lejoni Bobin, Danielin dhe Fyodorin. Zgjidhja, në të cilën mbeten jashtë vetëm dy, nuk ekziston.

A do tĂ« thotĂ« kjo se Ă«shtĂ« koha pĂ«r t'u dorĂ«zuar dhe pĂ«r tĂ« lĂ«nĂ« tĂ« gjithĂ« tĂ« hyjnĂ«? Le tĂ« shqyrtojmĂ« opsione tĂ« tjera. P.sh., mund tĂ« mos lejoni tĂ« hyjnĂ« ata qĂ« po e bĂ«jnĂ« kĂ«tĂ« me shumĂ« njerĂ«z. NĂ«se dikush mund tĂ« pĂ«rfshihet nĂ« njĂ« rrahje me tĂ« paktĂ«n k + 1 nĂ« njĂ« person tjetĂ«r, atĂ«herĂ« nuk duhet ta lejoni tĂ« hyjĂ« — pĂ«rndryshe do tĂ« duhet tĂ« mos lejoni tĂ« hyjnĂ« tĂ« gjithĂ« k + 1 banorĂ«t me tĂ« cilĂ«t ai mund tĂ« rrihen, qĂ« do tĂ« shqetĂ«sojĂ« menaxhmentin.

Supozojmë se i keni hequr të gjithë ata që mundet, sipas këtij parimi. Atëherë të gjithë të tjerët mund të përfshihen në konflikte me më shumë se k njerëz. Duke hequr nga ata k njerëz, mund të parandaloni më shumë se Si si të zgjidhni probleme NP-të vështira duke përdorur algoritme parametrike konflikte. Kështu që, nëse më shumë se Si si të zgjidhni probleme NP-të vështira duke përdorur algoritme parametrike njerëz janë të përfshirë në të paktën një konflikt, atëherë me siguri nuk do të keni mundësi t'i parandaloni të gjitha. Duke pasur parasysh se, natyrisht, do të lejoni ata që nuk janë konfliktualë, duhet të kontrolloni të gjitha nëngrupet me madhësi dhjetë nga dyqind njerëz. Janë afërsisht Si si të zgjidhni probleme NP-të vështira duke përdorur algoritme parametrike, dhe një numër i tillë operacionesh mund të shqyrtohet në një klaster.

Nëse është e mundur të marrim individë tërësisht jo konfliktualë, çfarë ndodh me ata që përfshihen në vetëm një konflikt? Në të vërtetë, ata gjithashtu mund të lejohet, duke mbyllur dyert para kundërshtarëve të tyre. E vërteta është, nëse Alisa ka një konflikt vetëm me Bobin, atëherë nëse e lejojmë Alisën, ne nuk do të humbasim: Bobi mund të ketë konflikte të tjera, ndërsa Alisa absolutisht nuk ka asnjë. Sidomos, është pa kuptim të mos lejojmë asnjë prej tyre. Pas këtyre operacioneve mbeten jo më shumë se Si si të zgjidhni probleme NP-të vështira duke përdorur algoritme parametrike vizitorë me fat të paqartë: në total kemi Si si të zgjidhni probleme NP-të vështira duke përdorur algoritme parametrike konflikte, secili me nga dy pjesëmarrës dhe çdo një prej tyre merr pjesë në të paktën dy. Kështu, na mbetet të kalojmë vetëm Si si të zgjidhni probleme NP-të vështira duke përdorur algoritme parametrike mundësi, që padyshim mund të përballet për një gjysmë ditë në një laptop.

NĂ« tĂ« vĂ«rtetĂ«, me arsyetim tĂ« thjeshtĂ« mund tĂ« arrijmĂ« kushte edhe mĂ« tĂ«rheqĂ«se. Vini re se duhet tĂ« zgjidhim tĂ« gjitha mosmarrĂ«veshjet, domethĂ«nĂ« nga çdo çift konfliktues tĂ« zgjedhim tĂ« paktĂ«n njĂ« person qĂ« nuk do ta lejojmĂ«. Le tĂ« shqyrtojmĂ« njĂ« algoritem tĂ« tillĂ«: tĂ« marrim çdo konflikt, tĂ« eliminojmĂ« njĂ« pjesĂ«marrĂ«s dhe tĂ« vazhdojmĂ« rekurivisht me tĂ« tjerĂ«t, pastaj tĂ« eliminojmĂ« tjetrin dhe gjithashtu tĂ« vazhdojmĂ« rekurivisht. Duke qenĂ« se nĂ« çdo hap heqim dikĂ«, pemĂ«n e rekursisĂ« sĂ« kĂ«tij algoritmi - njĂ« pemĂ« binarĂ« tĂ« thellĂ«sisĂ« k, prandaj algoritmi funksionon pĂ«r Si si tĂ« zgjidhni probleme NP-tĂ« vĂ«shtira duke pĂ«rdorur algoritme parametrike, ku n — numri i vendeve, dhe m — numri i rubrikave. NĂ« shembullin tonĂ«, kjo Ă«shtĂ« rreth dhjetĂ« milionĂ«, tĂ« cilat llogariten pĂ«r disa sekonda jo vetĂ«m nĂ« njĂ« laptop, por madje edhe nĂ« njĂ« telefon mobil.

Shembulli i lartpĂ«rmendur Ă«shtĂ« njĂ« shembull i algoritmit tĂ« parametrizuar. Algoritmet e parametrizuara janĂ« algoritme qĂ« funksionojnĂ« pĂ«r kohĂ« f(k) poly(n), ku p — polinom, f — funksion i llogaritur, dhe k — njĂ« parametr qĂ«, shumĂ« mundĂ«sisht, do tĂ« jetĂ« shumĂ« mĂ« i vogĂ«l se madhĂ«sia e problemit.

TĂ« gjitha arsyetimet deri nĂ« kĂ«tĂ« algoritem tregojnĂ« shembullin e kernelizimit — njĂ« nga teknikat e zakonshme pĂ«r krijimin e algoritmeve tĂ« parametrizuar. Kernelizimi Ă«shtĂ« reduktimi i madhĂ«sisĂ« sĂ« problemit nĂ« njĂ« vlerĂ« tĂ« kufizuar nga funksioni i parametrave. Problemi i marrĂ« shpesh quhet bĂ«rthamĂ«. KĂ«shtu, me argumentet e thjeshta mbi gradĂ«t e majave, kemi marrĂ« bĂ«rthamin katror pĂ«r problemin e Vertex Cover, tĂ« parametrizuar sipas madhĂ«sisĂ« sĂ« pĂ«rgjigjes. EkzistojnĂ« edhe parametro tĂ« tjerĂ« qĂ« mund tĂ« zgjidhen pĂ«r kĂ«tĂ« problem (p.sh., Vertex Cover Above LP), por ne do tĂ« diskutojmĂ« pikĂ«risht atĂ« parametrin.

Pace Challenge

Sfidë PACE Challenge (The Parameterized Algorithms and Computational Experiments Challenge) filloi në vitin 2015 për të krijuar lidhje midis algoritmeve të parametrizuara dhe qasjeve të përdorura në praktikë për zgjidhjen e problemeve të llogaritjes. Tre sfidat e para ishin dedikuar gjetjes së gjerësisë së pemës të grafikëve (Treewidth), gjetjes së pemës së Steinerit (Steiner Tree) dhe gjetjes së një grupi majash që prishin ciklet (Feedback Vertex Set). Në këtë vit, një nga problemet ku mund të provoni aftësitë tuaja ishte problemi i përmendur më lart i mbulimit të majave.

Garancia e kompeticionit po fiton popullaritet çdo vit. Nëse besojmë të dhënat paraprake, këtë vit vetëm në kompeticionin për zgjidhjen e problemit të mbulimit të pikave morën pjesë 24 ekipe. Vlen të theksohet se gara zgjat jo disa orë dhe as një javë, por disa muaj. Ekipet kanë mundësinë të studiojnë literaturën, të shpikin idenë e tyre origjinale dhe të përpiqen ta realizojnë atë. Në thelb, ky kompeticion është një punë hulumtuese. Idetë për zgjidhjet më efikase dhe shpallja e fituesve do të zhvillohet së bashku me konferencën IPEC (Simpoziumi Ndërkombëtar mbi Komputimin e Parametrit dhe atë të Saktë) brenda mbledhjes më të madhe vjetore algoritmike në Evropë ALGO. Informacione më të hollësishme rreth kompeticionit mund të gjenden në të internetit, ndërsa rezultatet e viteve të kaluara ndodhen këtu.

Schemi i zgjidhjes

Për të përballuar detyrën e mbulimit të kulmëve, fillova të aplikoj algoritme parametrizuese. Ato zakonisht përbëhen nga dy pjesë: rregullat e thjeshtimit (të cilat idealisht çojnë në kernelizim) dhe rregullat e ndarjes. Rregullat e thjeshtimit janë një përpunim i inputit në kohë polinomiale. Qëllimi i aplikimit të këtyre rregullave është reduktimi i detyrës në një detyrë ekuivalente të madhësisë më të vogël. Rregullat e thjeshtimit janë pjesa më e shtrenjtë e algoritmit, dhe aplikimi i kësaj pjese nxit kohën totale të funksionimit. Si si të zgjidhni probleme NP-të vështira duke përdorur algoritme parametrike në vend të një kohe të thjeshtë polinomiale. Në rastin tonë, rregullat e ndarjes bazohen në faktin se për çdo kulm duhet të marrim në përgjigje ose atë, ose fqinjën e tij.

Skema e përgjithshme është kështu: aplikojmë rregullat e thjeshtimit, pastaj zgjedhim një kulm dhe bëjmë dy thirrje rekurzive: në të parën e marrim në përgjigje, ndërsa në të dytën marrë të gjithë fqinjët e tij. Këtë e quajmë ndarjen (branching) sipas këtij kulmi.

Në këtë skemë do të bëhet vetëm një shtesë në paragrafit të ardhshëm.

Ide për rregullat e ndarjes (branching)

Le të flasim për mënyrën se si të zgjidhni kulmin në të cilin do të ndodhë ndarja.
Ideja kryesore është shumë lakmuese në kuptimin algoritmik: le të marrim kulmin me gradën maksimale dhe të ndajmë të saktë atë. Përse duket se kështu është më mirë? Sepse në degën e dytë të thirrjes rekursive, kështu do të heqim shumë kulme. Mund të pritet që të mbetet një grafik i vogël dhe në të do të punojmë shpejt.

Ky qasje me teknikat e thjeshta të diskutuara për kernelizimin tregon rezultate të mira, zgjidh disa teste me mijëra kulme. Por, për shembull, nuk punon mirë për grafet kubike (dmth, grafet ku gradë e çdo kulmi është e barabartë me tre).
Ekziston një ide tjetër, e cila bazohet në një mendim mjaft të thjeshtë: nëse grafiku është i çorganizuar, problemi i komponentëve të tij të lidhjes mund të zgjidhet në mënyrë të pavarur, duke bashkuar përgjigjet në fund. Kjo, për shënim, është një modifikim i vogël premtuar në skemë që do të përshpejtojë zgjidhjen: më parë në këtë rast ne punonim me produktin e kohëve të llogaritjes së përgjigjeve të komponentëve, tani punojmë me shumën. Për të përshpejtuar branchen, duhet ta kthejmë grafikun e lidhur në një të çorganizuar.

Si ta bëjmë këtë? Nëse në graf ekziston një pikë lidhjeje, ne duhet të branchojmë pikërisht mbi të. Pika e lidhjes është një kulm, të cilin nëse e heqim, grafiku humbet lidhjen. Gjetja e të gjitha pikave të lidhjes në graf mund të bëhet me një algoritëm klasik në kohë lineare. Ky qasje ndjeshëm e përshpejton branchen.
Si si të zgjidhni probleme NP-të vështira duke përdorur algoritme parametrike
Në heqjen e cilitdo nga kulmat e veçuar, grafiku do të ndahet në komponentë lidhjeje.

Këto ne do t'i bëjmë, por dëshirojmë më shumë. Për shembull, të kërkojmë në graf për prerjet e vogla të pikave dhe të kryejmë ndarjen përmes pikave prej saj. Mënyra më efektive që di për të gjetur prerjen minimale globale të pikave është të përdorim pemën Gomori-Hu, e cila ndërtoset në kohë kubike. Në PACE Challenge, madhësia tipike e grafit është disa mijëra pika. Në këtë situatë, në çdo pikë të pemës së rekurzionit, duhet të kryhen miliarda operacione. Kështu, të zgjidhet problemi në kohën e caktuar është thjesht e pamundur.

Le të përpiqemi të optimizojmë zgjidhjen. Prerja minimale e pikave midis një çifti pikash mund të gjenden me çdo algoritëm që ndërtin fluksin maksimal. Mund të aplikojmë në një rrjet të tillë algoritmin e Dinitzit, në praktikë ai funksionon shumë shpejt. Kam dyshime se teorikisht mund të provohet një vlerësim mbi kohën e punës Si si të zgjidhni probleme NP-të vështira duke përdorur algoritme parametrike, që tashmë është mjaft e pranueshme.

Kam provova disa herë të gjej prerjet midis palëve rastësore të kulmëve dhe të marr më të balancuarin prej tyre. Fatkeqësisht, në testet e hapura të PACE Challenge, kjo dha rezultate të dobëta. Krahasova me një algorithëm që ndante kulmët e maksimumit, duke i ekzekutuar me një kufi në thellësinë e zbritjes. Pas algorithmit që përpiqej të gjente prerje në këtë mënyrë, mbetën grafe më të mëdha. Kjo ndodh sepse prerjet ishin shumë të pabalancuara: duke fshirë 5-10 kulme, arriti të ndante vetëm 15-20.

Duhet theksuar se në artikujt për algoritmet teorikisht më të shpejtë, përdoren teknika shumë më të avancuara për zgjedhjen e kulmëve për ndarje. Këto teknika kanë një realizim shumë të ndërlikuar dhe shpeshherë kanë vlerësime të dobëta për çështjet e kohës dhe memories. Nuk arrita të identifikoj ndonjë prej tyre që do të ishin mjaft të pranueshme për praktikën.

Si të aplikoni rregullat e thjeshtimit

Ne tashmë kemi ide për kernelizimin. Kujtoj:

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

Me dy të parat gjithçka është e qartë, për të tretën ka një hile. Në problemin me barin, na është dhënë një kufizim të lartë në k, por në PACE Challenge duhet të gjeni thjesht një mbulim të majtë minimal të pikave. Ky është një transformim tipik i problemeve të kërkimit (Search Problem) në problemet e zgjidhjes (Decision Problem), shpesh nuk bëhet dallim mes dy llojeve të problemeve. Në praktikë, kur shkruajmë një zgjidhës për problemin e mbulimit të pikave, dallimi mund të jetë. Për shembull, siç është në pikën e tretë.

Nga pikëpamja e implementimit, mund të veprojmë në dy mënyra. Qasja e parë quhet Zgjatja Iterative. Ajo përbëhet në këtë mënyrë: ne mund të fillojmë me një kufizim të arsyeshëm të poshtëm për përgjigjen, dhe pastaj të nxjerrim algoritmin tonë, duke përdorur këtë kufizim si kufizim të lartë të përgjigjes, pa u zbritur në rekursivitet më poshtë se ky kufizim. Nëse gjejmë ndonjë përgjigje, ajo është garantuar të jetë optimale, përndryshe mund të rrisim këtë kufizim njësi dhe të fillojmë sërish.

Qasja tjetër është të mbajmë ndonjë përgjigje aktuale optimale dhe të kërkojmë një përgjigje më të vogël, duke e ndryshuar këtë parametër kur e gjejmë. k për të prerë më shumë degë të tepërta në kërkim.

Pas pasi disa eksperimente gjatĂ« natĂ«s, unĂ« u ndala nĂ« kombinimin e kĂ«tyre dy mĂ«nyrave: fillimisht e nis algoritmin tim me njĂ« kufizim mbi thellĂ«sinĂ« e kĂ«rkimit (duke e pĂ«rshtatur atĂ« nĂ« mĂ«nyrĂ« qĂ« tĂ« zĂ«rĂ« njĂ« kohĂ« tĂ« papĂ«rfillshme krahasuar me zgjidhjen kryesore) dhe e pĂ«rdor zgjidhjen mĂ« tĂ« mirĂ« tĂ« gjetur si kufizim tĂ« sipĂ«rm mbi pĂ«rgjigjen — dmth, mbi atĂ« tĂ« njĂ«jtĂ«n. k.

Majat e gradës 2

Me majat e gradës 0 dhe 1 u merakosëm. Doli që mund të bëhet kështu edhe me majat e gradës 2, por për këtë grafiku do të kërkojë operacione më të komplikuara.

Për ta shpjeguar këtë, duhet të shënohet siç duhet majat. Le të quhet maja e gradës 2 si maja v, dhe fqinjët e saj si maja x dhe y. Më pas do të kemi dy raste.

  1. Kur x dhe y — fqinjĂ«t. AtĂ«herĂ« mund tĂ« marrim nĂ« pĂ«rgjigje x dhe y, dhe v tĂ« eliminojmĂ«. Dhe vĂ«rtet, nga ky trekĂ«ndĂ«sh duhet tĂ« marrim tĂ« paktĂ«n dy maja nĂ« pĂ«rgjigje dhe ne nuk do tĂ« humbasim me tĂ« vĂ«rtetĂ«, nĂ«se marrim x dhe y: ndoshta ata kanĂ« ende fqinjĂ«, por v ata nuk i kanĂ«.
  2. Kur x dhe y — jo fqinjĂ«. AtĂ«herĂ« bĂ«het e qartĂ« se tĂ« gjitha tri majat mund tĂ« ngjiten nĂ« njĂ« tĂ« vetĂ«m. Ideja Ă«shtĂ« se nĂ« kĂ«tĂ« rast ka njĂ« pĂ«rgjigje optimale, nĂ« tĂ« cilĂ«n do tĂ« marrim ose v, ose tĂ« dy majat x dhe y. NĂ« fakt, nĂ« rastin e parĂ« do tĂ« detyrohemi tĂ« marrim nĂ« pĂ«rgjigje tĂ« gjithĂ« fqinjĂ«t. x dhe y, dhe nĂ« tĂ« dytĂ«n nuk Ă«shtĂ« e domosdoshme. Kjo pĂ«rputhet saktĂ«sisht me rastet kur ne nuk marrim majĂ«n e ngjitur nĂ« pĂ«rgjigje dhe kur e marrim. Duhet thĂ«nĂ« se nĂ« tĂ« dyja rastet pĂ«rgjigja nga njĂ« operacion i tillĂ« zvogĂ«lohet me njĂ« njĂ«sit.

Si si të zgjidhni probleme NP-të vështira duke përdorur algoritme parametrike

Vlen të theksohet se ky qasje është mjaft e vështirë për t'u realizuar me saktësi në një kohë të ndershme lineare. Bashkimi i majave është një operacion kompleks; duhet kopjuar listat e fqinjëve. Nëse kjo bëhet gabimisht, mund të kemi një kohë funksionimi asimptotike jo optimale (p.sh., nëse pas çdo bashkimi kopjojmë shumë ribë). 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ë kjo operacion të jetë e kthyeshme, në mënyrë që gjatë kthimit nga rekursiviteti të rivendosim grafikën në gjendjen fillestare. Për ta siguruar këtë, nuk e pastruan listën e skajeve të shkarkuara, pas së cilës thjesht e dija se cilat skaje duheshin dërguar ku. Një zbatim i tillë i grafikëve gjithashtu kërkon kujdes, por kujdesi siguron një kohë të ndershme lineare. Për grafikët me disa dhjetëra mijë skaje, kjo përputhet në cache-in e procesorit, që ofron përfitime të mëdha në shpejtësi.

Bërthama lineare

Së fundi, pjesa më interesante e bërthamës.

Për të filluar, le të kujtojmë se në grafikët bipartit, mbulimi minimal i majave mund të kërkohet për Si si të zgjidhni probleme NP-të vështira duke përdorur algoritme parametrike. Për këtë, duhet të përdorim algoritmin Hopcroft-Karp për të gjetur atje përputhjen maksimale, dhe pastaj të përdorim teoremën König-Egervari.

Ideja e bĂ«rthamĂ«s lineare Ă«shtĂ« kĂ«shtu: sĂ« pari do ta ndajmĂ« grafikĂ«n, dmth nĂ« vend tĂ« çdo maje v do tĂ« vendosim dy maja Si si tĂ« zgjidhni probleme NP-tĂ« vĂ«shtira duke pĂ«rdorur algoritme parametrike dhe Si si tĂ« zgjidhni probleme NP-tĂ« vĂ«shtira duke pĂ«rdorur algoritme parametrike, dhe nĂ« vend tĂ« çdo skaje u — v do tĂ« vendosim dy skaje Si si tĂ« zgjidhni probleme NP-tĂ« vĂ«shtira duke pĂ«rdorur algoritme parametrike dhe Si si tĂ« zgjidhni probleme NP-tĂ« vĂ«shtira duke pĂ«rdorur algoritme parametrike. Grafi i marrĂ« do tĂ« jetĂ« dy-anĂ«sh. Ne do tĂ« gjejmĂ« mbulimin minimal tĂ« pikave nĂ« tĂ«. Disa pika tĂ« grafit origjinal do tĂ« pĂ«rfshihen aty dy herĂ«, disa vetĂ«m njĂ« herĂ«, dhe disa asnjĂ«herĂ«. Teorema e Nemhauser-Trotter thotĂ« se nĂ« kĂ«tĂ« rast mund tĂ« fshijmĂ« pikat qĂ« nuk u pĂ«rfshinĂ« asnjĂ«herĂ« dhe tĂ« marrim nĂ« pĂ«rgjigje ato qĂ« u pĂ«rfshinĂ« dy herĂ«. MĂ« tej, ajo thotĂ« se nga pikat e mbetura (ato qĂ« u pĂ«rfshinĂ« njĂ« herĂ«) duhet tĂ« marrim nĂ« pĂ«rgjigje tĂ« paktĂ«n gjysmĂ«n e tyre.

Sapo mësuam të lëmë në grafik jo më shumë se 2k pikë. Në fakt, nëse në mbetje përgjigjja është të paktën gjysma e të gjitha pikave, atëherë gjatësia e totalit atje 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 kĂ«shtu varet nga cilat mbulime minimale tĂ« pikave nĂ« grafikun dy-anĂ«sh kemi marrĂ«. Do tĂ« dĂ«shironim tĂ« merrnim njĂ« tĂ« tillĂ«, nĂ« mĂ«nyrĂ« qĂ« numri i pikave tĂ« mbetura tĂ« ishte minimal. MĂ« parĂ«, kĂ«tĂ« mund ta bĂ«nim vetĂ«m pĂ«r njĂ« kohĂ« Si si tĂ« zgjidhni probleme NP-tĂ« vĂ«shtira duke pĂ«rdorur algoritme parametrike. UnĂ« kam menduar njĂ« implementim tĂ« kĂ«tij algoritmi pĂ«r njĂ« kohĂ« Si si tĂ« zgjidhni probleme NP-tĂ« vĂ«shtira duke pĂ«rdorur algoritme parametrike, kĂ«shtu qĂ« kjo bĂ«rthamĂ« mund tĂ« kĂ«rkohet nĂ« grafikĂ«t me qindra mijĂ«ra pikĂ« nĂ« çdo hap tĂ« branchening.

Rezultati

Praktika tregon se zgjidhja ime funksionon mirë në teste me disa qindra kapituj dhe disa mijëra degë. Në këto teste, është e arsyeshme të pritet se zgjidhja do të gjendet brenda gjysmë ore. Mundësia e gjetjes së përgjigjes brenda një kohe të pranueshme në parim rritet nëse grafiku ka mjaft shumë kapituj me shkallë të lartë, për shembull shkallë 10 e më lart.

Për të marrë pjesë në garë, zgjidhjet duhej të dërgoheshin në optil.io. Sipas tabelës aty tabelë, zgjidhja ime në testet e hapura zë vendin e tretë nga vingtë me një diferencë të madhe nga vendi i dytë. Nëse duhet të jem plotësisht i sinqertë, nuk është krejtësisht e qartë se si do të vlerësohen zgjidhjet në vetë garën: për shembull, zgjidhja ime kalon më pak teste se ajo në vendin e katërt, por në ato që kalon, punon më shpejt.

Rezultatet në testet e mbyllura do të bëhen të njohura më parë të korrikut.

Burimi: habr.com

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