Carane Ngatasi Masalah NP-Hard karo Algoritma Parameterized

Karya riset bisa uga minangka bagean paling menarik saka latihan kita. Ide iki kanggo nyoba dhewe ing arah sing dipilih nalika isih ing universitas. Contone, siswa saka bidang Teknik Perangkat Lunak lan Pembelajaran Mesin asring nindakake riset ing perusahaan (utamane JetBrains utawa Yandex, nanging ora mung).

Ing kirim iki aku bakal ngomong babagan proyekku ing Ilmu Komputer. Minangka bagéan saka karya, Aku sinau lan sijine menyang laku pendekatan kanggo mecahaken salah siji saka masalah NP-hard paling misuwur: masalah panutup vertex.

Saiki, pendekatan sing menarik kanggo masalah NP-hard berkembang kanthi cepet - algoritma parameter. Aku bakal nyoba kanggo njaluk sampeyan nganti cepet, marang sawetara algoritma parameterized prasaja lan njlèntrèhaké siji cara kuat sing mbantu kula kathah. Aku nampilake asilku ing kompetisi PACE Challenge: miturut asil tes mbukak, solusiku njupuk posisi kaping telu, lan asil pungkasan bakal dingerteni tanggal 1 Juli.

Carane Ngatasi Masalah NP-Hard karo Algoritma Parameterized

Babagan aku

Jenengku Vasily Alferov, aku saiki ngrampungake taun katelu ing Sekolah Tinggi Ekonomi Universitas Riset Nasional - St. Aku wis kasengsem ing algoritma wiwit jaman sekolah, nalika aku sinau ing Moscow sekolah No. 179 lan kasil melu ing Olimpiade ilmu komputer.

Sawetara spesialis ing algoritma parameterisasi mlebu bar...

Conto dijupuk saka buku "Algoritma Parameter"

Bayangake sampeyan minangka penjaga keamanan bar ing kutha cilik. Saben dina Jumuah, setengah kutha teka ing bar sampeyan kanggo ngendhokke, sing menehi akeh masalah: sampeyan kudu mbuwang pelanggan sing rame metu saka bar kanggo nyegah gelut. Pungkasane, sampeyan bakal kesel lan mutusake kanggo njupuk langkah-langkah pencegahan.

Wiwit kutha sampeyan cilik, sampeyan ngerti persis sing pasangan pelanggan sing bakal perang yen padha rampung ing bar bebarengan. Apa sampeyan duwe dhaptar n wong sing bakal teka ing bar bengi iki. Sampeyan mutusake supaya sawetara warga kutha metu saka garis tanpa ana wong sing gelut. Ing wektu sing padha, panggedhe sampeyan ora pengin kelangan bathi lan bakal ora seneng yen sampeyan ora menehi luwih saka k wong.

Sayange, masalah sadurunge sampeyan masalah NP-hard klasik. Sampeyan bisa uga ngerti dheweke minangka Tutup Vertex, utawa minangka masalah panutup vertex. Kanggo masalah kasebut, ing kasus umum, ora ana algoritma sing bisa digunakake ing wektu sing bisa ditampa. Kanggo tepat, hipotesis sing durung kabukten lan cukup kuat ETH (Exponential Time Hypothesis) ujar manawa masalah iki ora bisa ditanggulangi ing wektu. Carane Ngatasi Masalah NP-Hard karo Algoritma Parameterized, yaiku, sampeyan ora bisa mikir apa-apa sing luwih apik tinimbang telusuran lengkap. Contone, umpamane ana wong sing bakal teka ing bar sampeyan n = 1000 Manungsa. Banjur telusuran lengkap bakal Carane Ngatasi Masalah NP-Hard karo Algoritma Parameterized opsi sing ana kira-kira Carane Ngatasi Masalah NP-Hard karo Algoritma Parameterized - jumlah edan. Untunge, manajemen sampeyan wis menehi watesan k = 10, dadi jumlah kombinasi sing kudu diulang luwih cilik: jumlah subset saka sepuluh unsur yaiku Carane Ngatasi Masalah NP-Hard karo Algoritma Parameterized. Iki luwih apik, nanging isih ora bakal dietung ing dina malah ing kluster kuat.
Carane Ngatasi Masalah NP-Hard karo Algoritma Parameterized
Kanggo ngilangke kamungkinan saka perang ing konfigurasi iki hubungan tegang antarane pengunjung bar, sampeyan kudu supaya Bob, Daniel lan Fedor metu. Ora ana solusi sing mung bakal ditinggalake loro.

