Minimizar a variação total de uma sequência de escolhas discretas


8

Minha configuração é mais ou menos assim: eu tenho uma sequência de conjuntos de números inteiros , comrelativamente pequeno - na ordem de quatro ou cinco itens para todos . Quero escolher uma sequência com cada modo que a variação total ( ou , ou seja, ou ) é minimizado. Embora pareça que a escolha para cada seja 'local', o problema é que as escolhas podem se propagar e ter efeitos não locais e, portanto, o problema parece inerentemente global por natureza.Ci(1in)|Ci|ixi(1in)xiCi12i=1n1|xixi+1|i=1n1(xixi+1)2xi

Minha principal preocupação está em um algoritmo prático para o problema; No momento, estou usando métodos de recozimento baseados em mutações subseqüentes curtas e, embora devam estar bem, parece que eu deveria fazer melhor. Mas também estou interessado na complexidade abstrata - meu palpite seria que a versão padrão da consulta ('existe uma solução de variação total ?') Seria NP-completa através da redução de algum problema de restrição como 3 SAT, mas não consigo ver a redução. Qualquer sugestão para o estudo anterior seria bem-vinda - parece um problema tão natural que não posso acreditar que não tenha sido analisado antes, mas minhas pesquisas até agora não revelaram nada parecido.k


Boa pergunta! Apenas uma pergunta esclarecedora: o comprimento de é , mas você deve escolher algum elemento de cada ? Ou é bom ter algum número de conjuntos dos quais você não escolhe? xinCi
Juho

@mrm Deve haver um elemento para cada - os s são indexados diretamente de assim como os s. Cix1nC
Steven Stadnicki

Respostas:


4

Aqui está um programa dinâmico. Suponha que para todos os por uma questão de clareza; o seguinte pode ser adaptado para funcionar se o tiver cardinalidades diferentes. Seja o custo mínimo de uma sequência nos primeiros conjuntos , terminando com . A seguinte recursão descreve :Ci={Ci1,,Cim}i[n]CiCost(i,j)iCijCost

Cost(1,j)=0,1jmCost(i,j)=mink=1m(Cost(i1,k)+|C(i1)kCij|) ,2in,1jm.

O custo mínimo geral é ; a sequência real de escolhas pode ser determinada examinando os argumentos ao longo do caminho. O tempo de execução é .minj=1mCost(n,j)O(nm)


Tentei melhorar a clareza da sua resposta na formatação e na apresentação; por favor, verifique se eu não estraguei tudo. Seria bom se você incluísse um argumento sobre por que o que você propõe está correto.
Raphael

Considerando a resposta de Nicholas , isso é semelhante ao algoritmo de Bellman-Ford, adaptado ao problema em questão.
Raphael

Ambas as respostas são realmente excelentes (e, como Raphael observa, muito semelhantes), mas, embora eu goste da ampla aplicabilidade da outra, eu realmente prefiro essa por sua aplicação direta à minha pergunta em particular. Obrigado!
Steven Stadnicki

4

Parece que isso pode ser resolvido simplesmente computando o caminho mais curto em um gráfico acíclico direcionado. O raciocínio é que sua função objetivo minimiza a distância total entre "vizinhos" selecionados em seus conjuntos .C={C1,,Cn}

Construa um gráfico em estágios onde cada corresponde a um elemento exclusivo . Para cada , adicione uma aresta direcionada cujo custo seja a ou .nG=(i=1nVi,E)vVixCiuVi,vVi+1(u,v)12

Agora adicione um vértice de origem com arestas de custo 0 a e um vértice de afundamento com arestas de custo 0 de . Como é um DAG e as duas funções de distância forçam os custos de borda a não serem negativos, é possível calcular o caminho mais curto em com classificação topológica e programação dinâmica (semelhante à descrição aqui ).sV1tVnGO(V+E)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.