Kuidas lahendada NP-raskusi parameetriliste algoritmide abil

Teadus- ja arendusprojekt on kahtlemata meie Ă”ppe kĂ”ige huvitavam osa. Idee on proovida oma valdkonnas kĂ€tte saada juba ĂŒlikoolis. NĂ€iteks lĂ€hevad tarkvaraarenduse ja masinĂ”ppe eriate ĂŒliĂ”pilased sageli tegema teadusprojekte ettevĂ”tetesse (peamiselt JetBrainsisse vĂ”i Yandexisse, kuid mitte ainult).

Selles postituses rÀÀgin ma oma projektist infotehnoloogia valdkonnas. Projekti kĂ€igus uurisin ja rakendasin praktikas lĂ€henemisviise ĂŒhe kĂ”ige tuntuma NP-raskete probleemide lahendamiseks: tippkatte probleem.

Praegu areneb kiiresti huvitav lĂ€henemine NP-rasketele probleemidele — parametrisestumine algoritmid. Üritan teid teemaga kursis hoida, rÀÀkida mĂ”nest lihtsast parametrisest algoritmist ja kirjeldada ĂŒht vĂ”imsat meetodit, mis on mulle vĂ€ga abiks olnud. Oma tulemusi esitlesin PACE Challenge'i vĂ”istlusel: avatud testide tulemuste pĂ”hjal on minu lahendus kolmandal kohal ning lĂ”plikud tulemused selguvad 1. juulil.

Kuidas lahendada NP-raskusi parameetriliste algoritmide abil

Kohal

Minu nimi on Vassili Aljofirov, hetkel lĂ”petan kolmandat kursust HSE (Rahvusvaheline Ülikool) Peterburis. Algoritmid huvitavad mind juba koolipĂ”lvest saadik, kui Ă”ppisin Moskvas 179. koolis ja osalesin edukalt infotehnoloogia olĂŒmpiaadidel.

LÔplik arv parametrizeeritud algoritmide spetsialiste astub baari...

NĂ€ide on vĂ”etud raamatust „Parameterized algorithms“

Kujutage ette, et olete baarimees vĂ€ikeses linnas. Igal reedel tuleb pool linna teie baari lÔÔgastuma, mis toob teile palju muret: peate vĂ€lja viskama rahutud kĂŒlastajad, et vĂ€ltida kaklusi. LĂ”puks hakkab see teid tĂŒĂŒtama ja otsustate vĂ”tta ette ennetavaid meetmeid.

Kuna teie linn on vĂ€ike, teate tĂ€pselt, millised paarid kĂŒlastajat kĂ”ige tĂ”enĂ€olisemalt omavahel tĂŒlitsevad, kui nad koos baari tulevad. Teil on nimekiri n inimesest, kes tulnud tĂ€na Ă”htul baari. Otsustate mitte lasta baari mingisuguseid linnaelanikke nii, et keegi ei kakleks. Samas ei taha teie ĂŒlemus kaotada tulu ja oleks pettunud, kui te ei lase baari rohkem kui k inimest.

