Siklus berat negatif vs siklus berat maksimum

8

Saya mengalami kesulitan memahami mengapa mudah mendeteksi siklus bobot negatif (Bellman Ford) tetapi sulit menemukan siklus bobot maksimum dalam grafik yang tidak diarahkan.

Jika kita meniadakan bobot masing-masing sisi, kita dapat dengan mudah menemukan apakah ada siklus dengan berat total> 0. Namun, tidak mudah menemukan jika ada siklus dengan berat> 1 atau kita dapat mengulangi dengan 2, 3 , 4 dll hingga jawabannya tidak.

Apakah ini benar? Mengapa jauh lebih sulit untuk mendeteksi jika ada siklus dengan berat> 1 kemudian untuk menemukan jika ada siklus dengan berat> 0?

Flash
sumber

Jawaban:

2

Saya tidak berpikir itu sangat mengejutkan bahwa menemukan siklus berat negatif tunggal lebih mudah daripada menemukan siklus berat tertinggi. Jika Anda meminta saya untuk menemukan siklus negatif-berat, saya dapat menemukan satu dan, jika saya memberi Anda apa yang saya klaim adalah jawabannya, sangat mudah bagi Anda untuk memeriksa urutan simpul dan melihat bahwa bobotnya benar-benar negatif. Tetapi siklus berat maksimum terasa seperti objek yang sangat istimewa. Sekalipun saya mengklaim telah menemukannya, bagaimana saya meyakinkan Anda bahwa tidak ada siklus lain dengan bobot lebih tinggi?

Di sisi lain, mungkin intuisi ini tidak membantu, karena itu juga sepele untuk memeriksa bahwa siklus tertentu memiliki berat setidaknya 1 atau 2 atau 17 ...

David Richerby
sumber
1

Ini adalah pertanyaan yang sangat bagus. Saya tidak memiliki penjelasan yang sepenuhnya memuaskan, tetapi izinkan saya memberi Anda permulaan.

Pertama, penting untuk dipahami bahwa kami tidak dapat menyelesaikan masalah ini hanya dengan menghitung semua siklus dan memeriksa bobot masing-masing. Kenapa tidak? Karena mungkin ada (dan sering kali) banyak siklus secara eksponensial. Oleh karena itu, hanya penghitungan saja akan membutuhkan waktu yang eksponensial - terlalu lama untuk memungkinkan.

Jadi bagaimana cara kerja Bellman-Ford? Ini bekerja dengan beberapa trik pintar yang menghindari kebutuhan untuk secara individual memeriksa setiap siklus satu per satu. Alih-alih, itu membangun ringkasan yang merangkum sesuatu tentang efek dari semua jalur dan siklus panjang hinggan. Secara efektif, untuk setiap titikv, ini merangkum semua jalur yang dimulai v, akhiri pada v, dan ambil paling banyak nLangkah. Karena setiap siklus harus mengandung lintasan formulir ini, ringkasan entah bagaimana merangkum efek dari semua siklus yang mungkin.

Mengapa kita tidak bisa menggunakan ini untuk mendeteksi (katakanlah) apakah ada siklus berat 1? Itu karena ringkasan Bellman-Ford mencakup jalur yang berjalan mengelilingi siklus beberapa kali. Jika siklusnya panjangk, maka itu akan mencakup jalur panjang nyaitu jalur yang berjalan di sekitar siklus n/kwaktu. Misalnya, jika Anda memiliki siklus panjangn/3, lalu ringkasan menyertakan jalur yang berjalan di sekitar siklus tiga kali.

Apa efek berjalan mengelilingi siklus beberapa kali? Jika Anda ingin membedakan siklus positif-berat dari siklus yang beratnya tidak positif, berjalan mengelilingi siklus beberapa kali tidak ada salahnya. Jika siklus memiliki berat positif, maka Anda dapat berjalan di sekitarnya beberapa kali dan berat total akan tetap positif. Jika berat siklus tidak positif, maka Anda dapat berjalan di sekitarnya beberapa kali dan berat total akan tetap tidak positif. Jadi, jika yang kita pedulikan adalah perbedaan antara berat positif dan non-positif, berjalan di sekitar siklus beberapa kali tidak ada salahnya.