Apa iki tegese wektu kanggo nyerah lan ngidini kabeh wong mlebu? Ayo dipikirake opsi liyane. Contone, sampeyan ora bisa nglilani mung wong-wong sing bisa perang karo wong sing akeh banget. Yen wong bisa perang ing paling karo k+1 wong liya, mula sampeyan mesthi ora bisa nglilani dheweke mlebu - yen ora, sampeyan kudu nyegah kabeh wong metu k+1 warga kutha, karo kang bisa perang, kang mesthi bakal upset pimpinan.

Ayo sampeyan mbuwang kabeh wong sing bisa miturut prinsip iki. Banjur wong liya bisa perang karo ora luwih saka k wong. Mbuwang metu k wong, sampeyan bisa nyegah ora luwih saka Carane Ngatasi Masalah NP-Hard karo Algoritma Parameterized konflik. Iki tegese yen ana luwih saka Carane Ngatasi Masalah NP-Hard karo Algoritma Parameterized Yen wong melu paling ora siji konflik, sampeyan mesthi ora bisa nyegah kabeh. Amarga, mesthine, sampeyan bakal ngidini wong sing ora ana konflik, sampeyan kudu ngliwati kabeh subset ukuran sepuluh saka rong atus wong. Ana kira-kira Carane Ngatasi Masalah NP-Hard karo Algoritma Parameterized, lan jumlah operasi iki wis bisa diurutake ing kluster.

Yen sampeyan bisa kanthi aman njupuk individu sing ora duwe konflik babar pisan, banjur apa sing melu mung siji konflik? Nyatane, dheweke uga bisa dilebokake kanthi nutup lawang mungsuh. Pancen, yen Alice ing konflik mung karo Bob, banjur yen kita supaya Alice metu saka wong loro, kita ora bakal kelangan: Bob bisa duwe konflik liyane, nanging Alice mesthi ora duwe. Kajaba iku, ora ana gunane yen kita ora nglilani kita loro. Sawise operasi kasebut ora ana maneh Carane Ngatasi Masalah NP-Hard karo Algoritma Parameterized tamu karo nasib unresolved: kita duwe mung Carane Ngatasi Masalah NP-Hard karo Algoritma Parameterized konflik, saben karo loro peserta lan saben melu ing paling loro. Dadi sing isih ana yaiku ngurutake Carane Ngatasi Masalah NP-Hard karo Algoritma Parameterized opsi, kang bisa gampang dianggep setengah dina ing laptop.

Nyatane, kanthi alesan prasaja sampeyan bisa entuk kahanan sing luwih menarik. Elinga yen kita mesthi kudu ngrampungake kabeh perselisihan, yaiku, saka saben pasangan sing konflik, pilih paling ora siji wong sing ora bakal dilebokake. Ayo nimbang algoritma ing ngisor iki: njupuk konflik apa wae, saka ngendi kita mbusak siji peserta lan rekursif diwiwiti saka sisa, banjur copot liyane lan uga diwiwiti kanthi rekursif. Awit kita mbuwang wong ing saben langkah, wit rekursi saka algoritma kasebut minangka wit binar sing jero k, supaya ing total algoritma dianggo ing Carane Ngatasi Masalah NP-Hard karo Algoritma Parameterizedngendi n iku nomer vertex, lan m - jumlah iga. Ing conto kita, iki kira-kira sepuluh yuta, kang bisa diwilang ing pamisah detik ora mung ing laptop, nanging malah ing ponsel.

Tuladha ing ndhuwur minangka tuladha algoritma parameterized. Algoritma parameter yaiku algoritma sing mlaku ing wektu f(k) poli(n)ngendi p - polinomial, f iku sawijining fungsi komputasi kasepakatan, lan k - sawetara parameter, sing, bisa uga, bakal luwih cilik tinimbang ukuran masalah.

