Latar Belakang
Misalkan saya punya dua batch identik kelereng. Setiap marmer bisa menjadi salah satu warna c , di mana c≤n . Biarkan n_i menunjukkan jumlah kelereng warna i dalam setiap batch.
Biarkan menjadi multiset mewakili satu kumpulan. Dalam representasi frekuensi , juga dapat ditulis sebagai .
Jumlah permutasi yang berbeda dari diberikan oleh multinomial :
Pertanyaan
Apakah ada algoritma yang efisien untuk menghasilkan dua permutasi difus, deranged dan dari secara acak? (Distribusi harus seragam.)
Sebuah permutasi adalah difus jika untuk setiap elemen yang berbeda dari , contoh dari spasi kira-kira merata di .
Sebagai contoh, misalkan .
- tidak tersebar
- tersebar
Lebih teliti:
- Jika , hanya ada satu contoh dari untuk "spasi" di , jadi mari .
- Jika tidak, biarkan menjadi jarak antara contoh dan contoh dari di . Kurangi darinya jarak yang diharapkan antara instance , tentukan yang berikut:
Jika ditempatkan secara merata dalam , maka harus nol, atau sangat dekat dengan nol jika .
Sekarang menentukan statistik untuk mengukur berapa banyak setiap yang merata spasi di . Kami menyebut difus jika mendekati nol, atau kira-kira . (Seseorang dapat memilih ambang khusus untuk sehingga menyebar jika )
Batasan ini mengingatkan masalah penjadwalan real-time yang lebih ketat yang disebut masalah pinwheel dengan multiset (sehingga ) dan kepadatan . Tujuannya adalah untuk menjadwalkan urutan siklik tak terbatas sedemikian rupa sehingga setiap urutan panjang berisi setidaknya satu instance dari . Dengan kata lain, jadwal yang layak membutuhkan semua ; jika padat ( ), maka dan . Masalah kincir tampaknya NP-lengkap.
Dua permutasi dan yang gila jika adalah kekacauan dari ; yaitu, untuk setiap indeks .
Sebagai contoh, misalkan .
- dan tidak gila
- dan kacau
Analisis eksplorasi
Saya tertarik pada keluarga multiset dengan dan untuk . Khususnya, mari .
Probabilitas bahwa dua permutasi acak dan dari yang gila adalah sekitar 3%.
Ini dapat dihitung sebagai berikut, di mana adalah ke : Lihat di sini untuk penjelasan.
Probabilitas bahwa permutasi acak dari adalah difus adalah sekitar 0,01%, pengaturan ambang sewenang-wenang pada kira-kira .
Di bawah ini adalah plot probabilitas empiris 100.000 sampel mana adalah permutasi acak dari .
Pada ukuran sampel sedang, .
Probabilitas bahwa dua permutasi acak adalah valid (baik difus dan deranged) adalah sekitar .
Algoritma tidak efisien
Algoritme "cepat" yang umum untuk menghasilkan kekacauan acak dari set adalah berbasis penolakan:
lakukan P ← random_permutation ( D ) sampai is_derangement ( D , P ) return P
yang mengambil sekitar iterasi, karena ada sekitar mungkin derangements. Namun algoritma acak berbasis-penolakan tidak akan efisien untuk masalah ini, karena akan mengambil urutan iterasi .
Dalam algoritma yang digunakan oleh Sage , kekacauan acak dari multiset "dibentuk dengan memilih elemen secara acak dari daftar semua kemungkinan kekacauan." Namun ini juga tidak efisien, karena ada permutasi yang valid untuk dicacah, dan selain itu, seseorang akan memerlukan algoritma untuk melakukan hal itu.
Pertanyaan lebih lanjut
Apa kompleksitas masalah ini? Bisakah itu direduksi menjadi paradigma yang sudah dikenal, seperti aliran jaringan, pewarnaan grafik, atau pemrograman linier?
Jawaban:
Satu pendekatan: Anda dapat menguranginya menjadi masalah berikut: Diberikan rumus boolean , pilih tugas x seragam secara acak dari antara semua tugas memuaskan φ ( x ) . Masalah ini NP-hard, tetapi ada algoritma standar untuk menghasilkan x yang kira-kira terdistribusi secara merata, metode pinjaman dari algoritma #SAT. Sebagai contoh, satu teknik adalah untuk memilih fungsi hash h yang rentangnya memiliki ukuran yang dipilih dengan hati-hati (sekitar ukuran yang sama dengan jumlah penugasan yang memuaskan φ ), pilih secara seragam secara acak nilai y dari dalam kisaranφ(x) x φ(x) x h φ y , dan kemudian menggunakan pemecah SAT untuk menemukan tugas yang memuaskan untuk rumus φ ( x ) ∧ ( h ( x ) = y ) . Untuk membuatnya efisien, Anda dapat memilih h menjadi peta linier yang jarang.h φ(x)∧(h(x)=y) h
Ini mungkin menembakkan kutu dengan meriam, tetapi jika Anda tidak memiliki pendekatan lain yang tampaknya bisa diterapkan, ini adalah salah satu yang bisa Anda coba.
sumber
beberapa diskusi / analisis yang diperluas dari masalah ini dimulai dalam obrolan cs dengan latar belakang lebih lanjut yang mengungkap beberapa subjektivitas dalam persyaratan masalah yang kompleks tetapi tidak menemukan kesalahan atau kekeliruan yang terang-terangan. 1
di sini adalah beberapa kode yang diuji / dianalisis yang, dibandingkan dengan solusi lain berdasarkan SAT relatif "cepat dan kotor" tetapi nontrivial / rumit untuk debug. ini secara longgar didasarkan pada skema optimasi pseudorandom / serakah lokal yang agak mirip dengan misalnya 2-OPT untuk TSP . ide dasarnya adalah memulai dengan solusi acak yang sesuai dengan beberapa kendala, dan kemudian mengganggunya secara lokal untuk mencari perbaikan, dengan rakus mencari perbaikan dan mengulanginya, dan mengakhiri ketika semua perbaikan lokal telah habis. kriteria desain adalah bahwa algoritma harus seefisien / menghindari penolakan sebanyak mungkin.
ada beberapa penelitian tentang algoritma gangguan [4] misalnya digunakan dalam SAGE [5] tetapi mereka tidak berorientasi pada multiset.
gangguan sederhana hanya "bertukar" dari dua posisi dalam tupel. implementasinya dalam ruby. Berikut ini adalah beberapa ikhtisar / catatan dengan referensi ke nomor baris.
qb2.rb ( gist -github)
pendekatan di sini adalah memulai dengan dua tupel deranged (# 106) dan kemudian secara lokal / rakus meningkatkan dispersi (# 107), dikombinasikan dalam konsep yang disebut
derangesperse
(# 97), melestarikan kekacauan. perhatikan bahwa bertukar dua posisi yang sama dalam pasangan tupel menjaga kekacauan dan dapat meningkatkan dispersi dan itu adalah (bagian dari) metode / strategi bubar.yang
derange
subroutine bekerja kiri ke kanan pada array (multiset) dan swap dengan elemen kemudian dalam array di mana swap tidak dengan unsur yang sama (# 10). Algoritma berhasil jika, tanpa swap lebih lanjut di posisi terakhir, kedua tuple masih kacau (# 16).ada 3 pendekatan berbeda untuk merusak tupel awal. tuple ke-2
p2
selalu dikocok. seseorang dapat mulai dengan tuple 1 (p1
) dipesan oleha.
"urutan tertinggi kekuatan" (# 128),b.
urutan acak (# 127),c.
dan "urutan terendah kekuatan pertama" ("urutan terakhir kekuatan tertinggi") (# 126).rutin dispersi
disperse
lebih terlibat tetapi secara konsep tidak begitu sulit. lagi menggunakan swap. daripada mencoba mengoptimalkan dispersi secara umum di atas semua elemen, ia hanya mencoba untuk secara iteratif meringankan kasus terburuk saat ini. idenya adalah untuk menemukan 1 st elemen paling disperse, kiri ke kanan. perturbasinya adalah untuk menukar elemen kiri atau kanan (x, y
indeks) dari pasangan yang paling tidak tersebar dengan elemen lain tetapi tidak pernah ada di antara pasangan (yang akan selalu mengurangi dispersi), dan juga melewatkan upaya untuk bertukar dengan elemen yang sama (select
di # 71) .m
adalah indeks titik tengah pasangan (# 65).namun dispersi diukur / dioptimalkan pada kedua tupel dalam pasangan (# 40) menggunakan dispersi "paling / paling kiri" di setiap pasangan (# 25, # 44).
algoritma berusaha untuk menukar elemen "terjauh" 1 st (
sort_by / reverse
# 71).ada dua strategi berbeda
true, false
untuk memutuskan apakah akan menukar elemen kiri atau kanan dari pasangan yang paling tidak tersebar (# 80), baik elemen kiri untuk posisi swap ke elemen kiri / kanan ke sisi kanan, atau elemen kiri atau kanan terjauh. dalam pasangan dispersi dari elemen swap.algoritme selesai (# 91) ketika tidak dapat lagi meningkatkan dispersi (baik memindahkan lokasi dispersi terburuk ke kanan atau meningkatkan dispersi maksimum pada seluruh pasangan tupel (# 85)).
statistik adalah output untuk penolakan lebih dari
c
= 1000 gangguan atas 3 pendekatan (# 116) danc
= 1000 derangesperses (# 97), melihat pada 2 algoritma dispersi untuk pasangan gila dari penolakan (# 19, # 106). yang terakhir melacak dispersi rata-rata total (setelah kekacauan yang dijamin). contoh run adalah sebagai berikutini menunjukkan bahwa
a-true
algoritma memberikan hasil terbaik dengan ~ 92% nonrejection dan jarak disperse terburuk rata-rata ~ 2.6, dan minimum yang dijamin dari 2 lebih dari 1000 percobaan, yaitu setidaknya 1 elemen campur tangan yang tidak ada sama sekali antara semua pasangan elemen yang sama. ia menemukan solusi setinggi 3 elemen intervensi yang tidak ada bandingannya.algoritma derangement adalah pra-penolakan waktu linier, dan algoritma dispersi (berjalan pada input gila) tampaknya mungkin ~ .O(nlogn)
1 masalahnya adalah untuk menemukan pengaturan quizbowl paket yang memenuhi apa yang disebut "feng shui" [1] atau "bagus" random memesan di mana "bagus" agak subjektif dan belum "resmi" dihitung; penulis masalah telah menganalisis / menguranginya menjadi kriteria derange / dispersi berdasarkan penelitian di komunitas quizbowl dan "pakar feng shui". [2] ada ide berbeda tentang "aturan feng shui." beberapa "dipublikasikan" penelitian telah dilakukan pada algoritma tetapi muncul pada tahap awal. [3]
[1] Paket feng shui / QBWiki
[2] Paket kuis dan feng shui / Lifshitz
[3] Penempatan Pertanyaan , forum pusat sumber daya HSQuizbowl
[4] Menghasilkan Kesulitan Acak / Martinez, Panholzer, Prodinger
[5] Sage derangement algorithm (python) / McAndrew
sumber