Renk topları nasıl karıştırılır?


10

İçinde 100'ü kırmızı, 40'ı sarı, 50'si yeşil, 60'ı mavi, 70'i mor, 80'i siyah olan 400 topum var. (aynı renkteki toplar aynıdır)

verimli bir karıştırma algoritmasına ihtiyacım var, böylece karıştırmadan sonra toplar bir listede ve

Birbirini izleyen 3 top aynı renkte değildir. örneğin, "kırmızı, kırmızı, kırmızı, sarı ...."

Ve tüm permütasyonun "eşit olarak" gerçekleşmesi muhtemeldir. (iyi, tarafsızlığa karşı verimlilik değiş tokuşu yeterince iyi ise, tarafsızlıktan daha fazla verimlilik umursamıyorum).

Fisher-Yates-Knuth'u uyarlamaya çalıştım, ama sonuç ideal değil.

Fisher-Yates neden yeterince iyi değil? FY, Monte Carlo'nun ters dönüşümü benimsediğinden. Ve çıktı dağıtımı aynı renk toplarına farklı davranır, yani ihtiyaçlarım için yanlı sonuç üretecektir.

Ve Naif düşüncesi, tüm alandaki tüm kötü permütasyonları filtrelemek / geri izlemek olacaktır. Kısıtlama çok güçlü olduğunda, diyelim ki, sadece 300 topumuz ve 100'ü kırmızı ise, uygun bir permütasyon almadan önce çok fazla geri izleme / hata olacaktır.

Sonuçta, tüm iyi permütasyonlarla tekrar edebilmek isterdim. Ancak, geçerli permütasyon sayısı çok fazla olduğundan, bunlardan sadece bazılarını rastgele örnekleyebilirim. "Bazı" larının istatistiksel özelliklerinin nüfusa olabildiğince benzemesini istiyorum.


3
Sorduğunuz diğer sorunun yanıtlarını uyarlamaya çalıştınız mı ? Her iki soru da çok benzer görünüyor :).
Gopi

@Gopi: evet, umarım her iki sorunun da cevapları diğerine ilham getirir.
colinfang

Aklıma gelen en basit fikir, her rengin o renkle kalan top sayısına göre bir olasılıkla seçileceği, son 2 topun aynı renkte, geçerli yinelemede seçemezsiniz. Verimlilik kötü olmamalı ve içinde herhangi bir önyargı göremiyorum (bu hiçbirinin olmadığı anlamına gelmez; belki bir şey özledim).
George

3
@George B .: bu sürecin diğer ilgili soru üzerinde neden önyargılı olduğunu gördük . David Eppstein bu soruya onun cevabını açıkladığı gibi, alan dinamik programlama algoritması var nerede, zaman k renklerin sayısıdır. Daha verimli bir şey güzel olurdu - hatta θ ( n k / 2 ) . θ(nk)kθ(nk/2)
Peter Shor

2
@GeorgeB. David Eppstein'ın yaklaşımı daha ucuz olsa bile, bu sorunu bir MCMC yaklaşımı ile nasıl çözeceğimi merak ediyorum.
Peter Shor

Yanıtlar:


7