Kahjuks on ĂŒlesanne teie ees klassikaline NP-raskete probleem. Te vĂ”isite seda teada kui tippkatte probleem, vĂ”i kuidas tippkatte ĂŒlesanne. Selliste ĂŒlesannete puhul ei ole ĂŒldjuhul teada algoritme, mis töötavad mĂ”istliku aja jooksul. Kui olla tĂ€pne, siis tĂ”endamata ja ĂŒsna tugev hĂŒpotees ETH (Exponential Time Hypothesis) ĂŒtleb, et seda ĂŒlesannet ei saa lahendada ajaga Kuidas lahendada NP-raskusi parameetriliste algoritmide abil, see tĂ€hendab, et oluliselt paremat lahendust kui tĂ€ielik proovimine pole vĂ”imalik leida. NĂ€iteks, oletame, et teie baari on tulemas n = 1000 inimest. Siis oleks tĂ€ielik proovimine Kuidas lahendada NP-raskusi parameetriliste algoritmide abil vĂ”imaluste arvu, mis on umbes Kuidas lahendada NP-raskusi parameetriliste algoritmide abil — meeletult palju. Õnneks on teie juhtkond seadnud teile piirangu k = 10, nii et kombinatsioonide arv, mida peate lĂ€bi vaatama, on palju vĂ€iksem: kĂŒmne elemendi alamhulkade arvu on Kuidas lahendada NP-raskusi parameetriliste algoritmide abil. See on juba parem, kuid ikkagi ei jĂ”ua te pĂ€evaga isegi vĂ”imsas klastris kĂ”iki kokku lugeda.
Kuidas lahendada NP-raskusi parameetriliste algoritmide abil
Kuna barikĂŒlastajate vahel on sellise pingelise suhte konfigureerimisega kakluste tĂ”enĂ€osus, ei tohi Bobi, Danieli ja Feodorit sisse lasta. Lahendus, kus jÀÀb vĂ€lja vaid kaks inimest, ei ole olemas.

Kas see tĂ€hendab, et on aeg alla anda ja kĂ”ik sisse lasta? Vaadakem teisi vĂ”imalusi. NĂ€iteks, vĂ”ib mitte lasta sisse ainult neid, kes vĂ”ivad kakelda vĂ€ga paljude inimestega. Kui keegi suudab kakelda vĂ€hemalt k + 1 teise inimesega, siis teda kindlasti ei tohi sisse lasta — vastasel juhul tuleb kĂ”ik k + 1 linnaelanikud, kellega ta kakelda vĂ”iks, vĂ€lja jĂ€tta, mis kindlasti hĂ€irib juhtkonda.

Oletame, et olete vĂ€lja visanud kĂ”ik, keda vĂ”isite, selle pĂ”himĂ”tte jĂ€rgi. Siis saavad kĂ”ik teised kakelda mitte rohkem kui k inimesega. Neist vĂ€lja visates k inimest, saate Ă€ra hoida mitte rohkem kui Kuidas lahendada NP-raskusi parameetriliste algoritmide abil konflikti. Seega, kui rohkem kui Kuidas lahendada NP-raskusi parameetriliste algoritmide abil inimest osaleb vĂ€hemalt ĂŒhes konfliktis, siis ei suuda te neid kĂ”iki Ă€ra hoida. Kuna, nagu selge, lastakse te kindlasti sisse tĂ€iesti konfliktitud inimesi, peate lĂ€bi vaatama kĂ”ik kĂŒmne suurused alamhulga kaheksast inimesest. Nende arv on umbes Kuidas lahendada NP-raskusi parameetriliste algoritmide abil, ja see operatsioonide arv on juba klastris iespējams lĂ€bi vaadata.

Kui on vĂ”imalik ohutult vĂ”tta vĂ€ga kokkusobivad inimesi, siis mis saab neist, kes osalevad vaid ĂŒhes konfliktis? Tegelikult saab ka neid lasta sisse, sulgedes ukse nende vastase ees. TĂ”si, kui Alice on konfliktis ainult Bobiga, siis kui me lubame sisse ainult Alice, ei kaota me midagi: Bobil vĂ”ivad olla teised konfliktid ja Alicel ei ole neid kindlasti. Veelgi enam, pole mĂ”tet mitte lubada mĂ”lemat. PĂ€rast selliseid operatsioone jÀÀb jĂ€rele mitte rohkem Kuidas lahendada NP-raskusi parameetriliste algoritmide abil kĂŒlalisi lahendamata saatusega: kokku on meil Kuidas lahendada NP-raskusi parameetriliste algoritmide abil konflikti, igas osalevad kaks osalist ja igaĂŒks osaleb vĂ€hemalt kahel. See tĂ€hendab, et jÀÀb vaid lĂ€bi töötada Kuidas lahendada NP-raskusi parameetriliste algoritmide abil varianti, mis vĂ”iks piisata poole pĂ€eva jooksul sĂŒlearvutis.

