Kami memiliki DAG. Kami memiliki fungsi pada node (secara longgar, kami beri nomor pada node). Kami ingin membuat grafik terarah baru dengan aturan ini:
- Hanya node dengan nomor yang sama dapat dikontrak ke node baru yang sama. . (Namun, .)
- Kami menambahkan semua tepi lama antara node baru: .
- Grafik baru ini masih berupa DAG.
Apa yang minimal ? Apa yang dimaksud dengan algoritma yang membuat grafik baru minimal?
Jawaban:
Salah satu pendekatan untuk memecahkan masalah ini adalah dengan menggunakan integer linear programming (ILP). Mari kita menangani versi keputusan dari masalah: mengingat , apakah ada cara untuk mengontrak simpul dengan warna yang sama untuk mendapatkan DAG ukuran ≤ k ?k ≤k
Ini dapat dinyatakan sebagai instance ILP menggunakan teknik standar. Kami diberi warna setiap simpul dalam grafik asli. Saya menyarankan agar kita memberi label pada setiap simpul dengan label pada ; semua simpul dengan label yang sama dan warna yang sama akan dikontrak. Jadi, masalah keputusan menjadi: apakah ada pelabelan, sehingga membuat kontrak semua simpul dengan label yang sama warnanya menghasilkan DAG?{ 1 , 2 , ... , k }
Untuk menyatakan ini sebagai program linear integer, perkenalkan variabel integer untuk setiap vertex v , untuk mewakili label pada vertex v . Tambahkan ketimpangan 1 ≤ ℓ v ≤ k .ℓv v v 1 ≤ ℓv≤ k
Langkah selanjutnya adalah menyatakan persyaratan bahwa grafik yang dikontrak haruslah DAG. Perhatikan bahwa jika ada pelabelan formulir yang tercantum di atas, tanpa kehilangan keumuman ada pelabelan di mana label menginduksi semacam topologi pada grafik yang dikontrak (yaitu, jika mendahului w dalam grafik yang dikontrak, maka label v 's lebih kecil dari label w ). Jadi, untuk setiap tepi v → w dalam grafik asli, kami akan menambahkan batasan bahwa v dan w memiliki label dan warna yang sama, atau label v lebih kecil dari label w . Khususnya, untuk setiap sisi vv w v w v → w v w v w dalam grafik awal di mana v , w memiliki warna yang sama, tambahkan ketidaksetaraan ℓ v ≤ ℓ w . Untuk setiap tepi v → w di mana v , w memiliki warna yang berbeda, tambahkan ketidaksetaraan ℓ v < ℓ w .v → w v , b ℓv≤ ℓw v → w v , b ℓv< ℓw
Sekarang lihat apakah ada solusi yang layak untuk program linear integer ini. Akan ada solusi yang layak jika dan hanya jika pelabelan adalah dari bentuk yang diinginkan (yaitu, mengontrak semua simpul sama-warna sama label yang sama menghasilkan DAG). Dengan kata lain, akan ada solusi yang layak jika dan hanya jika ada cara untuk mengontrak grafik asli ke DAG dengan ukuran . Kita dapat menggunakan pemecah program linear integer apa pun; jika pemecah ILP memberi kita jawaban, kita punya jawaban untuk masalah keputusan semula.≤ k
Tentu saja, ini tidak dijamin selesai dalam waktu polinomial. Tidak ada jaminan. Namun, pemecah ILP sudah cukup bagus. Saya berharap bahwa, untuk grafik berukuran wajar, Anda memiliki peluang yang layak bahwa pemecah ILP mungkin dapat memecahkan masalah ini dalam jumlah waktu yang wajar.
Dimungkinkan juga untuk menyandikan ini sebagai instance SAT dan menggunakan pemecah SAT. Saya tidak tahu apakah itu akan lebih efektif. Versi ILP mungkin lebih mudah dipikirkan.
(Saya harap ini benar. Saya belum memeriksa setiap detail dengan hati-hati, jadi silakan periksa kembali alasan saya! Saya harap saya tidak pergi entah ke mana.)
Pembaruan (10/21): Sepertinya ILP dari formulir ini dapat diselesaikan dalam waktu linier, dengan memproses DAG dalam urutan yang diurutkan secara topologi dan melacak batas bawah pada label untuk setiap titik. Ini membuat saya curiga terhadap solusi saya: apakah saya membuat kesalahan di suatu tempat?
sumber
CATATAN: AFAICT, DW menemukan lubang dalam pengurangan ini dan itu salah (lihat komentar). Menyimpannya di sini karena alasan historis.
Intro : pertama saya akan mengurangi masalah Monotone 3SAT menjadi masalah kita. Meskipun masalah Monotone 3SAT sepele memuaskan, masalah kami selanjutnya dapat memecahkan masalah Minimum True Monotone 3SAT , yang NP-hard; dengan demikian masalah ini NP-hard.
Pengurangan dari Monotone 3SAT ke masalah kita
Kami memiliki rumus monoton boolean yang dinyatakan sebagai urutan variabel, dan urutan klausa. CNF berbentuk sedemikian rupa sehingga:Φ = ( V, C)
dan
Konversi
Kami membuat grafik, . Setiap simpul dalam G ′ memiliki label; simpul dengan label yang sama memenuhi syarat untuk kontraksi.G′= V′, E′ G′
Pertama-tama kita membuat grafik sebagai berikut: untuk setiap , kita membuat dua node, masing-masing berlabel x i , dan tepi terarah dari satu ke yang lain (klik gambar untuk tampilan resolusi tinggi).xsaya∈ V xsaya
Node ini tentu saja dapat dikontrak, karena mereka memiliki label yang sama. Kami akan mempertimbangkan variabel / node yang dikontrak untuk dinilai sebagai false, dan yang tidak dikontrak untuk dinilai sebagai benar :
Berikut ini visualisasi lain, membuka gulungan batasan klausa:
Jadi, setiap batasan klausa mensyaratkan bahwa setidaknya satu dari variabel yang dikandungnya tetap tidak berkontraksi; karena node yang tidak dikontrak dihargai sebagai benar, ini mengharuskan salah satu variabel menjadi benar; persis apa yang diminta SAT monoton untuk klausulnya.
Pengurangan dari Minimum True Monotone 3SAT
Monotone 3SAT sepele memuaskan; Anda cukup mengatur semua variabel menjadi true.
Namun, karena masalah minimisasi DAG kami adalah menemukan kontraksi terbanyak, ini berarti menemukan penugasan yang memuaskan yang menghasilkan variabel paling salah di CNF kami; yang sama dengan menemukan variabel benar minimum. Ini masalah kadang-kadang disebut Minimum Benar Monoton 3SAT atau di sini (sebagai masalah optimasi, atau masalah keputusan), atau k-Benar Monoton 2SAT (sebagai masalah keputusan lemah); kedua masalah NP-keras. Jadi masalah kita NP-hard.
Referensi:
Sumber grafik:
sumber
Dengan setiap penggantian (kecuali untuk penggantian orangtua-anak-anak langsung), Anda menambahkan hubungan leluhur-keturunan baru yang membuatnya tidak sepele untuk menentukan mana yang benar-benar layak untuk jangka panjang. Oleh karena itu, algoritma serakah sederhana akan gagal dalam kasus umum. Namun, jika Anda melakukan pendekatan brute-force, Anda dapat menentukan grafik terkecil:
Python-ish (tidak diuji):
Saya tidak yakin apakah itu benar-benar masalah yang sulit, tetapi bermain dengan beberapa grafik secara manual, sepertinya sangat kombinatorial. Saya ingin tahu apakah sesuatu yang sulit dapat dikurangi untuk masalah ini, atau jika ada algoritma dengan waktu berjalan yang lebih baik.
sumber