Algoritmo efficiente per generare due permutazioni diffuse e squilibrate di un multiset a caso


13

sfondo

Supponiamo che io abbia due lotti identici di biglie. Ogni marmo può essere di uno dei colori , dove c≤n . Lascia che n_i indichi il numero di biglie di colore i in ciascun lotto.nccnnii

Sia S il multiset {1,,1n1,2,,2n2,,1c,,cnc} rappresenta un batch. Nella rappresentazione della frequenza , S può anche essere scritto come (1n12n2cnc) .

Il numero di permutazioni distinte di S è dato dal multinomiale :

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

Domanda

Esiste un algoritmo efficiente per generare casualmente due permutazioni diffuse e squilibrate P e Q di S ? (La distribuzione dovrebbe essere uniforme.)

  • Una permutazione P è diffusa se per ogni elemento distinto i di P , le istanze di i vengano ripartite abbastanza regolare in P .

    Ad esempio, supponiamo S=(1424)={1,1,1,1,2,2,2,2} .

    • {1,1,1,2,2,2,2,1} non è diffuso
    • {1,2,1,2,1,2,1,2} è diffuso

    Più rigorosamente:

    • Se , c'è solo un'istanza di per “spaziare” in , quindi lascia .ni=1iPΔ(i)=0
    • Altrimenti, lasciare che la distanza tra dell'istanza  e istanza  di in . Sottrai da essa la distanza prevista tra le istanze di , definendo quanto segue: Se è uniformemente spaziato in , allora dovrebbe essere zero, o molto vicino a zero se .d(i,j)jj+1iPi
      δ(i,j)=d(i,j)nniΔ(i)=j=1ni1δ(i,j)2
      iPΔ(i)nin

    Definire la statistica per misurare la quantità di ogni è equamente distanziati in . Chiamiamo diffuso se è vicino a zero, o approssimativamente . (Si può scegliere una soglia specifica di modo che sia diffusa se )s(P)=i=1cΔ(i)iPPs(P)s(P)n2k1SPs(P)<kn2

    Questo vincolo richiama un problema di pianificazione in tempo reale più rigoroso chiamato problema pinwheel con multiset (in modo che ) e densità . L'obiettivo è programmare una sequenza infinita ciclica tale che qualsiasi sottosequenza di lunghezza contenga almeno un'istanza di . In altre parole, un programma fattibile richiede tutto ; se è denso ( ), quindi e . Il problema della girandola sembra essere NP-completo.A=n/Sai=n/niρ=i=1cni/n=1Paiid(i,j)aiAρ=1d(i,j)=ais(P)=0

  • Due permutazioni e sono distorte se è una variazione di ; cioè, per ogni indice .PQPQPiQii[n]

    Ad esempio, supponiamo che .S=(1222)={1,1,2,2}

    • {1,2,1,2} e non sono distorti{1,1,2,2}
    • {1,2,1,2} e sono squilibrati{2,1,2,1}

Analisi esplorativa

Sono interessato alla famiglia di multiset con e per . In particolare, .n=20ni=4i4D=(1424344352617181)

  • La probabilità che due permutazioni casuali e di siano squilibrate è di circa il 3%.PQD

    Questo può essere calcolato come segue, dove è il polinomio di Laguerre: Vedi qui per una spiegazione.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
  • La probabilità che una permutazione casuale di sia diffusa è di circa lo 0,01%, impostando la soglia arbitraria a circa .PDs(P)<25

    Di seguito è riportato un diagramma della probabilità empirica di 100.000 campioni di cui è una permutazione casuale di .s(P)PD

    A campioni di dimensioni medie, .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

La probabilità che siano valide due permutazioni casuali (sia diffusa che distorta) è di circa .v(0.03)(0.0001)21010

Algoritmi inefficienti

Un algoritmo "veloce" comune per generare un disordine casuale di un set è basato sul rifiuto:

do
     P ← random_permutation ( D )
fino a is_derangement ( D , P )
ritorno P

che richiede approssimativamente iterazioni, poiché ci sono all'incirca possibili variazioni. Tuttavia, un algoritmo randomizzato basato sul rifiuto non sarebbe efficace per questo problema, in quanto prenderebbe l'ordine delle iterazioni .en!/e1/v1010

Nell'algoritmo utilizzato da Sage , un disordine casuale di un multiset "si forma scegliendo un elemento a caso dall'elenco di tutti i possibili disordini". Eppure anche questo è inefficiente, in quanto vi sono permutazioni valide per enumerare, e inoltre, uno avrebbe bisogno di un algoritmo solo per farlo comunque.v|SD|21016

