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(1≤i≤n)|Ci|ixi(1≤i≤n)xi∈Ciℓ1ℓ2∑i=1n−1|xi−xi+1|∑i=1n−1(xi−xi+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. Cix1…nC
— 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,1≤j≤mCost⁡(i,j)=mink=1m(Cost⁡(i−1,k)+|C(i−1)k−Cij|) ,2≤i≤n,1≤j≤m.

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)v∈Vix∈Ciu∈Vi,v∈Vi+1(u,v)ℓ1ℓ2

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.