Tegelikult on lihtsate arutluste kaudu vĂ”imalik saavutada veelgi soodsamaid tingimusi. TĂ”dedes, et me peame kindlasti lahendama kĂ”ik vaidlused, st igast konfliktis osalevast paarist valima vĂ€hemalt ĂŒhe, keda me ei luba sisse. Vaatame sellist algoritmi: vĂ”tame mis tahes konflikti, kust eemaldame ĂŒhe osalise ja kĂ€ivitame rekursiivselt ĂŒlejÀÀnud, siis eemaldame teise ja kĂ€ivitame samuti rekursiivselt. Kuna me igal sammul kedagi vĂ€lja viskame, on algoritmi rekursiooni puu - binaarne puu sĂŒgavusega k, seega töötab algoritm kokku Kuidas lahendada NP-raskusi parameetriliste algoritmide abil, kus n — harude arv, ja m — servade arv. Meie nĂ€ites on see umbes kĂŒmme miljonit, mis arvutatakse mitte ainult sĂŒlearvutis, vaid isegi mobiiltelefonis sekundite jooksul.

Ülaltoodud nĂ€ide on nĂ€ide parameetrilisest algoritmist. Parameetrilised algoritmid on algoritmid, mis töötavad ajaga f(k) poly(n), kus p — polĂŒnoom, f — suvaline arvutatav funktsioon, ja k — mĂ”ni parameeter, mis vĂ”ib olla oluliselt vĂ€iksem ĂŒlesande suurusest.

KĂ”ik eelnevad arutelud viisid nĂ€itena kerneliseerimiseni — ĂŒks levinumaid tehnikaid parameetriseeritud algoritmide loomiseks. Kerneldamine on ĂŒlesande suuruse vĂ€hendamine vÀÀrtuseni, mis on piiratud parameetri funktsiooniga. Saadud ĂŒlesannet nimetatakse sageli tervikuks. Nii saime lihtsaid mĂ”tisklusi tippude astmete ĂŒle, et luua ruutjuur ĂŒlesanne Vertex Cover, mis on parameetriseeritud vastuse suurusega. On olemas ka teisi parameetreid, mida selle ĂŒlesande jaoks valida (nt Vertex Cover Above LP), kuid arutame just sellist parameetrit.

Pace Challenge

VĂ”istlus PACE Challenge (Parameetriseeritud algoritmide ja arvutuskatsete vĂ€ljakutse) sai alguse 2015. aastal, et luua link parameetriseeritud algoritmide ja praktikas kasutatavate lĂ€henemisviiside vahel arvutusprobleemide lahendamiseks. Esimesed kolm vĂ”istlust keskendusid puu laiuse leidmisele (Treewidth), Ć tejneri puu leidmisele (Steiner Tree) ja tippude kogumite leidmisele, mis lĂ”ikavad silmuseid (Feedback Vertex Set). Sel aastal oli ĂŒheks ĂŒlesande varasemate seas see, millele saime oma oskusi proovile panna, nimelt ĂŒlaltoodud ĂŒlesanne tippude katmiseks.

VĂ”istlus saavutab iga aastaga populaarsust. Eelinfo kohaselt osales sel aastal ainult tippude katmise probleemi lahendamise vĂ”istlusel 24 meeskonda. Tuleb mĂ€rkida, et vĂ”istlus ei kesta mitte paar tundi ega isegi nĂ€dalat, vaid mitu kuud. Meeskondadel on vĂ”imalus uurida kirjandust, vĂ€lja mĂ”elda oma originaalne idee ja proovida see ellu viia. Sisuliselt kujutab see vĂ”istlus endast uurimustööd. KĂ”ige tĂ”husamate lahenduste ideed ja auhindade jagamine toimub koos konverentsiga IPEC (Rahvusvaheline parameetriseeritud ja tĂ€pse arvutuse sĂŒmpoosion) Euroopa suurima igćčŽćșŠ algoritmilise kokkusaamise raames ALGO. TĂ€iendavat teavet vĂ”istluse kohta leiate veebisaidil, ja varasemate aastate tulemused on saadaval siit.

