Masalah ini NP-hard . Untuk menunjukkan ini, saya akan terlebih dahulu merumuskan kembali masalah ini (optimasi) menjadi masalah keputusan. Kemudian, saya merumuskan kembali masalah itu menjadi masalah yang setara, yang darinya cukup sederhana untuk mendapatkan pengurangan dari masalah color, yang merupakan NP-hard untuk setiap k ≥ 3 .kk≥3
Rumusan singkat masalah adalah sebagai berikut:
Diberikan orang dan grafik G yang menyandikan hubungan 'pemberian hadiah' mereka, temukan jumlah minimum perjalanan yang diperlukan sehingga semua hadiah dapat dibeli tanpa merusak kejutan apa pun.nG
Namun, ini adalah masalah pengoptimalan. NP kelas biasanya didefinisikan untuk masalah keputusan (di mana jawaban untuk setiap contoh adalah YA atau TIDAK). Varian keputusan ini adalah:
Mengingat orang dan grafik G yang mengkodekan mereka 'pemberian hadiah' hubungan dan integer t , membuat paling t perjalanan yang cukup untuk membeli semua hadiah tanpa merusak kejutan?nGtt
Saya mendefinisikan masalah menemukan t -multicoring yang tepatt dari beberapa grafik sebagai menemukan fungsi multicolor c : V → P ( C ) yang tepat , di mana C adalah beberapa set t 'warna' ( yaitu | C | = t ) dan P ( C ) adalah himpunan daya C (yaitu himpunan semua himpunan bagian CG=(V,E) c:V→P(C)Ct|C|=tP(C)CC(u→v)∈Ec(u)⊈c(v)
Saya mengklaim bahwa masalah belanja perjalanan setara dengan masalah memutuskan keberadaan suatu diarahkan -multicoloringt dari grafik yang sama .G
Bukti : Jika kita memiliki diarahkan tepat -warna multi untuk , di mana kita mengubah nama warna sehingga maka pertimbangkan urutan perjalanan , di mana a vertex pergi berbelanja di perjalanan jika dan hanya jika . Kemudian, untuk setiap sisi , kami memiliki bahwa ada perjalanan sedemikian rupa sehingga dan , karena . Karena itu, perjalananc G C = { 1 , … , t } t T 1 , … , T t v T i i ∈ c ( v ) ( u → v ) ∈ E T i u ∈ T i v ∉ T i c ( u ) ⊈ c ( v ) T itcGC={1,…,t}tT1,…,TtvTii∈c(v)(u→v)∈ETiu∈Tiv∉Tic(u)⊈c(v)Ti cukup untuk membeli semua hadiah.
Jika kita memiliki urutan perjalanan , lalu buat fungsi multi-warna pada set warna sedemikian rupa sehingga . Kemudian, untuk setiap sisi , ada perjalanan sedemikian rupa sehingga dan (karena dapat membeli hadiah untuk pada beberapa perjalanan), yang berarti bahwa dan , jadi . c C = { 1 , ... , t } c ( u ) = { i ∈ N | u ∈ T i } ( u → v ) ∈ E T i u ∈ T i v ∉ T i u v i ∈ c ( u ) i ∉ c (T1,…,TtcC={1,…,t}c(u)={i∈N|u∈Ti}(u→v)∈ETiu∈Tiv∉Tiuvi∈c(u)c ( u ) ⊈ c ( v ) ◻i∉c(v)c(u)⊈c(v)□
Menemukan diarahkan tepat -multicoloring pada dasarnya adalah reformulasi aneh dari kasus spesifik -coloring. Oleh karena itu, saya dapat menunjukkan pengurangan waktu polinomial dari masalah : Diberi grafik tak berarah , pertama-tama ubah grafik ini menjadi grafik diarahkan , sehingga dan jika dan hanya jika atau ( dengan kata lain, kami mengubah tepi yang tidak terarah menjadi dua tepi yang diarahkan).ktk(t⌊t/2⌋)G′=(V′,E′)G=(V,E)V=V′(u→v)∈E(u,v)∈E′(v,u)∈E′
Pertimbangkan himpunan terbesar , sedemikian sehingga tidak ada , , sedemikian rupa sehingga . Himpunan semua subset dari ukuran , di mana, adalah set seperti itu. Oleh karena itu, ukuran maksimum dari subset tersebut adalah .K⊂P(C)a,b∈Ka≠ba⊂bC⌊t/2⌋t=|C|(t⌊t/2⌋)
Jika -multicoloring yang tepat ada untuk , maka ada pewarnaan yang tepat yang menggunakan tidak lebih dari elemen yang tidak sama dari (*) , jadi ini adalah -warna yang untuk .tG(t⌊t/2⌋)P(C) (t⌊t/2⌋)G′
Jika ada untuk , maka ada himpunan , , sehingga dan tidak ada , , sehingga . Jadi, memiliki -multicoring diarahkan yang tepat .(t⌊t/2⌋)G′K⊂P(C)|C|=t|K|≥(t⌊t/2⌋)a,b∈Ka≠ba⊂bGt
Oleh karena itu, ini adalah polinomial pengurangan waktu yang valid dari -coloring untuk masalah belanja hadir dengan perjalanan, yang berarti masalah belanja sekarang adalah NP-keras. Perhatikan bahwa masalah belanja saat ini adalah NP-complete, karena kita dapat memverifikasi dengan mudah jika daftar paling banyak perjalanan memungkinkan kita untuk membeli semua hadiah tanpa merusak kejutan.(t⌊t/2⌋)tt
(*): Jika beberapa multi-pewarnaan menggunakan lebih banyak set-warna daripada multi-pewarnaan multi- maksimal , kita dapat 'mengubah nama' sedemikian rupa sehingga ini adalah superset dari . tetap layak, karena tidak ada elemen dari yang berdekatan dengan elemen yang berbeda dari adalah masalah dan tidak ada set warna yang berdekatan satu sama lain di yang asli . Jadi, tanpa kehilangan keumuman, kita dapat mengasumsikan .CC∗CC∗CC∗C∗CC∗⊂C
Kemudian, perhatikan bahwa 'penggantian nama' ke setiap subset dari tidak merusak tepi antara node set warna , karena tidak mengandung elemen yang merupakan subset dari yang lain. Satu-satunya hal yang tersisa adalah untuk memastikan bahwa tepi antara dan tidak 'merusak' pewarnaan.C∖C∗C∗C∖C∗C∗C∖C∗C∗
Pertimbangkan hal berikut relasi pada warna-set di : dua warna-set dan yang terhubung jika dan hanya jika ada sepasang simpul sehingga memiliki warna-set dan warna-set dan . Relasi ini dapat diwakili oleh grafik tidak berarah .RC∪C∗ABa,baAbB(a,b)∈EG=(C∪C∗,R)
Pertama, kita dapat 'mengurangi' dengan mengganti pasangan mana pun yang tidak memiliki keunggulan dalam dengan satu set warna. Pewarnaan tetap tepat, karena mengubah dua rangkaian warna yang tidak berdekatan menjadi warna yang sama tidak menghasilkan tepi yang tidak valid. Sebagai hasilnya, kami telah mengurangi menjadi grafik yang lengkap.C∖C∗GG
Ini berarti bahwa jika memiliki jumlah set warna yang kurang atau sama dengan, pewarnaan yang diperlukan ada. Jika tidak, sama sekali tidak ada multi-pewarnaan yang tepat, karena adalah set 'non-subset' terbesar, jadi kami tidak dapat mewarnai klik ini. Oleh karena itu, multi-pewarnaan yang diperlukan tentu ada.G|C∗|C∗
Seperti grafik lengkap tentang node adalah warna-mampu jika dan hanya jika kita memiliki setidaknya warna, kita memiliki orang dapat pergi berbelanja hadiah untuk satu sama lain di perjalanan jika dan hanya jika . Ini berarti secara khusus bahwa, jika , hanya membuat perjalanan sudah cukup. Jika ada lebih sedikit hadiah untuk dibeli, lebih banyak perjalanan tidak diperlukan, jadi ini adalah batasan umum pada setiap solusi.nKnnnt(t⌊t/2⌋)≥nn≤1287016
Di bawah ini adalah 'jawaban' saya sebelumnya, yang memberikan algoritma heuristik yang tidak menjamin untuk mendapatkan yang optimal, tetapi dapat dihitung dalam waktu polinomial.
Cara lain untuk merumuskan masalah ini adalah dengan menemukan penutup grafik bipartit pada partisi untuk beberapa graf berarah dengan simpul , sehingga jumlah partisi (yaitu perjalanan), di sini , minimal.C={(S1,T1),…,(Sm,Tm)}(Si,Ti)Gnm
Pertama, beberapa pengamatan, sebagian berasal dari jawaban lain:
- Strategi serakah, di mana kita memilih dengan grafik bipartit di mana jumlah tepi yang sama dengan adalah maksimal, tidak mengarah ke solusi optimal (Contoh counter yang kuat adalah grafik penuh dengan node, di mana strategi ini gagal, tidak peduli grafik bipartit maksimum mana yang dipilih.).(Si,Ti)G6
- Strategi serakah tidak optimal untuk grafik asiklik arbitrer, pertimbangkan grafik berikut:
Baik untuk dan grafik bipartit menghilangkan tepi, tetapi hanya optimal.Si={3,5,6}Si={1,3,6}4{3,5,6}
- Algoritma serakah apa pun (optimal) tidak dapat memilih ukuran partisi yang dipilih daripada jumlah siklus ( ukuran apa pun ) 'dihilangkan' oleh partisi. Untuk melihat ini, perhatikan grafik dengan node, di mana ada satu siklus node dan setiap node dalam siklus memiliki tepi keluar tambahan menuju node tambahan , yang tidak memiliki tepi keluar (Lihat gambar di bawah untuk contoh di mana ). Pilihan serakah yang lebih memilih untuk memaksimalkan jumlah sisi atas siklus panjang akan mengirim semua simpul dalam siklus pada perjalanan pertama. Ini suboptimal, karena ini tidak menghilangkan tepi siklus dan hanya mengabaikann+2n22A,Bn=4nA,Bdan menghapus semua tepi dari siklus menghilangkan semua tepi menuju juga. Jadi setiap pilihan serakah yang lebih memilih ukuran partisi daripada menghapus siklus tidak optimal.A,B
Berdasarkan pengamatan ini, saya mengusulkan pilihan serakah berikut: Pilih sedemikian rupa, sehingga jumlah siklus bahwa perjalanan ini 'menghilangkan' dari adalah maksimal dan dalam kasus ikatan, pilih partisi dengan tumpang tindih maksimum dengan antara mereka (yaitu melihat ujung-ujungnya bukan pada siklus).(Si,Ti)GG
Karena algoritma ini tidak berbeda dari strategi serakah 'dasar' pada grafik asiklik (menghilangkan jumlah maksimum tepi pada setiap perjalanan), algoritma serakah ini karenanya tidak optimal. Namun, intuisi untuk menghilangkan siklus masih masuk akal dan merupakan perbaikan dari strategi dasar rakus, sehingga bisa menjadi heuristik yang layak.
Saya bisa melihat bagaimana mengurangi masalah ini menjadi Grafik Pewarnaan , yang memberi Anda alat untuk memecahkan masalah (untuk contoh kecil!), Tetapi belum bagaimana mengurangi ke arah lain (yang akan membentuk kekerasan NP).
Ide dasarnya adalah membuat grafik yang berisi titik untuk setiap pembelian , dan keunggulan antara dua pembelian yang tidak dapat terjadi pada perjalanan yang sama; kami kemudian melihat untuk mengelompokkan pembelian ke dalam jumlah kelompok sekecil mungkin ("perjalanan"), sehingga tidak ada dua pembelian dalam kelompok yang sama akan bertentangan. Khususnya, jika adalah grafik berarah asli di mana ujung menunjukkan bahwa orang yang butuhkan untuk membeli orang hadiah, kemudian buat grafik tidak terarah di mana ada simpul untuk setiap edge di dan edge (tidak ) setiap kaliG=(V,E) uv u v H=(X,Y) xuv uv G xuvxvw uv dan keduanya (diarahkan) tepi di (jika membeli beberapa hadiah selama perjalanan, maka tidak ada yang bisa membeli hadiah selama perjalanan itu sama). Pewarnaan simpul adalah partisi dari pembelian yang diperlukan (simpul dalam ) menjadi perjalanan (warna) yang tidak bertentangan (berbagi keunggulan), dan pewarnaan simpul ukuran minimum membutuhkan perjalanan sesedikit mungkin.vw G v w v H H
Dimungkinkan untuk pergi ke arah lain (mengurangi Pewarnaan Grafik, atau masalah NP-hard lainnya, untuk masalah Anda, dan dengan demikian membangun kekerasan NP-nya), dengan mengadaptasi pengurangan dari 3SAT ke Grafik Pewarnaan (seperti, misalnya, dirinci pada hal. 10 dari catatan Jeff Erickson ), tetapi saya belum mencoba ini sendiri.
sumber
Ini adalah masalah di mana saya akan sangat khawatir jika bos saya meminta saya untuk mengimplementasikan algoritma yang dijamin untuk menemukan solusi optimal dalam waktu yang wajar.
Untuk menemukan solusi yang belum tentu optimal: Mengingat sekumpulan orang dan hadiah untuk dibeli, kita dapat menghitung berapa banyak hadiah yang dapat dibeli oleh sekelompok orang dalam perjalanan berbelanja. Jadi mulailah dengan grup kosong (yang dapat membeli 0 hadiah). Untuk setiap orang yang tidak berada dalam grup, tentukan berapa banyak hadiah yang dapat dibeli jika orang itu ditambahkan ke grup. Jika ada orang yang dapat kita tambahkan tanpa mengurangi jumlah hadiah, pilih secara acak salah satu dari mereka yang menambah jumlah hadiah yang dibeli dengan jumlah maksimum, sampai menambahkan siapa pun akan mengurangi jumlah hadiah yang dibeli. Kemudian lakukan perjalanan belanja itu dan mulai dari awal sampai semua hadiah dibeli.
Saya ulangi beberapa kali, memilih orang yang berbeda "secara acak" dalam kasus yang menemukan solusi yang lebih baik.
Dalam contoh, lima orang harus membeli hadiah untuk satu sama lain, ini menemukan solusi dalam empat perjalanan, yang optimal; jika kami tidak menambahkan orang ke perjalanan yang membuat jumlah hadiah tidak berubah tanpa memperbaikinya, kami akan melakukan lima perjalanan. Dan 6 orang membutuhkan 5 perjalanan.
sumber
Asumsikan bahwa Anda memesan orang berdasarkan dari siapa mereka menerima (orang tua), dan kepada siapa mereka memberikan (anak). Karena setiap orang memberikan satu hadiah dan menerima satu hadiah, fungsi orangtua-anak adalah satu-ke-satu.
Anda tidak pernah ingin memasukkan orang tua dan anak ke dalam kelompok yang sama. Anda mulai dengan acak orang dan ketertiban semua orang sesuai, sehingga , dll Anda menempatkan semua menjadi satu kelompok, dan semua ke kelompok lain. Untuk orang terakhir , jadi Anda tidak ingin orang ini berada di grup yang sama dengan . Jika adalah genap, itu bukan masalah. Selain itu, Anda memerlukan satu grup tambahan, yang dapat berupa dengan sendirinya, dalam kasus yang paling sederhana.p1 child(p1)=p2 podd peven pn=parent(p1) p1 n pn
Algoritma ini mengasumsikan semua orang terhubung. Tapi itu tidak perlu terjadi. Jika ada beberapa siklus terputus, dengan kata lain, jika pada titik tertentu, mana , maka Anda menyelesaikan lingkaran itu dan mulai dengan yang baru, mengikuti algoritma yang sama. Selama Anda tidak menggabungkan peluang dan bahkan dari siklus yang sama, Anda dapat menggabungkan siklus terputus.pk=parent(p1) k!=n
Algoritma ini berakhir dengan paling banyak 2 putaran (untuk genap ) dan 3 putaran (untuk ganjil ).n n
sumber