Kabeh pertimbangan sadurunge algoritma iki menehi conto kernelisasi minangka salah sawijining teknik umum kanggo nggawe algoritma parameter. Kernelisasi yaiku nyuda ukuran masalah menyang nilai sing diwatesi dening fungsi parameter. Masalah sing diasilake asring diarani kernel. Mangkono, kanthi alesan prasaja babagan derajat vertex, kita entuk kernel kuadrat kanggo masalah Vertex Cover, parameterized dening ukuran jawaban. Ana opsi liyane sing bisa dipilih kanggo tugas iki (contone, Vertex Cover Ndhuwur LP), nanging iki pilihan kita bakal ngrembug.

Pace Challenge

Kompetisi Tantangan PACE (The Parameterized Algorithm and Computational Experiments Challenge) lair ing 2015 kanggo nggawe sambungan antarane algoritma parameter lan pendekatan sing digunakake ing praktik kanggo ngatasi masalah komputasi. Telung kompetisi pisanan dikhususake kanggo nemokake jembar wit grafik (Wit Wit), nggoleki wit Steiner (Wit Steiner) lan nggoleki sakumpulan simpul sing ngethok siklus (Umpan balik Vertex Set). Taun iki, salah sawijining masalah sing bisa dicoba yaiku masalah panutup vertex sing kasebut ing ndhuwur.

Kompetisi iki entuk popularitas saben taun. Yen sampeyan yakin karo data awal, taun iki 24 tim melu kompetisi kanggo ngrampungake masalah sing nutupi puncak. Wigati dicathet yen kompetisi ora suwene sawetara jam utawa malah seminggu, nanging sawetara wulan. Tim duwe kesempatan kanggo sinau sastra, nggawe ide asli dhewe lan nyoba ngetrapake. Intine, kompetisi iki minangka proyek riset. Gagasan kanggo solusi sing paling efektif lan menehi penghargaan marang para pemenang bakal dianakake bebarengan karo konferensi kasebut IPEC (Simposium Internasional babagan Komputasi Parameter lan Tepat) minangka bagean saka rapat algoritma taunan paling gedhe ing Eropa ALGO. Informasi sing luwih rinci babagan kompetisi kasebut bisa ditemokake ing situs, lan asil taun-taun sadurunge ngapusi kene.

Diagram solusi

Kanggo ngatasi masalah panutup vertex, aku nyoba nggunakake algoritma parameterized. Biasane kasusun saka rong bagean: aturan nyederhanakake (sing saenipun nyebabake kernelization) lan aturan pamisah. Aturan simplifikasi yaiku preprocessing input ing wektu polinomial. Tujuane ngetrapake aturan kasebut yaiku kanggo nyuda masalah kasebut dadi masalah sing luwih cilik sing padha. Aturan nyederhanakake minangka bagean paling larang saka algoritma, lan aplikasi bagean iki ndadékaké total wektu mlaku Carane Ngatasi Masalah NP-Hard karo Algoritma Parameterized tinimbang wektu polinomial prasaja. Ing kasus kita, aturan pamisah adhedhasar kasunyatan sing kanggo saben vertex sampeyan kudu njupuk salah siji utawa pepadhamu minangka jawaban.

Skema umum yaiku: kita ngetrapake aturan nyederhanakake, banjur pilih sawetara vertex, lan nggawe rong panggilan rekursif: ing kawitan kita njupuk kanggo nanggepi, lan ing liyane kita njupuk kabeh tanggi. Iki sing diarani pamisah (cabang) ing sadawane vertex iki.

Persis siji tambahan bakal digawe kanggo skema iki ing paragraf sabanjure.

Gagasan kanggo aturan pamisah (brunching).

Ayo ngrembug babagan carane milih vertex sing bakal dipisahake.
Ide utama banget rakus ing pangertèn algoritma: ayo njupuk titik paling dhuwur lan dibagi. Kok koyone luwih apik? Amarga ing cabang kapindho telpon rekursif kita bakal mbusak akeh vertex kanthi cara iki. Sampeyan bisa ngandelake grafik cilik sing isih ana lan kita bisa nggarap kanthi cepet.