Lahenduse skeem

EttevĂ”tmiseks tippkatte ĂŒlesanne, olen proovinud rakendada parameetrilisi algoritme. Need koosnevad enamasti kahest osast: lihtsustamise reeglitest (mis ideaalis viivad kerneliseerimisele) ja jagamise reeglitest. Lihtsustamise reeglid on sisendi eeltöötlus polĂŒnoomi ajas. Nende reeglite rakendamise eesmĂ€rk on ĂŒlesande vĂ€hendamine ekvivalentseks vĂ€iksema suurusega ĂŒlesandeks. Lihtsustamise reeglid on algoritmi kĂ”ige kulukam osa ja just selle osa rakendamine viib ĂŒldise töötamise ajani. Kuidas lahendada NP-raskusi parameetriliste algoritmide abil nagu tavaline polĂŒnoomi aeg. Meie puhul pĂ”hinevad jagamise reeglid sellel, et iga tipu puhul tuleb vĂ”tta kas see vĂ”i tema naaber.

Üldine skeem on jĂ€rgmine: rakendame lihtsustamise reegleid, seejĂ€rel valime mingi tipu ja teeme kaks rekurssi kutsumist: esimeses vĂ”tame selle vastuseks, teises vĂ”tame kĂ”ik tema naabrid. Seda nimetame selle tipu jĂ€rgi jagamiseks (branching).

Skeemile lisatakse tĂ€pselt ĂŒks tĂ€iendav element jĂ€rgmises lĂ”igus.

Ideed jagamise (branching) reeglite jaoks

RÀÀkigem sellest, kuidas valida tipp, mille pÔhjal toimib jagamine.
Peamine idee on algoritmilises mÔttes vÀga ahne: vÔtame tipu maksimaalse astmega ja jagame selle jÀrgi. Miks tundub, et see on parem? Sest teises rekurssi kutsumise haru me seelÀbi eemaldame vÀga palju tippe. VÔime arvata, et jÀÀb vÀike graaf ja sellel me töötame kiiresti.

See lÀhenemine, mis koosneb juba arutatud lihtsatest kerneliseerimise tehnikatest, nÀitab end korralikult ja lahendab mÔningaid teste, mille suurus on mitu tuhat tippu. Kuid nÀiteks töötab see halvasti kuup-graafide puhul (st graafide, mille iga tipu aste on kolm).
On veel ĂŒks idee, mis pĂ”hineb piisavalt lihtsal mĂ”ttel: kui graaf on ĂŒhendamata, saab selle sidususe komponente sĂ”ltumatult lahendada, kombineerides vastused lĂ”puks. See on muide vĂ€ike lubatud modifikatsioon skeemis, mis kiirendab lahendust oluliselt: varem töötasime sellisel juhul vastuste komponentide loendamise aegade korrutise alusel, nĂŒĂŒd aga summeerime. Ja jagamise kiirendamiseks tuleb muuta ĂŒhendatud graaf ĂŒhendamatuks.

Kuidas seda teha? Kui graafis on lĂ”ikepunkt, tuleb just selle jĂ€rgi jaguneda. LĂ”ikepunkt on selline tipp, mille eemaldamisel kaotab graaf ĂŒhenduvuse. KĂ”iki lĂ”ikepunkte graafis saab leida klassikalise algoritmi abil lineaarse ajaga. Selline lĂ€henemine kiirendab oluliselt jagunemist.
Kuidas lahendada NP-raskusi parameetriliste algoritmide abil
Iga vĂ€lja toodud tipu eemaldamisel jaguneb graaf ĂŒhenduvuseks komponentideks.