Tetapi sekarang pertimbangkan bagaimana hal-hal berubah jika apa yang kita pedulikan adalah perbedaan antara "berat 1"vs" berat <1"Jika kita memiliki siklus yang beratnya <1 dan kami berjalan mengitari siklus itu beberapa kali, total berat mungkin menjadi 1. Misalnya, jika bobot siklusnya adalah1/2 dan kami berjalan mengelilingi siklus itu tiga kali, maka bobot total dari jalur itu adalah 1.5, yang mana 1: kami mulai dengan siklus berat <1 dan berakhir dengan jalur berat 1.5. Fakta ini benar-benar mengacaukan Bellman-Ford dan membuatnya tidak berguna untuk memeriksa apakah ada siklus berat1. (Apakah Anda melihat perbedaannya?)

Saya menyadari ini bukan jawaban yang memuaskan 100%. Ini memberi tahu Anda mengapa Bellman-Ford tidak akan bekerja untuk menyelesaikan masalah Anda. Namun, itu tidak memberi Anda intuisi untuk menjelaskan mengapa ini sulit secara umum (misalnya, mengapa sulit untuk menemukan beberapa algoritma lain untuk menyelesaikannya). Saya tidak memiliki intuisi yang bagus untuk itu - mungkin orang lain akan memiliki penjelasan yang lebih baik untuk Anda. Sementara itu, mungkin ini memberi Anda awal untuk memahami mengapa masalah ini sulit.

DW
sumber
0

Memutuskan weightc masih mudah untuk semua konstanta cdan bobot tepi integer. Saya dapat memeriksa semua siklus panjangnyac di O(nc)(dengan asumsi bobot unit). Tetapi bagaimana jikac bukan konstanta, misalnya c=n/2? Itu tidak akan polinomial lagi.

Di sisi lain dengan masalah keputusan umum (yaitu kapan c tidak konstan) kita dapat memutuskan masalah siklus Hamiltonian yang NP-Complete.

Parham
sumber
Ya, tetapi ini tidak memberikan intuisi mengapa sulit untuk memutuskan masalah keputusan umum. Ya, ada pengurangan pada siklus Hamilton, jelas, tetapi itu tidak memberikan intuisi mengapa. Jika Anda membaca pertanyaan, cukup jelas penulis menanyakan intuisi mengapa ini sulit ketika menemukan siklus positif-berat tidak sulit.
DW
Ya saya tahu itu. Penanya tampaknya bingung tentang perbedaan antara menentukan nomor dan memutuskan berapa lama. Silakan lihat pertanyaan di paragraf terakhir. Saya mencoba untuk memperbaikinya pada bagian itu. Menjadi lebih sulit atau lebih mudah dalam hal keterlacakan tergantung pada perbedaan ini.
Parham
Memeriksa semua siklus panjang cjuga tidak berfungsi jika tepian dibiarkan memiliki berat nol. OK, bobot nol sering diidentifikasi dengan tidak adanya tepi tetapi mudah membayangkan aplikasi di mana tepi dengan bobot nol tidak sama dengan tanpa tepi: misalnya, tepi adalah ruas jalan dan berat adalah tol yang harus dibayar untuk segmen itu.
David Richerby
0

Mari kita perhatikan versi sederhana dari masalah ini di mana edge tidak berbobot.

  1. Diberikan grafik G, periksa apakah G memiliki siklus.

  2. Diberikan grafik G dan angka k, periksa apakah G memiliki siklus panjang setidaknya k.

Yang pertama mudah dan bisa diselesaikan menggunakan DFS. Yang kedua adalah NP-hard.


Mari kita lihat masalah yang lebih sederhana:

  1. Diberikan grafik G dan dua simpul s dan t, periksa apakah ada jalur sederhana dari s untuk t di G.

  2. Diberikan grafik G dan dua simpul s dan t dan angka k, periksa apakah ada jalur sederhana dari s untuk t di G panjang setidaknya k.

Semua masalah ini memiliki cita rasa yang sama. Yang paling atas mudah sedangkan yang paling bawah NP-hard. Saya akan menjelaskan perbedaan untuk yang terakhir karena lebih sederhana tetapi penjelasan yang sama berlaku untuk pasangan lainnya.

Alasan mengapa yang paling atas itu mudah, sedangkan yang paling bawah bukan karena struktur jawaban untuk masalah-masalah ini.

Pertama-tama mari kita lihat masalah menemukan jalan yang sederhana dan mencoba menyelesaikannya secara rekursif. Jika kita hanya mencoba menyelesaikan masalah ini secara langsung, kita perlu melacak simpul yang telah kita gunakan sejauh ini:

SimplePath(s,t,G):= ada jalan dari s untuk t di G.