Pendekatan iki, kanthi teknik kernelisasi prasaja sing wis dibahas, nuduhake dhewe kanthi apik lan ngrampungake sawetara tes kanthi ukuran sawetara ewu simpul. Nanging, umpamane, ora bisa digunakake kanthi apik kanggo grafik kubik (yaiku, grafik sing tingkat saben vertex telung).
Ana gagasan liyane adhedhasar gagasan sing cukup prasaja: yen grafik wis pedhot, masalah ing komponen sing disambungake bisa ditanggulangi kanthi mandiri, nggabungake jawaban ing pungkasan. Iki, kanthi cara, minangka modifikasi cilik sing dijanjekake ing skema kasebut, sing bakal nyepetake solusi kanthi signifikan: sadurunge, ing kasus iki, kita kerja kanggo prodhuk wektu kanggo ngitung respon komponen, nanging saiki kita kerja kanggo jumlah. Lan kanggo nyepetake ngepang, sampeyan kudu ngowahi grafik sing disambungake dadi pedhot.

Carane nindakake? Yen ana titik artikulasi ing grafik, sampeyan kudu nglawan. Titik artikulasi minangka titik sing nalika dibusak, grafik bakal ilang konektivitase. Kabeh titik persimpangan ing grafik bisa ditemokake nggunakake algoritma klasik ing wektu linear. Pendekatan iki kanthi signifikan nyepetake cabang.
Carane Ngatasi Masalah NP-Hard karo Algoritma Parameterized
Nalika salah siji saka vertex sing dipilih dibusak, grafik bakal dipérang dadi komponen sing disambungake.

Kita bakal nindakake iki, nanging kita pengin luwih. Contone, goleki potongan vertex cilik ing grafik lan pamisah ing sadawane simpul kasebut. Cara sing paling efisien aku ngerti kanggo nemokake Cut vertex global minimal nggunakake wit Gomori-Hu, kang dibangun ing wektu kubik. Ing Tantangan PACE, ukuran grafik khas sawetara ewu simpul. Ing kahanan iki, milyaran operasi kudu ditindakake ing saben pucuk wit rekursi. Pranyata mung mokal kanggo ngatasi masalah ing wektu sing ditemtokake.

Ayo dadi nyoba kanggo ngoptimalake solusi. Potongan vertex minimal antarane pasangan vertex bisa ditemokake dening algoritma apa wae sing nggawe aliran maksimum. Sampeyan bisa ngidini menyang jaringan kasebut Algoritma Dinitz, ing laku kerjane cepet banget. Aku duwe anggepan sing teoritis bisa mbuktekaken ngira kanggo wektu operasi Carane Ngatasi Masalah NP-Hard karo Algoritma Parameterized, sing wis cukup ditrima.

Aku nyoba kaping pirang-pirang kanggo nggoleki potongan antarane pasangan vertices acak lan njupuk sing paling imbang. Sayange, iki ngasilake asil sing ora apik ing uji coba PACE Challenge sing mbukak. Aku dibandhingake karo algoritma sing pamisah vertices saka jurusan maksimum, mlaku karo watesan ing ambane saka keturunan. Algoritma sing nyoba nemokake potongan kanthi cara iki ninggalake grafik sing luwih gedhe. Iki amarga kasunyatan manawa potongan kasebut dadi ora seimbang: sawise ngilangi 5-10 simpul, mung bisa dipisahake 15-20.

Wigati dicathet yen artikel babagan algoritma paling cepet kanthi teoritis nggunakake teknik sing luwih maju kanggo milih simpul kanggo pamisah. Teknik kasebut duwe implementasine sing rumit banget lan asring kinerja sing ora apik babagan wektu lan memori. Aku ora bisa ngenali sing cukup ditrima kanggo latihan.

Carane Aplikasi Aturan Nyederhanakake

Kita wis duwe gagasan kanggo kernelization. Ayo kula ngelingake sampeyan:

  1. Yen ana vertex terisolasi, mbusak.
  2. Yen ana vertex derajat 1, copot lan njupuk pepadhamu kanggo nanggepi.
  3. Yen ana vertex gelar paling k+1, njupuk maneh.