Seda me teeme, kuid sooviksime rohkem. NĂ€iteks otsida graafis vĂ€ikseid tippude lĂ”ikeid ja jagada nende jĂ€rgi. KĂ”ige tĂ”husam tuntud viis minimaalse globaalse tippude lĂ”ike leidmiseks on kasutada Gomori-Hu puud, mis ehitatakse kubikaajas. PACE Challenge'is on tĂŒĂŒpiline graafi suurus mitu tuhat tippu. Sellise olukorra puhul peab iga rekursiooni tipu juures sooritama miljardeid toiminguid. Tundub, et antud aja jooksul selle ĂŒlesande lahendamine on lihtsalt vĂ”imatu.

Proovime lahendust optimeerida. Minimaalne tippude lÔige kahe tipuu vahel saab leida igasuguste algoritmide abil, mis ehitavad maksimaalset voolu. Saame sellele vÔrgule rakendada Dinitzi algoritmi, mis praktikas töötab vÀga kiiresti. Mul on kahtlus, et teoreetiliselt on vÔimalik tÔestada ajakulu hindamist Kuidas lahendada NP-raskusi parameetriliste algoritmide abil, mis on juba tÀiesti vastuvÔetav.

Olen proovinud mitu korda otsida lĂ”ikeid juhuslike tipude vahel ja vĂ”tta neist kĂ”ige tasakaalustatum. Kahjuks andis see PACE Challenge'i avatud testides halbu tulemusi. VĂ”rdlesin algoritmi, mis jagab maksimaalse astmega tipude jĂ€rgi, kĂ€ivitades neid sĂŒvendi sĂŒvenemise piiramisega. PĂ€rast algoritmi, mis pĂŒĂŒdis leida lĂ”iget sellisel viisil, jĂ€i alles suuremate suurustega graaf.

On tÀhelepanuvÀÀrne, et teoreetiliselt kiirete algoritmide artiklites kasutatakse palju arenenumaid tehnikaid tippude valimiseks jagamiseks. Need tehnikad on vÀga keerulise rakendusega ja neil on sageli halvad ajakulu ja mÀlu hinnangud. Ma ei suutnud neist vÀlja valida praktiliseks tÀiesti vastuvÔetavaid.

Kuidas rakendada lihtsustamise reegleid

Meil on juba kernelisatsiooni ideed. Tuletan meelde:

  1. Kui on isoleeritud tipp, eemaldada see.
  2. Kui on tipptase 1, eemaldage see ja vÔtke selle naaber vastuseks.
  3. Kui vÀhemalt on tipptase k + 1, vÔtke see vastuseks.

Kahes esimeses on kĂ”ik selge, kolmandaga on ĂŒks nĂ€pukas. Kui naljaliselt ĂŒlesandes baaris oli meil antud ĂŒlempiir k, siis PACE Challenge'is peame lihtsalt leidma minimaalsete tipupĂ”hjendustega katte. See on tĂŒĂŒpiline otsimisprobleemide (Search Problem) ja lahendamisprobleemide (Decision Problem) ĂŒleminek, sageli kahe probleemi vahel ei tehta vahet. Praktikas, kui me kirjutame tipukatte lahendajat, vĂ”ib vahe olla. NĂ€iteks nagu kolmandas punktis.

Rakenduse seisukohalt on vĂ”imalus lĂ€heneda kahel viisil. Esimene lĂ€henemine nimetatakse Iterative Deepening. See seisneb selles, et saame alustada mĂ”nelt mĂ”istlikult pĂ”hjalikes piirangutest ja kĂ€ivite edasi oma algoritmi, kasutades seda piirangut ĂŒlempiirina, mitte laskudes rekursioonidesse madalamale, kui see piirang. Kui oleme leidnud mingi vastuse, on see garanteeritult optimaalselt, vastasel juhul saame seda piirangut ĂŒhe vĂ”rra suurendada ja uuesti kĂ€ivitada.