SimplePath(s,t,G) iff
s=t atau untuk beberapa uG SimplePath(s,u,Gt) dan utG.

Jika kita mencoba untuk menyelesaikan masalah dengan algoritma rekursif naif ini akan memakan waktu eksponensial: ada banyak kemungkinan secara eksponensial untuk set simpul yang tidak digunakan! Kita harus lebih pintar.

Mengapa kita mendapatkan banyak kemungkinan secara eksponensial? Karena kami berusaha menemukan jalan yang sederhana dan untuk menegakkan kondisi ini, kami perlu melacak simpul yang tidak digunakan.

OK, jadi mari kita jatuhkan kondisi itu dan lihat di mana kita bisa mendapatkan:

Pertimbangkan masalah menemukan jalan (tidak perlu sederhana) dari s untuk t. Karena jalan tidak perlu sederhana, kita tidak perlu melacak simpul yang tidak digunakan. Dengan kata lain, grafik tidak berubah seiring waktu.

PathG(s,t):= ada jalan dari s untuk t.

PathG(s,t) iff
s=tatau
untuk beberapauG PathG(s,t) dan utG.

Tapi kita belum selesai. Masalahnya adalah kita tidak tahu jikaPathG(s,u) adalah masalah yang lebih kecil dari PathG(s,t). Jadi solusi rekursif ini mungkin berakhir dalam satu lingkaran dan tidak pernah berakhir.

Untuk menghindari ini, kita dapat menambahkan parameter tambahan yang memastikan masalah semakin kecil: jumlah tepi di jalur.

PathG(s,t,k):= ada jalan dari s untuk t dengan paling banyak k ujung-ujungnya.

PathG(s,t,k) iff
k=0 dan s=t atau
k>0 dan untuk beberapa uG PathG(s,u,k1) dan utG.

Sekarang perhatikan bahwa ada jalur sederhana dari s untuk t jika ada jalan dari s untuk t dengan paling banyak nujung-ujungnya. Dengan kata lain:

SimplePath(s,t,G) iff PathG(s,t,n).

Poin-poin penting di sini adalah:

  1. Setiap jalur sederhana (nontrivial) dari s untuk t terdiri dari jalur sederhana dari s untuk beberapa titik u dan keunggulan ut.

  2. Kita bisa berasumsi itu t tidak muncul di jalur sederhana dari s untuk u.

  3. Kami tidak perlu secara eksplisit menyimpan daftar simpul yang tidak digunakan.

Properti ini memungkinkan kita untuk memiliki rekursi yang cerdas untuk keberadaan masalah jalur sederhana.

Sekarang ini tidak berlaku untuk masalah menemukan jalur panjang setidaknya k. Kami tidak tahu cara mengurangi masalah menemukan jalur panjang sederhana setidaknyak ke subproblem yang lebih kecil tanpa menyimpan daftar simpul yang tidak digunakan. Properti itu memungkinkan kita untuk memecahkan masalah keberadaan jalur secara efisien.

Ketika grafik tidak memiliki siklus negatif, mereka memungkinkan kita untuk menyelesaikan keberadaan jalur panjang paling banyak k masalah dan masalah jalur sederhana terpendek efisien.

Namun mereka tidak memiliki keberadaan jalur panjang setidaknya k. Pertimbangkan grafik dengan3 sudut s,u,t. w(su)=1000,w(st)=1000,w(ut)=10,w(tu)=10. Jalur panjang setidaknya1001 dari s untuk t mengandung u dan jalur panjang setidaknya 1001 dari s untuk u mengandung t. Jadi kita tidak bisa mengurangi instance masalah menjadi instance yang lebih kecil dari masalah tanpa secara eksplisit memberikan daftar simpul yang tidak digunakan.

Dengan kata lain, kita tidak tahu rekursi yang cerdas untuk keberadaan jalur panjang sederhana setidaknya k masalah sementara kita tahu rekursi yang cerdas untuk keberadaan jalan yang sederhana.


Kembali ke bagian terakhir dari pertanyaan Anda, ada masalah dengan argumen Anda.

Memang demikian adanya siklus panjang >k dapat diselesaikan dalam waktu polinomial untuk setiap perbaikan k (yaitu kbukan bagian dari input). (Mirip dengan bagaimana seseorang dapat memeriksa apakah grafik tidak tertimbang memiliki siklus panjangk pada waktunya O(nk).)

Namun kapan k merupakan bagian dari input yang tidak dapat digunakan lagi karena waktu berjalan tergantung k dengan cara yang buruk.

Kaveh
sumber