Ulteriori domande

Qual è la complessità di questo problema? Può essere ridotto a qualsiasi paradigma familiare, come flusso di rete, colorazione dei grafici o programmazione lineare?


Per quanto riguarda la tua definizione di "distanziati", non vuoi per con come sentinelle? Vale a dire, un singolo elemento dovrebbe essere nel mezzo, due dovrebbero suddividere la permutazione in terzi e così via. d(i,j)n/(ni+1)0ijn+1P0=Pn+1=i
Raffaello

Cosa succede se per il male (piccolo, ma abbastanza grande); abbiamo anche abbiamo diffuse permutazioni rispetto? Certamente non sopportiamo un cambiamento nel trovarne due squilibrati! Sembra che nessun elemento possa verificarsi più di volte. S={1nk,2k}kn/2
Raffaello

1
Qual è il rapporto di tutte le coppie di permutazioni squilibrate tra tutte le coppie di permutazioni diffuse ? Allo stesso modo, tra tutte le coppie di permutazioni squilibrate, quante sono costituite da due diffuse? (Se uno dei due rapporti è "alto", possiamo concentrare i nostri sforzi su metà del processo, lasciando l'altro al rifiuto.)
Raffaello

1
@Raphael (# 3a) Di 1 milione di permutazioni casuali di , queste 561 diffuse avevano . delle coppie sono squilibrate. Ds(P)306118/(5612)=6118/1570803.9%
hftf

1
@Raphael (# 3b) Di 10 milioni di coppie casuali di permutazioni di , 306893 coppie sono state squilibrate. Solo 29 di queste coppie avevano entrambe le permutazioni con . Ecco un istogramma ( valori ). Ds(P)50
hftf

Risposte:


3

Un approccio: puoi ridurlo al seguente problema: Data una formula booleana , scegli un incarico uniformemente a caso tra tutti i compiti soddisfacenti di . Questo problema è NP-difficile, ma esistono algoritmi standard per generare un distribuito in modo approssimativamente uniforme, prendendo in prestito metodi dagli algoritmi #SAT. Ad esempio, una tecnica è quella di scegliere una funzione hash cui intervallo ha una dimensione accuratamente scelta (circa la stessa dimensione del numero di assegnazioni soddisfacenti di ), scegliere uniformemente a caso un valore all'interno dell'intervallo diφ(x)xφ(x)xhφyh, quindi utilizzare un solutore SAT per trovare un compito soddisfacente per la formula . Per renderlo efficiente, puoi scegliere h come una mappa lineare sparsa.φ(x)(h(x)=y)h

Questo potrebbe essere sparare a una pulce con un cannone, ma se non hai altri approcci che sembrano praticabili, questo è uno che potresti provare.


trovandolo difficile da seguire. è un valore booleano e h ( x ) è una stringa binaria (insieme di variabili binarie)? quindi l'equazione finale significa ...? φ(x)h(x)
vzn,

0

alcune discussioni / analisi estese su questo problema sono iniziate in una chat cs con ulteriori retroscena che hanno scoperto un po 'di soggettività nei complessi requisiti del problema ma non hanno riscontrato alcun errore o svista. 1

ecco un codice testato / analizzato che, rispetto all'altra soluzione basata su SAT, è relativamente "veloce e sporco" ma non banale / difficile da eseguire il debug. è vagamente basato concettualmente su uno schema di ottimizzazione pseudocasuale / avido locale in qualche modo simile ad esempio a 2-OPT per TSP . l'idea di base è quella di iniziare con una soluzione casuale che si adatti a qualche vincolo, e quindi perturbarla localmente per cercare miglioramenti, cercare avidamente miglioramenti e iterare attraverso di essi e terminare quando tutti i miglioramenti locali sono stati esauriti. un criterio di progettazione era che l'algoritmo doveva essere il più efficiente / evitare il più possibile il rifiuto.

esiste una ricerca sugli algoritmi di derangement [4] ad esempio utilizzati in SAGE [5] ma non sono orientati attorno a multiset.

la semplice perturbazione è solo "scambi" di due posizioni nella tupla (e). l'implementazione è in rubino. di seguito è riportato un riepilogo / note con riferimenti ai numeri di riga.

qb2.rb (gist-github)

l'approccio qui è di iniziare con due tuple squilibrate (n. 106) e quindi migliorare localmente / avidamente la dispersione (n. 107), combinate in un concetto chiamato derangesperse(n. 97), preservando lo squilibrio. notare che lo scambio di due stesse posizioni nella coppia di tuple preserva il disordine e può migliorare la dispersione e questo è (parte del) metodo / strategia di dispersione.

la derangesubroutine funziona da sinistra a destra sull'array (multiset) e scambia con elementi successivi nell'array in cui lo swap non è con lo stesso elemento (# 10). l'algoritmo ha esito positivo se, senza ulteriori swap nell'ultima posizione, le due tuple sono ancora squilibrate (n. 16).

ci sono 3 diversi approcci per cancellare le tuple iniziali. la seconda tupla p2viene sempre mescolata. si può iniziare con la tupla 1 ( p1) ordinata per a."primo ordine di poteri più alti" (# 128), b.ordine mischiato (# 127) c.e "primo ordine di poteri più bassi" ("ultimo ordine di poteri più alti") (# 126).

la routine di dispersione disperseè più coinvolta ma concettualmente non così difficile. usa nuovamente gli swap. piuttosto che cercare di ottimizzare la dispersione in generale su tutti gli elementi, cerca semplicemente di alleviare in modo iterativo l'attuale caso peggiore. l'idea è quella di trovare il 1 st elementi meno dispersi, da sinistra a destra. la perturbazione è scambiare gli elementi sinistro o destro ( x, yindici) della coppia meno dispersa con altri elementi ma mai nessuno tra la coppia (che ridurrebbe sempre la dispersione), e anche saltare il tentativo di scambiare con gli stessi elementi ( selectin # 71) . mè l'indice del punto medio della coppia (# 65).

tuttavia la dispersione viene misurata / ottimizzata su entrambe le tuple nella coppia (# 40) usando la dispersione "minima / più a sinistra" in ciascuna coppia (# 25, # 44).

i tentativi algoritmo per scambiare elementi "più lontani" 1 st ( sort_by / reverse# 71).

ci sono due diverse strategie true, falseper decidere se scambiare l'elemento sinistro o destro della coppia meno dispersa (# 80), o l'elemento sinistro per scambiare la posizione con l'elemento sinistro / destro sul lato destro, o l'elemento più lontano sinistro o destro nella coppia dispersa dall'elemento swap.

l'algoritmo termina (n. 91) quando non può più migliorare la dispersione (spostando la posizione di dispersione peggiore verso destra o aumentando la dispersione massima sull'intera coppia di tuple (n. 85)).

le statistiche sono emesse per scarti oltre c= 1000 disordinamenti sui 3 approcci (# 116) e c= 1000 derangesperses (# 97), esaminando i 2 algoritmi dispersi per una coppia squilibrata dal rifiuto (# 19, # 106). quest'ultimo traccia la dispersione media totale (dopo un declassamento garantito). una corsa di esempio è la seguente

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

questo dimostra che l' a-truealgoritmo fornisce i migliori risultati con una non-reiezione del ~ 92% e una distanza dispersa media peggiore di ~ 2,6, e un minimo garantito di 2 su 1000 prove, vale a dire almeno 1 elemento non uguale interposto tra tutte le coppie dello stesso elemento. ha trovato soluzioni fino a 3 elementi intermedi non uguali.

l'algoritmo di derangement è pre-rifiuto del tempo lineare e l'algoritmo di dispersione (in esecuzione su input distorto) sembra essere probabilmente ~ .O(nlogn)

1 il problema è trovare disposizioni di pacchetti di quizbowl che soddisfino il cosiddetto "feng shui" [1] o un ordinamento casuale "piacevole" in cui "bello" è in qualche modo soggettivo e non ancora "ufficialmente" quantificato; l'autore del problema lo ha analizzato / ridotto ai criteri di derange / dispersione basati sulla ricerca della comunità dei quizbowl e degli "esperti di feng shui". [2] ci sono idee diverse su "regole del feng shui". alcune ricerche "pubblicate" sono state fatte sugli algoritmi, ma appare nelle prime fasi. [3]

[1] Pacchetto feng shui / QBWiki

[2] Pacchetti quizbowl e feng shui / Lifshitz

[3] Posizionamento delle domande , forum del centro risorse di HSQuizbowl

[4] Generating Derangements casuali / Martinez, Panholzer, Prodinger

[5] Algoritmo di sage derangement (python) / McAndrew


A proposito, ho pensato di più, c'è un problema tecnico nella routine del derange e non sempre lo scompone. la posizione di scambio può avanzare senza cambiare nulla. c'è una semplice soluzione per testare correttamente il successo.
vzn,
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.