Bir Markov zincirinin tüm olası top dizileri üzerinde eşit bir dağılıma yaklaşması için ihtiyacınız olan şey, tersine çevrilebilir olmasıdır: dizisinden j dizisine geçme olasılığı , ters yönde hareket etmekle aynıdır. Bu nedenle, olası tüm dizilerde bir Markov zinciri gerçekleştirmek için aşağıdaki hareketleri (hangi hareket türünün yapılacağını seçmek için bazı sabit olasılık dağılımıyla) kullanmanızı öneririm. Aşağıda, bir "koşma" aynı renkteki topların bir üst üste ardışık dizisidir. Bu Markov zinciri, en az üç renge dayanmaktadır.ij

  1. Rastgele iki tur seçin. Onları değiştirebilir ve hala yasal bir sıraya sahipseniz, bunu yapın.

  2. Bitişik iki koşuyu seçin. Onları değiştirebilir ve hala yasal bir sıraya sahipseniz, bunu yapın.

  3. Aynı renkten iki tur seçin. İçlerindeki topları yasal olasılıklar arasında rasgele yeniden dağıtın (bu nedenle, tek bir koşudaki maksimum top sayısı 3 ise ve seçilen iki koşuda toplam 5 topunuz varsa, birincisi 2 veya 3 top alma olasılığı yüksektir; toplamda 3 top vardı, birincisi 1 veya 2'ye eşit olarak eşittir; toplam 4 top varsa, 1, 2 ve 3 eşittir).

  4. Rastgele bir renk seçin . Renk C i'nin tüm topları çıkarılmış olan topların S sırasını göz önünde bulundurun . Şimdi, farklı renklerde bitişik topların temas ettiği S random ' da rastgele iki nokta seçin .CiSCiS

    a. Orada renk iki çalışır ise orijinal dizi bu iki noktada S ve de en fazla uzunluk, yarım olasılıkla seçilen her bir yön birinden diğerine bir top hareket eder.CiS

    b. Orada renk iki çalışır ise orijinal dizi bu iki noktada S , ama bir maksimum uzunluk ve diğer değil, yarım olasılık ile bir daha kısa uzunluğu en fazla mesafeden bir topu taşımak.CiS

    c. Renk sadece bir çalışma varsa bu iki noktadan birinde S diğer noktaya vadede itibaren bir topu taşımak ½ olasılıkla,. CiS

    d. Renk hiçbir çalışma yoksa bu noktaların her iki yerde bu noktaların her ikisinde de maksimum uzunlukta ishal varsa ya, hiçbir şey.Ci

Analizim doğruysa, bu, sonunda renkli topların yasal dizilerinin düzgün bir dağılımına dönüşen geri dönüşümlü bir Markov zinciridir, bu nedenle bu zinciri yeterince uzun süre çalıştırırsanız, bu düzgün dağılıma çok yakın olacaksınız.

Bunun ne zaman yakınlaştığını nasıl anlarsınız? Bu dizinin entropisini izlemeyi ve artmayı bıraktığında durmayı öneririm. Entropiyi nasıl hesaplarsınız? Entropi hesaplamasında iki ana terim vardır: çalışma uzunluklarının dağılımı ve her çalışmanın sahip olduğu renk sırası. Çalışma uzunluklarının dağılımı için, i uzunluğunda k renkli renklerinin olduğunu varsayalım . Entropi bunlardan katkıdır Σ i log 2 ( Σ k n i , kni,kik buradarbir çalışmanın izin verilen maksimum uzunluğudur. Şimdi renk dizisinin entropiye katkısını ele alalım. Varsayalım kimi,jrenklerinin biridizisinin hemen ardındanjrenklerinden biri gelir(yanimi,i=0). Entropi bu katkısı olan Σilog2(Σjm

i log2 (kni,kni,1 ni,2  ni,r),
rmi,jijmi,i=0 buradacrenk sayısıdır.
i log2 (jmi,jmi,1 mi,2  mi,c),
c

(Doğruluk açısından, ilk topun rengi de dahil olmak üzere entropiye bazı katkılar bıraktığımızı not edelim, ancak bunlar ihmal edilmesi güvenli olması gereken daha düşük dereceli terimlerdir.)

GÜNCELLEME:

Bunu hızlandırmanın yolları olmalı. Adım c ve d için, bu iki adımı aynı anda tek bir rengin tüm işlemlerinde gerçekleştirmek için analiz kullanabileceğinizi düşünüyorum. A ve b adımları için bu, aynı renkteki iki topun temas etmemesi kısıtlamasıyla rastgele bir renkli top dizisi bulma sorusuna eşdeğerdir. Bu sorun için karıştırma yapmanın iyi bir yolu olmalı. Daha sonra, a / b adımlarını c / d adımlarıyla değiştirmelisiniz, burada her adım bu iki hareketin tamamen karışır. Sanırım bu Markov zinciri için çok sıkı bir analizim olmamasına rağmen oldukça hızlı bir şekilde birleşmeli.


0

Dediğin gibi, her permütasyon eşit olasılıkla olmasını sağlamak mümkün değildir ve permütasyon biri bir satırda bütün kırmızılar çünkü, renkler eşit olarak dağıtılmış olduğundan emin olun.

Renklerin eşit olarak dağılmasını sağlamak için çok zarif ama kesinlikle açık olmayan bir yöntem, düşük bir tutarsızlık dizisinden yararlanmaktır.

N-=4001N-s

Aynı renkteki tüm topların arka arkaya numaralandığından emin olun. Yani, sizin durumunuzda, ilk 100 top kırmızı, sonraki 40 sarı, sonraki 50 yeşil vb.

kincixk

xk=(s+kφ)(şık1),
  • φ=1+52=1.61803399 ...
  • (şık1)
  • s

N-xk

xk

s=0

{B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,B,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,B,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,G,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,B,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,B,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,B,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K}
BK

s

xk

n=400

phi = (1+pow(5,0.5))/2
x = np.zeros(n)                 
s = np.random.uniform(0,1)
for i in range(n):
    x = (s + phi*(i+1)) %1

print (s)
print (x)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.