Kanthi loro pisanan kabeh cetha, karo katelu ana siji trick. Yen ing masalah komik bab bar kita diwenehi watesan ndhuwur k, banjur ing Tantangan PACE sampeyan mung kudu golek tutup vertex saka ukuran minimal. Iki minangka transformasi khas Masalah Panelusuran dadi Masalah Keputusan; asring ora ana bedane antarane rong jinis masalah kasebut. Ing praktik, yen kita nulis solver kanggo masalah panutup vertex, bisa uga ana bedane. Contone, kaya ing titik katelu.

Saka sudut pandang implementasine, ana rong cara kanggo nerusake. Pendekatan pisanan diarani Iterative Deepening. Punika minangka nderek: kita bisa miwiti karo sawetara alangan cukup saka ngisor ing jawaban, lan banjur mbukak algoritma kita nggunakake alangan iki minangka alangan ing jawaban saka ndhuwur, tanpa arep ngisor ing recursion saka alangan iki. Yen kita wis ketemu sawetara jawaban, iku dijamin dadi optimal, digunakake kita bisa nambah watesan iki siji lan miwiti maneh.

Pendekatan liyane kanggo nyimpen sawetara jawaban optimal saiki lan goleki jawaban sing luwih cilik, ngganti parameter iki nalika ditemokake k kanggo nglereni luwih akeh cabang sing ora perlu ing panelusuran.

Sawise nindakake pirang-pirang eksperimen saben wengi, aku milih kombinasi saka rong cara iki: pisanan, aku mbukak algoritmaku kanthi sawetara watesan babagan kedalaman telusuran (milih supaya butuh wektu sing bisa diabaikan dibandhingake karo solusi utama) lan nggunakake sing paling apik. solusi ditemokaké minangka watesan ndhuwur kanggo jawaban - sing, kanggo bab sing padha k.

Pucuk gelar 2

Kita wis ngrampungake simpul derajat 0 lan 1. Pranyata iki bisa ditindakake kanthi vertex derajat 2, nanging iki mbutuhake operasi sing luwih rumit saka grafik.

Kanggo nerangake iki, kita kudu nemtokake simpul kasebut. Ayo diarani vertex derajat 2 minangka vertex v, lan tetanggan - vertex x и y. Sabanjure kita bakal duwe rong kasus.

  1. Nalika x и y - tanggane. Banjur sampeyan bisa mangsuli x и ylan v mbusak. Pancen, saka segi telu iki paling ora rong vertices kudu dijupuk bali, lan kita mesthi ora bakal kelangan yen njupuk x и y: padha mbokmenawa duwe tanggi liyane, lan v Dheweke ora ana kene.
  2. Nalika x и y - ora tanggi. Salajengipun dipunandharaken bilih tigang simpul menika saged dipunlebetaken dados satunggal. Ing idea iku ing kasus iki ana jawaban optimal, kang kita njupuk salah siji v, utawa loro vertex x и y. Kajaba iku, ing kasus sing sepisanan, kita kudu nanggepi kabeh tanggi x и y, nanging ing kaloro iku ora perlu. Iki cocog karo kasus nalika kita ora njupuk vertex terpaku kanggo nanggepi lan nalika nindakake. Iku tetep mung kanggo Wigati sing ing kasus loro, respon saka operasi kuwi sudo siji.

Carane Ngatasi Masalah NP-Hard karo Algoritma Parameterized

Wigati dicathet menawa pendekatan iki cukup angel dileksanakake kanthi tepat ing wektu linear sing adil. Gluing vertex minangka operasi sing rumit, sampeyan kudu nyalin dhaptar tanggi. Yen iki rampung carelessly, sampeyan bisa mungkasi munggah karo wektu mlaku suboptimal asymptotically (contone, yen sampeyan nyalin akeh sudhut sawise saben gluing). Aku mutusake kanggo nemokake kabeh dalan saka vertices derajat 2 lan nganalisa akeh kasus khusus, kayata siklus saka vertex kasebut utawa saka kabeh vertex kasebut kajaba siji.