Teine lÀhenemine on hoida mÔningat praegust optimaalse vastuse ja otsida vÀiksema suurusega vastust, muutes selle parameetri leides k liigne jooksu harude kiireks kÀrpimiseks.

PĂ€rast mitmeid öiseid eksperimente jĂ€in ma kahe meetodi kombinatsiooni juurde: kĂ”igepealt kĂ€ivitan oma algoritmi mingi otsimise sĂŒgavuse piirangu (valides selle nii, et see vĂ”taks vĂ”rreldes peamise lahenduse absoluutselt aeglaselt) ja kasutan parimat leitud lahendust ĂŒlempiirina - see tĂ€hendab seda k.

Tipud tasemel 2

Tipude tasemetega 0 ja 1 oleme koos olnud. Selgub, et sellist saab teha ka tippude tasemel 2, kuid selle jaoks on graafilt vaja keerukamaid operatsioone.

Selle selgitamiseks tuleb kuidagi nimetada tipud. Nimetame tasemel 2 tipu 'tipuks' v, ja selle naabriteks 'tipud' x ja y. Edasi on meil kaks juhtumit.

  1. Kui x ja y — naabrid. Siis saab vastuseks vĂ”tta x ja y, vaid v eemaldada. Ja tĂ”epoolest, sellest kolmnurgast tuleb vĂ€hemalt kaks tippu vĂ”tta vastuseks ja me ei kaota kindlasti, kui vĂ”tame x ja y: neil on tĂ”enĂ€oliselt veel naabreid ja v neil ei ole.
  2. Kui x ja y — mitte naabritega. Siis vĂ€idetakse, et kĂ”ik kolm tippu on vĂ”imalik kokku liita ĂŒheks. Idee on selles, et sel juhul on olemas optimaalne vastus, kuhu me vĂ”tame kas v, vĂ”i mĂ”lemad tippud x ja y. Tingimusel, et esimesel juhul peame vĂ”tma vastuseks kĂ”ik naabrid x ja y, aga teisel juhul ei ole see tingimata vajalik. See vastab tĂ€pselt juhtumitele, kui me ei vĂ”ta kokku liidetud tippu vastuseks ja kui vĂ”tame. Peab vaid mĂ€rkima, et mĂ”lemal juhul vĂ€heneb vastus pĂ€rast seda operatsiooni ĂŒhe vĂ”rra.

Kuidas lahendada NP-raskusi parameetriliste algoritmide abil

Tuleb mĂ€rkida, et sellise lĂ€henemise rakendamine ausalt lineaarses ajas on ĂŒsna keeruline. Tippude kokku liitmine on keeruline operatsioon, mille kĂ€igus tuleb kopida naaberlistid. Kui seda ei tehta ettevaatlikult, vĂ”ib tulemuseks olla asĂŒmptootiliselt mitteoptimaalne tööaeg (nĂ€iteks, kui pĂ€rast iga kokku liitmist kopeeritakse palju ÀÀriseid). Olen peatunud kahe astmega tippudest tervete teede leidmisega ja paljude erijuhtumite, nĂ€iteks tsĂŒklite, analĂŒĂŒsimisega nendest tippudest vĂ”i kĂ”igist neist, vĂ€lja arvatud ĂŒks.

Lisaks peab see operatsioon olema pööratav, et saaksime rekursioonist vĂ€lja naastes taastada graafi algse kujundi. Selle tagamiseks ei olen ma puhastanud kokku liidetud tippude ÀÀriste listid, pĂ€rast mida ma teadsin lihtsalt, kuhu ÀÀriseid suunata. Selline graafide teostamine nĂ”uab samuti ettevaatlikkust, kuid tagab ausa lineaarse aja. Ja paarikĂŒmne tuhande ÀÀrisega graafid mahuvad suurepĂ€raselt protsessori vahemĂ€lu, mis annab kiirusel suured eelised.

Lineaarne sĂŒdamik

