Algoritma yang efisien untuk menghasilkan dua permutasi multiset yang tersebar dan acak secara acak

13

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.nccnnii

Biarkan S menjadi multiset {1,,1n1,2,,2n2,,1c,,cnc} mewakili satu kumpulan. Dalam representasi frekuensi , S juga dapat ditulis sebagai (1n12n2cnc) .

Jumlah permutasi yang berbeda dari S diberikan oleh multinomial :

|SS|=(nn1,n2,,nc)=n!n1!n2!nc!=n!i=1c1ni!.

Pertanyaan

Apakah ada algoritma yang efisien untuk menghasilkan dua permutasi difus, deranged P dan Q dari S secara acak? (Distribusi harus seragam.)

  • Sebuah permutasi P adalah difus jika untuk setiap elemen yang berbeda i dari P , contoh dari i spasi kira-kira merata di P .

    Sebagai contoh, misalkan S=(1424)={1,1,1,1,2,2,2,2} .

    • {1,1,1,2,2,2,2,1} tidak tersebar
    • {1,2,1,2,1,2,1,2} tersebar

    Lebih teliti:

    • Jika , hanya ada satu contoh dari untuk "spasi" di , jadi mari .ni=1iPΔ(i)=0
    • 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 .d(i,j)jj+1iPi
      δ(i,j)=d(i,j)nniΔ(i)=j=1ni1δ(i,j)2
      iPΔ(i)nin

    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 )s(P)=i=1cΔ(i)iPPs(P)s(P)n2k1SPs(P)<kn2

    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.A=n/Sai=n/niρ=i=1cni/n=1Paiid(i,j)aiAρ=1d(i,j)=ais(P)=0

  • Dua permutasi dan yang gila jika adalah kekacauan dari ; yaitu, untuk setiap indeks .PQPQPiQii[n]

    Sebagai contoh, misalkan .S=(1222)={1,1,2,2}

    • {1,2,1,2} dan tidak gila{1,1,2,2}
    • {1,2,1,2} dan kacau{2,1,2,1}

Analisis eksplorasi

Saya tertarik pada keluarga multiset dengan dan untuk . Khususnya, mari .n=20ni=4i4D=(1424344352617181)

  • Probabilitas bahwa dua permutasi acak dan dari yang gila adalah sekitar 3%.PQD

    Ini dapat dihitung sebagai berikut, di mana adalah ke : Lihat di sini untuk penjelasan.Lkk

    |DD|=0dteti=1cLni(t)=0dtet(L4(t))3(L3(t))(L2(t))(L1(t))3=4.5×1011|SD|=n!i=1c1ni!=20!(4!)3(3!)(2!)(1!)3=1.5×1013p=|DD|/|SD|0.03
  • Probabilitas bahwa permutasi acak dari adalah difus adalah sekitar 0,01%, pengaturan ambang sewenang-wenang pada kira-kira .PDs(P)<25

    Di bawah ini adalah plot probabilitas empiris 100.000 sampel mana adalah permutasi acak dari .s(P)PD

    Pada ukuran sampel sedang, .s(P)Gamma(α8,β18)

    Ps(P)cdf(s(P)){1,8,2,3,4,1,5,2,3,6,1,4,2,3,7,1,5,2,4,3}1191<105{8,2,3,4,1,6,5,2,3,4,1,7,1,2,3,5,4,1,2,3}140916<104{3,6,5,1,3,4,2,1,2,7,8,5,2,4,1,3,3,2,1,4}650972<10.05{3,1,3,4,8,2,2,1,1,5,3,3,2,6,4,4,2,1,7,5}12239136<10.45{4,1,1,4,5,5,1,3,3,7,1,2,2,4,3,3,8,2,2,6}16979189<10.80

Probabilitas bahwa dua permutasi acak adalah valid (baik difus dan deranged) adalah sekitar .v(0.03)(0.0001)21010

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 .en!/e1/v1010

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.v|SD|21016

Pertanyaan lebih lanjut

Apa kompleksitas masalah ini? Bisakah itu direduksi menjadi paradigma yang sudah dikenal, seperti aliran jaringan, pewarnaan grafik, atau pemrograman linier?

hftf
sumber
Mengenai definisi Anda tentang "spasi", jangan Anda inginkan untuk dengan sebagai penjaga? Dengan kata lain, elemen tunggal harus di tengah, dua harus mempartisi permutasi dalam pertiga, dan seterusnya. d(i,j)n/(ni+1)0ijn+1P0=Pn+1=i
Raphael
Apa yang terjadi jika untuk evil (kecil, tetapi cukup besar); apakah kita bahkan memiliki permutasi difus daripada? Kami tentu tidak tahan untuk menemukan dua yang gila! Tampaknya tidak ada elemen yang dapat terjadi lebih dari kali. k n / 2S={1nk,2k}kn/2
Raphael
1
Berapa rasio dari semua pasangan permutasi yang rusak di antara semua pasangan permutasi difus ? Demikian pula, dari semua pasangan permutasi gila, berapa banyak yang terdiri dari dua yang tersebar? (Jika salah satu rasio "tinggi", kita dapat memusatkan upaya kita pada satu setengah dari proses, meninggalkan yang lain pada penolakan.)
Raphael
1
@Raphael (# 3a) Dari 1 juta permutasi acak , 561 yang difus ini memiliki s ( P ) 30 . 6118 / ( 561Ds(P)30dari pasangan yang gila. 6118/(5612)=6118/1570803.9%
hftf
1
@Raphael (# 3b) Dari 10 juta pasang permutasi acak , 306893 pasang rusak. Hanya 29 pasangan yang memiliki permutasi dengan s ( P ) 50 . Berikut ini adalah histogram ( nilai ). Ds(P)50
hftf

Jawaban:

3

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)xhφ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.

DW
sumber
menemukan ini sulit untuk diikuti. adalah nilai boolean dan h ( x ) adalah string biner (himpunan variabel biner)? jadi persamaan terakhir berarti ...? φ(x)h(x)
vzn
0

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 derangesubroutine 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 p2selalu dikocok. seseorang dapat mulai dengan tuple 1 ( p1) dipesan oleh a."urutan tertinggi kekuatan" (# 128), b.urutan acak (# 127), c.dan "urutan terendah kekuatan pertama" ("urutan terakhir kekuatan tertinggi") (# 126).

rutin dispersi disperselebih 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, yindeks) 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 ( selectdi # 71) . madalah 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, falseuntuk 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) dan c= 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 berikut

c       0.661000
b       0.824000
a       0.927000
[2.484, 2, 4]
[2.668, 2, 4]

ini menunjukkan bahwa a-truealgoritma 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

vzn
sumber
Fyi berpikir lebih jauh, ada kesalahan dalam rutinitas derange & itu tidak selalu berubah. posisi swap dapat naik tanpa menukar apa pun. Ada perbaikan sederhana untuk menguji kesuksesan dengan benar.
vzn