La siguiente respuesta es básicamente equivalente a la que ya conoce, pero puede parecer un poco menos "mágica". Por otro lado, es más técnico, pero creo que la técnica general "escribir su problema como una optimización en matrices de permutación e invocar a Birkhoff-von Neumann" es excelente.
Para una permutación de { 1 , ... , n } defina la matriz de permutación P σ como la matriz 0-1 de modo que P i j = 1 si j = σ ( i ) y P i j = 0 de lo contrario. Esta es simplemente la matriz que permuta las coordenadas de un vector x de acuerdo con σ : si y = P σ x entonces y i = x σσ{1,…,n}PσPij=1j=σ(i)Pij=0xσy=Pσxyi=xσ(i) . Denotaré como σ ( x ) de ahora en adelante.y=Pσxσ(x)
Una definición más: una matriz no negativa M es doblemente estocástica si cada una de sus filas y cada una de sus columnas suma 1.n×nM
Y un hecho que es muy importante en la optimización combinatoria: el teorema de Birkhoff-von Neumann:
Una matriz es doblemente estocástica si y solo si es una combinación convexa de matrices de permutación, es decir, si y solo si existen permutaciones σ 1 , ... , σ k y reales positivos α 1 , ... , α k tal que M = ∑ k i = 1 α i P σ i y ∑ α i = 1 .Mσ1,…,σkα1,…,αkM=∑ki=1αiPσi∑αi=1
Observe que una matriz doblemente estocástica está definida por las desigualdades
∀ j : n ∑ i = 1 M i j = 1 ∀ i , j : M i j ≥ 0
∀i:∑j=1nMij=1
∀j:∑i=1nMij=1
∀i,j:Mij≥0
Todas estas desigualdades tomadas juntas determinan un politopo , y el teorema de Birkhoff-von Neumann establece que los puntos extremos (vértices) de este politopo son todas matrices de permutación. Por programación lineal básica, sabemos que esto implica que cualquier programa lineal que tenga las desigualdades anteriores como sus restricciones (y ninguna otra restricción) tendrá una matriz de permutación como una solución óptima.P
Entonces, dada una entrada para ser ordenada, solo tenemos que llegar a un objetivo lineal f a ( M ) para el cual:a=(a1,…,an)fa(M)
- fa(Pτ)<fa(Pσ)σ(a)τ(a) no lo está.
fa(M)Pσσσ(a)σPσ .
fa(M)vTMav=(1,…,n) . Verificalo
- M ;
- Pσfa(Pσ)=∑ni=1iaσ(i) ;
- σσ(a)σ(a)
Y listo, tienes un programa lineal para ordenar. Parece una tontería clasificar, pero este es de hecho un método poderoso en la optimización.