LĂ”puks, kĂ”ige huvitavam osa sĂŒdamikust.

KÀesolevalt tuletame meelde, et kahepoolsetes graafides saab minimaalset tipu katet otsida Kuidas lahendada NP-raskusi parameetriliste algoritmide abil. Selleks tuleb kasutada algoritmi Hopcroft-Karpa , et leida sealt maksimaalne paaristamine, ja seejÀrel kasutada Königi-Egervari teoreemi..

Lineaarse sĂŒdamiku idee on jĂ€rgmine: esmalt jagame graafi kaheks, see tĂ€hendab, et iga tipu asemel v loome kaks tippu Kuidas lahendada NP-raskusi parameetriliste algoritmide abil ja Kuidas lahendada NP-raskusi parameetriliste algoritmide abil, ja iga ÀÀrise asemel u — v loome kaks ÀÀrist. Kuidas lahendada NP-raskusi parameetriliste algoritmide abil ja Kuidas lahendada NP-raskusi parameetriliste algoritmide abilSaadud graaf on kahetipuline. Leiame selles minimaalset tipu katet. Osad algse graafi tipud satuvad sinna kaks korda, osad ainult korra ja mĂ”ned – mitte kunagi. Nemhauseri-Trotteri teoreem vĂ€idab, et sel juhul vĂ”ib eemaldada tipud, mis ei sattunud kunagi, ja vastuseks vĂ”tta need, mis sisenesid kaks korda. Veelgi enam, see ĂŒtleb, et jÀÀnud tipud (need, mis sattusid ĂŒks kord) peavad vastusena andma vĂ€hemalt poole.

Just Ôppisime, kuidas jÀtta graafikesse mitte rohkem kui 2k tipu. Ja tÔepoolest, kui jÀÀb vastuseks vÀhemalt pool kÔigist tipudest, siis ei ole seal tippe rohkem kui 2k.

Siin olen suutnud teha vĂ€ikese edusammu. On selge, et sellisel viisil koostatud sĂŒda sĂ”ltub sellest, milline minimaalne tipu kate kahetipulises graafis me valisime. Sooviksin valida sellise, et jÀÀnud tippude arv oleks minimaalne. Varem osati seda teha ainult ajaga Kuidas lahendada NP-raskusi parameetriliste algoritmide abil. Mina olen aga vĂ€lja mĂ”elnud selle algoritmi rakenduse ajaga Kuidas lahendada NP-raskusi parameetriliste algoritmide abil, seega saab seda sĂŒda otsida graafides, kus on sadu tuhandeid tippe igal harutamisetapil.

Tulemus

Praktika nÀitab, et minu lahendus töötab hÀsti testidel, kus on mitu sada tippu ja mitu tuhat serva. Sellistel testidel vÔib oodata, et lahendus leitakse poole tunni jooksul. Vastuse leidmise tÔenÀosus tÔepoolest suureneb, kui graafis on piisavalt palju kÔrge sÔltuvuse tippe, nÀiteks sÔltuvus 10 ja rohkem.

VĂ”istlusel osalemiseks tuli lahendused saata aadressile optil.io. Kohtade tabeli pĂ”hjal, mis seal esitatud on, moodustab minu lahendus avatud testidel kolmanda koha kahekĂŒmnest suure eduga teisel kohal. Kui olla tĂ€iesti aus, siis ei ole pĂ€ris selge, kuidas lahendusi vĂ”istluse ajal hinnatakse: nĂ€iteks mu lahendus lĂ€bib vĂ€hem teste kui neljanda koha lahendus, kuid nendel, mis ta lĂ€bib, töötab kiiremini.Tulemused suletud testidel selguvad 1. juulil.

Teaduslik uurimistöö on ilmselt kĂ”ige huvitavam osa meie Ă”pingutest. Idee on selles, et juba ĂŒlikoolis proovida ennast valitud suunas.

Allikas: habr.com

Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid - ProHoster