Kajaba iku, iku perlu sing operasi iki bisa dibalèkaké, supaya nalika bali saka recursion kita mulihake graph kanggo wangun asli. Kanggo mesthekake iki, aku ora mbusak dhaptar pinggiran saka vertex gabungan, banjur aku mung ngerti kang sudhut perlu kanggo pindhah menyang ngendi. Implementasi grafik iki uga mbutuhake akurasi, nanging menehi wektu linear sing adil. Lan kanggo grafik saka sawetara puluhan ewu sudhut, mathuk menyang cache prosesor, kang menehi kaluwihan gedhe ing kacepetan.

Kernel linier

Pungkasan, bagean paling menarik saka kernel.

Kanggo miwiti, elinga yen ing grafik bipartit tutup vertex minimal bisa ditemokake nggunakake Carane Ngatasi Masalah NP-Hard karo Algoritma Parameterized. Kanggo nindakake iki, sampeyan kudu nggunakake algoritma Hopcroft-Karp kanggo nemokake cocog maksimum ana, lan banjur nggunakake teorema König-Egervari.

Ide kernel linear yaiku: pisanan kita nggawe bifurcate grafik, yaiku, tinimbang saben vertex v ayo ditambahi rong pucuk Carane Ngatasi Masalah NP-Hard karo Algoritma Parameterized и Carane Ngatasi Masalah NP-Hard karo Algoritma Parameterized, lan tinimbang saben pinggiran u - v ayo ditambahi iga loro Carane Ngatasi Masalah NP-Hard karo Algoritma Parameterized и Carane Ngatasi Masalah NP-Hard karo Algoritma Parameterized. Grafik sing diasilake bakal dadi bipartit. Ayo goleki tutup vertex minimal. Sawetara verteks saka grafik asli bakal teka kaping pindho, sawetara mung sapisan, lan sawetara ora tau. Teorema Nemhauser-Trotter nyatakake yen ing kasus iki, siji bisa mbusak simpul sing ora kena sapisan lan njupuk maneh sing kenek kaping pindho. Kajaba iku, dheweke ujar manawa saka simpul sing isih ana (sing kenek sapisan) sampeyan kudu njupuk paling ora setengah minangka jawaban.

Kita wis mung sinau kanggo ninggalake ora luwih saka 2k puncak Pancen, yen jawaban sing isih ana paling sethithik setengah saka kabeh simpul, mula ora ana simpul luwih saka total. 2k.

Ing kene aku bisa njupuk langkah cilik maju. Cetha yen kernel sing dibangun kanthi cara iki gumantung saka tutup vertex minimal sing dijupuk ing grafik bipartit. Aku pengin njupuk siji supaya jumlah vertex sing isih ana minimal. Sadurunge, padha bisa nindakake iki mung ing wektu Carane Ngatasi Masalah NP-Hard karo Algoritma Parameterized. Aku teka munggah karo implementasine saka algoritma iki ing wektu Carane Ngatasi Masalah NP-Hard karo Algoritma Parameterized, Mangkono, inti iki bisa digoleki ing grafik saka atusan ewu vertex ing saben tataran ngepang.

asil

Praktek nuduhake yen solusi saya bisa digunakake ing tes sawetara atus simpul lan sawetara ewu pinggiran. Ing tes kasebut cukup bisa nyana yen solusi bakal ditemokake ing setengah jam. Kemungkinan nemokake jawaban ing wektu sing bisa ditrima, ing asas, mundhak yen grafik wis akeh vertex saka jurusan dhuwure, contone, gelar 10 lan luwih.

Kanggo melu kompetisi, solusi kudu dikirim menyang optil.io. Dideleng saka informasi sing diwenehake ing kana tandha, solusi sandi ing tes mbukak rangking katelu saka rong puluh, karo longkangan gedhe saka kaloro. Jujur, ora jelas kepiye solusi bakal dievaluasi ing kompetisi kasebut dhewe: contone, solusiku luwih sithik tinimbang solusi ing posisi kaping papat, nanging sing lulus, luwih cepet.

Asil tes tertutup bakal diweruhi tanggal XNUMX Juli.

Source: www.habr.com