fundo
Suponha que eu tenha dois lotes idênticos de bolinhas de gude. Cada mármore pode ser uma das cores , onde . Deixe denotam o número de berlindes de cor em cada lote.
Seja o multiset representando um lote. Na representação de frequência , também pode ser escrito como .
O número de permutações distintas de é dado pelo multinomial :
Questão
Existe um algoritmo eficiente para gerar duas permutações difusas e perturbadas e de aleatoriamente? (A distribuição deve ser uniforme.)
Uma permutação é difusa se para cada elemento distinto de , os casos de são espaçados de forma aproximadamente uniforme em .
Por exemplo, suponha que .
- não é difuso
- é difuso
Mais rigorosamente:
- Se , há apenas uma instância de para "espaçar" em , então deixe .i P Δ ( 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 ) - n i P Δ ( i )
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 2
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 ) = 0
Duas permutações e são desarranjadas se é uma desarranjo de ; isto é, para cada índice .QP i ≠ Q i i ∈ [
Por exemplo, suponha que .
- e não são perturbados
- e estão desarranjados
Análise exploratória
Estou interessado na família de multisets com e para . Em particular, vamos .
A probabilidade de que duas permutações aleatórias e de sejam perturbadas é de cerca de 3%.
Isso pode ser calculado da seguinte maneira, onde é o polinômio do ésimo Laguerre: Veja aqui uma explicação.
A probabilidade de uma permutação aleatória de ser difusa é de cerca de 0,01%, definindo o limiar arbitrário em aproximadamente .
Abaixo está um gráfico de probabilidade empírica de 100.000 amostras de onde é uma permutação aleatória de .
Em tamanhos médios de amostra, .
A probabilidade de que duas permutações aleatórias sejam válidas (difusas e desarranjadas) é de cerca de .
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.
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.
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?
Respostas:
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) x h φ y h e 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.
fonte
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
derange
sub - 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 pora.
"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 (select
no # 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, false
para 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
c
1000 desarranjos nas 3 abordagens (# 116) ec
= 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 seguinteisso mostra que o
a-true
algoritmo 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
fonte