Algoritmo eficiente para gerar duas permutações difusas e desarranjadas de um conjunto múltiplo aleatoriamente

13

fundo

Suponha que eu tenha dois lotes idênticos de n bolinhas de gude. Cada mármore pode ser uma das cores c , onde cn . Deixe ni denotam o número de berlindes de cor i em cada lote.

Seja S o multiset {1,,1n1,2,,2n2,,1c,,cnc} representando um lote. Na representação de frequência , S também pode ser escrito como (1n12n2cnc) .

O número de permutações distintas de S é dado pelo multinomial :

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

Questão

Existe um algoritmo eficiente para gerar duas permutações difusas e perturbadas P e Q de S aleatoriamente? (A distribuição deve ser uniforme.)

  • Uma permutação P é difusa se para cada elemento distinto i de P , os casos de i são espaçados de forma aproximadamente uniforme em P .

    Por exemplo, suponha que S=(1424)={1,1,1,1,2,2,2,2} .

    • {1,1,1,2,2,2,2,1} não é difuso
    • {1,2,1,2,1,2,1,2} é difuso

    Mais rigorosamente:

    • Se , há apenas uma instância de para "espaçar" em , então deixe .i P Δ ( i ) = 0ni=1iPΔ(i)=0
    • Caso contrário, deixe é a distância entre o exemplo  e exemplo  de em . Subtraia a distância esperada entre as instâncias de , definindo o seguinte: Se estiver uniformemente espaçado em , então deverá ser zero ou muito próximo de zero se .j j + 1 i P i δ ( i , j ) = d ( i , j ) - nd(i,j)jj+1iPi i P Δ ( i )
      δ(i,j)=d(i,j)nniΔ(i)=j=1ni1δ(i,j)2
      iPΔ(i)nin

    Agora definir a estatística para medir a quantidade de cada é uniformemente espaçados em . Chamamos difuso se for próximo de zero, ou aproximadamente . (Pode-se escolher um limite específico para para que seja difuso se )i P P s ( P ) s ( P ) n 2 k 1 S P s ( P ) < k n 2s(P)=i=1cΔ(i)iPPs(P)s(P)n2k1SPs(P)<kn2

    Essa restrição lembra um problema mais estrito de agendamento em tempo real chamado problema de cata -vento com multiset (para que ) e densidade . O objetivo é agendar uma sequência infinita cíclica modo que qualquer subsequência de comprimento contenha pelo menos uma instância de . Em outras palavras, uma programação viável requer todos os ; se é densa ( ), então e . O problema do cata-vento parece estar completo com NP.um i = n / n i ρ = Σ c i = 1 n i / n = 1 P um i i d ( i , j ) um i Um ρ = 1 d ( i , j ) = um i s ( P ) = 0A=n/Sai=n/niρ=i=1cni/n=1Paiid(i,j)aiAρ=1d(i,j)=ais(P)=0

  • Duas permutações e são desarranjadas se é uma desarranjo de ; isto é, para cada índice .QPQPP iQ i i [QPiQii[n]

    Por exemplo, suponha que .S=(1222)={1,1,2,2}

    • {1,2,1,2} e não são perturbados{1,1,2,2}
    • {1,2,1,2} e estão desarranjados{2,1,2,1}

Análise exploratória

Estou interessado na família de multisets com e para . Em particular, vamos .n=20ni=4i4D=(1424344352617181)

  • A probabilidade de que duas permutações aleatórias e de sejam perturbadas é de cerca de 3%.PQD

    Isso pode ser calculado da seguinte maneira, onde é o polinômio do ésimo Laguerre: Veja aqui uma explicação.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
  • A probabilidade de uma permutação aleatória de ser difusa é de cerca de 0,01%, definindo o limiar arbitrário em aproximadamente .PDs(P)<25

    Abaixo está um gráfico de probabilidade empírica de 100.000 amostras de onde é uma permutação aleatória de .s(P)PD

    Em tamanhos médios de amostra, .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

A probabilidade de que duas permutações aleatórias sejam válidas (difusas e desarranjadas) é de cerca de .v(0.03)(0.0001)21010

Algoritmos ineficientes

Um algoritmo "rápido" comum para gerar um desarranjo aleatório de um conjunto é baseado em rejeição:

fazer
     P ← random_permutation ( D )
até is_derangement ( D , P )
retornar P

que leva aproximadamente iterações, uma vez que existem cerca de possíveis distúrbios. No entanto, um algoritmo aleatório baseado em rejeição não seria eficiente para esse problema, pois levaria na ordem de iterações.en!/e1/v1010

No algoritmo usado pelo Sage , um desarranjo aleatório de um multiset "é formado escolhendo um elemento aleatoriamente da lista de todos os possíveis desarranjos". No entanto, isso também é ineficiente, pois existem permutações válidas para enumerar e, além disso, seria necessário um algoritmo para fazer isso de qualquer maneira.v|SD|21016

Outras perguntas

Qual é a complexidade desse problema? Pode ser reduzido a qualquer paradigma familiar, como fluxo de rede, coloração de gráficos ou programação linear?

hftf
fonte
Em relação à sua definição de "espaçado", você não deseja que para com como sentinelas? Ou seja, um único elemento deve estar no meio, dois devem particionar a permutação em terços e assim por diante. d(i,j)n/(ni+1)0ijn+1P0=Pn+1=i
Raphael
O que acontece se para o mal (pequeno, mas grande o suficiente); nós temos permutações difusas? Certamente não suportamos uma mudança para encontrar duas demente! Parece que nenhum elemento pode ocorrer mais de vezes. S={1nk,2k}kn/2
Raphael
1
Qual é a razão de todos os pares de permutações perturbadas entre todos os pares de permutações difusas ? Da mesma forma, de todos os pares de permutações perturbadas, quantos consistem em duas difusas? (Se uma das razões for "alta", podemos concentrar nosso esforço em uma metade do processo, deixando a outra em rejeição.)
Raphael
1
@Raphael (# 3a) De 1 milhão de permutações aleatórias de , essas 561 difusas tinham . dos pares estão desarranjados. Ds(P)306118/(5612)=6118/1570803.9%
hftf 5/05
1
@Raphael (# 3b) Dos 10 milhões de pares aleatórios de permutações de , 306893 pares eram perturbados. Apenas 29 desses pares tiveram ambas as permutações com . Aqui está um histograma ( valores ). Ds(P)50
hftf 5/05

Respostas:

3

Uma abordagem: você pode reduzir isso ao seguinte problema: Dada uma fórmula booleana , escolha uma atribuição uniformemente aleatoriamente dentre todas as atribuições satisfatórias de . Esse problema é difícil para o NP, mas existem algoritmos padrão para gerar um que é distribuído aproximadamente uniformemente, emprestando métodos dos algoritmos #SAT. Por exemplo, uma técnica é escolher uma função hash cujo intervalo tenha um tamanho cuidadosamente escolhido (aproximadamente o mesmo tamanho que o número de atribuições satisfatórias de ), escolher uniformemente aleatoriamente um valor dentro do intervalo dex φ ( x ) x h φ y h φ ( x ) ( h ( x ) = y ) hφ(x)xφ(x)xhφyhe use um solucionador SAT para encontrar uma atribuição satisfatória para a fórmula . Para torná-lo eficiente, você pode escolher como um mapa linear esparso.φ(x)(h(x)=y)h

Isso pode estar matando uma pulga com um canhão, mas se você não tiver outras abordagens que pareçam viáveis, essa é uma que você pode tentar.

DW
fonte
achando isso difícil de seguir. é um valor booleano e é uma string binária (conjunto de variáveis ​​binárias)? então a equação final significa ...? h ( x )φ(x)h(x)
Vzn
0

algumas discussões / análises estendidas sobre esse problema começaram no bate - papo do cs com outros antecedentes, que descobriram alguma subjetividade nos requisitos complexos do problema, mas não encontraram nenhum erro ou supervisão geral. 1

aqui está um código testado / analisado que, comparado com a outra solução baseada em SAT, é relativamente "rápido e sujo", mas não é trivial / complicado para depurar. é vagamente conceitualmente baseado em um esquema de otimização pseudo-aleatório / ganancioso local, algo semelhante a, por exemplo, 2-OPT for TSP . a idéia básica é começar com uma solução aleatória que se encaixa em alguma restrição e, em seguida, perturbá-la localmente para procurar melhorias, buscando avidamente por melhorias e iterando através delas e terminando quando todas as melhorias locais tiverem sido esgotadas. um critério de projeto era que o algoritmo fosse o mais eficiente / evitasse a rejeição o máximo possível.

existe alguma pesquisa sobre algoritmos de desarranjo [4], por exemplo, usados ​​no SAGE [5], mas eles não são orientados em torno de vários conjuntos.

a perturbação simples é apenas "troca" de duas posições na (s) tupla (s). a implementação está em ruby. A seguir, são apresentadas algumas visões gerais / notas com referências aos números das linhas.

qb2.rb (gist-github)

a abordagem aqui é começar com duas tuplas desarranjadas (# 106) e depois melhorar localmente / avidamente a dispersão (# 107), combinada em um conceito chamado derangesperse(# 97), preservando a desarranjo. note que a troca de duas mesmas posições no par de tuplas preserva a perturbação e pode melhorar a dispersão e isso é (parte do) método / estratégia dispersa.

a derangesub - rotina funciona da esquerda para a direita na matriz (multiset) e troca com elementos posteriormente na matriz em que a troca não está com o mesmo elemento (nº 10). o algoritmo será bem-sucedido se, sem mais trocas na última posição, as duas tuplas ainda estiverem desarranjadas (# 16).

existem 3 abordagens diferentes para desarranjar as tuplas iniciais. a 2ª tupla p2é sempre embaralhada. pode-se começar com a tupla 1 ( p1) ordenada por a."primeira ordem de mais alta potência" (nº 128), b.ordem aleatória (nº 127) c.e "primeira ordem de mais baixa potência" ("última ordem de mais alta potência") (nº 126).

a rotina de dispersão disperseé mais envolvida, mas conceitualmente não é tão difícil. mais uma vez, usa swaps. em vez de tentar otimizar a dispersão em geral sobre todos os elementos, ele simplesmente tenta aliviar iterativamente o pior caso atual. a idéia é encontrar os 1 st elementos menos dispersos, esquerda para a direita. a perturbação é trocar os elementos esquerdo ou direito ( x, yíndices) do par menos disperso com outros elementos, mas nunca nenhum entre o par (o que sempre diminuiria a dispersão) e também pular a tentativa de trocar com os mesmos elementos ( selectno # 71) . mé o índice do ponto médio do par (# 65).

no entanto, a dispersão é medida / otimizada em ambas as tuplas do par (# 40) usando a dispersão "menos / mais à esquerda" em cada par (# 25, # 44).

o algoritmo tentativas para trocar elementos "mais distante" 1 st ( sort_by / reverse# 71).

existem duas estratégias diferentes true, falsepara decidir se é necessário trocar o elemento esquerdo ou direito do par menos disperso (nº 80), o elemento esquerdo para a posição de troca no elemento esquerdo / direito no lado direito ou o elemento mais à esquerda ou à direita no par disperso do elemento de troca.

o algoritmo termina (nº 91) quando não pode mais melhorar a dispersão (movendo a pior localização dispersa para a direita ou aumentando a dispersão máxima sobre todo o par de tuplas (nº 85)).

são produzidas estatísticas para rejeições acima de c1000 desarranjos nas 3 abordagens (# 116) e c= 1000 desarranjos (# 97), observando os 2 algoritmos dispersos para um par desarranjado da rejeição (# 19, # 106). o último rastreia a dispersão média total (após desarranjo garantido). um exemplo de execução é o seguinte

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

isso mostra que o a-truealgoritmo fornece melhores resultados com ~ 92% de não-rejeição e uma distância média dispersa pior de ~ 2,6 e um mínimo garantido de 2 a 1000 tentativas, ou seja, pelo menos 1 elemento intermediário não igual entre todos os pares do mesmo elemento. encontrou soluções com até três elementos não iguais.

o algoritmo de desarranjo é a pré-rejeição linear do tempo, e o algoritmo de dispersão (executando em entrada desarranjada) parece ser possivelmente ~ .O(nlogn)

1 o problema é encontrar arranjos de pacotes que satisfazem o chamado "feng shui" [1] ou uma ordem aleatória "agradável" em que "agradável" é um tanto subjetivo e ainda não quantificado "oficialmente"; o autor do problema o analisou / reduziu aos critérios de desarranjo / dispersão com base em pesquisas realizadas pela comunidade do questionário e "especialistas em feng shui". [2] existem idéias diferentes sobre "regras do feng shui". alguma pesquisa "publicada" foi realizada sobre algoritmos, mas aparece nos estágios iniciais. [3]

[1] Pacote feng shui / QBWiki

[2] Pacotes de Quizbowl e feng shui / Lifshitz

[3] Colocação de perguntas , fórum do centro de recursos HSQuizbowl

[4] Gerando desarranjos aleatórios / Martinez, Panholzer, Prodinger

[5] Algoritmo de desarranjo sábio (python) / McAndrew

vzn
fonte
Por outro lado, há uma falha na rotina do desarranjo e nem sempre desarranja. a posição de swap pode avançar sem trocar nada. Há uma correção simples para testar o sucesso corretamente.
vzn