Come mescolare le palle di colore?


10

Ho 400 palline, di cui 100 rosse, 40 gialle, 50 verdi, 60 blu, 70 viola, 80 nere. (le palle dello stesso colore sono identiche)

ho bisogno di un algoritmo di mescolamento efficiente, in modo che dopo il mescolamento, le palle siano in un elenco e

Le 3 palline consecutive non sono dello stesso colore. ad esempio, non posso avere "rosso, rosso, rosso, giallo ...."

E tutte le permutazioni hanno probabilità "ugualmente" di verificarsi. (beh, se il compromesso tra efficienza e imparzialità è abbastanza buono, non mi dispiace più efficienza di imparzialità).

ho provato ad adattare Fisher-Yates-Knuth, ma il risultato non è l'ideale.

Perché Fisher-Yates non è abbastanza bravo? Mentre FY adotta la trasformazione inversa di Monte Carlo. E la distribuzione dell'output tratta le sfere dello stesso colore in modo diverso, ovvero genererebbe un risultato distorto per le mie esigenze.

E il pensiero ingenuo sarebbe quello di filtrare / retrocedere tutte le cattive permutazioni dell'intero spazio. Quando la restrizione è molto forte, diciamo, se abbiamo solo 300 palline e 100 delle quali sono rosse, allora ci saranno troppi inseguimenti / insuccessi prima di ottenere una permutazione appropriata.

Quindi, in definitiva, vorrei poter iterare attraverso tutte le buone permutazioni. Tuttavia, poiché il numero di permutazioni valide è troppo elevato, posso campionarne solo in modo casuale. Voglio che la caratteristica statistica di "alcuni" assomigli il più possibile alla popolazione.


3
Hai provato ad adattare le risposte dall'altra domanda che hai posto? Entrambe le domande sembrano molto simili :).
Gopi,

@Gopi: sì, e spero che le risposte a entrambe le domande possano ispirare l'altra.
Colinfang,

L'idea più semplice che mi viene in mente è quella di iniziare a scegliere casualmente una pallina da un certo colore, in cui ogni colore verrà scelto con una probabilità in base al numero di palline rimaste con quel colore, con la restrizione che se le ultime 2 palline avessero il stesso colore, non è possibile sceglierlo nell'iterazione corrente. L'efficienza non dovrebbe essere negativa e non riesco a vedere alcun pregiudizio (il che non significa che non ce ne sia nessuno; forse mi manca qualcosa).
George,

3
θ(nk)kθ(nk/2)

2
@GeorgeB. Anche se l'approccio di David Eppstein è più economico, sarei interessato a come risolvere questo problema con un approccio MCMC.
Peter Shor,

Risposte:


7

ij

  1. Scegli due serie a caso. Se puoi scambiarli e hai ancora una sequenza legale, fallo.

  2. Scegli due percorsi adiacenti. Se puoi scambiarli e hai ancora una sequenza legale, fallo.

  3. Scegli due serie dello stesso colore. Ridistribuisci le palline in modo casuale tra le possibilità legali (quindi se il numero massimo di palline in una singola corsa è stato 3, e hai avuto 5 palline in totale nelle due corse scelte, la prima avrà ugualmente probabilità di ottenere 2 o 3 palline; se c'erano 3 palle in totale, la prima ha ugualmente probabilità di ottenere 1 o 2; se c'erano 4 palle in totale, 1, 2 e 3 sono tutte ugualmente probabili).

  4. CiSCiS

    CiS

    CiS

    CiS

    Ci

Se la mia analisi è corretta, questa è una catena di Markov reversibile che alla fine converge in una distribuzione uniforme di sequenze legali di palline colorate, quindi se percorri questa catena abbastanza a lungo, ti avvicinerai molto a questa distribuzione uniforme.

ni,kik

i log2 (kni,kni,1 ni,2  ni,r),
rmi,jijmi,i=0
i log2 (jmi,jmi,1 mi,2  mi,c),
c

(Nell'interesse dell'accuratezza, fammi notare che stiamo lasciando fuori un numero di contributi all'entropia, incluso il colore della prima palla, ma questi sono termini di ordine inferiore che dovrebbero essere sicuri di trascurare.)

AGGIORNARE:

Ci dovrebbero essere modi per accelerare questo. Credo che per i passaggi c e d sia possibile utilizzare l'analisi per eseguire entrambi questi passaggi su tutte le esecuzioni di un colore contemporaneamente. Per i passaggi aeb, ciò equivale alla questione di trovare una sequenza casuale di palline colorate con il vincolo che non toccano due palline dello stesso colore. Dovrebbe esserci un buon modo di fare il missaggio per questo problema. Quindi devi solo alternare i passaggi a / b con i passaggi c / d, in cui ogni passaggio si mescola completamente su quei due movimenti. Penso che questo dovrebbe convergere abbastanza velocemente, anche se non ho alcuna analisi rigorosa per questa catena di Markov.


0

Come hai detto, non è possibile garantire che ogni permutazione sia ugualmente probabile e garantire che i colori siano distribuiti uniformemente, perché una delle permutazioni ha tutti i rossi di fila.

Un metodo molto elegante, ma certamente non ovvio, per garantire che i colori siano distribuiti uniformemente è quello di sfruttare una sequenza a bassa discrepanza.

N=4001Ns

Accertarsi che tutte le sfere dello stesso colore siano numerate in sequenza. Cioè, nel tuo caso, lascia che le prime 100 palline siano rosse, le successive 40 siano gialle, le successive 50 verdi, ecc.

kthxk

xk=(s+kϕ)(mod1),
  • ϕ=1+52=1.61803399...
  • (mod1)
  • s

Nxk

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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.