La seguente risposta è sostanzialmente equivalente a quella che già conosci, ma può sembrare un po 'meno "magica". D'altra parte, è più tecnico, ma credo che la tecnica generale "scrivere il tuo problema come ottimizzazione sulle matrici di permutazione e invocare Birkhoff-von Neumann" sia ottima da sapere.
Per una permutazione di { 1 , … , n } definire la matrice di permutazione P σ come la matrice 0-1 in modo tale che P i j = 1 se j = σ ( i ) e P i j = 0 altrimenti. Questa è semplicemente la matrice che consente le coordinate di un vettore x secondo σ : se y = P σ x allora y i = x σσ{ 1 , ... , n }PσPio j= 1j = σ( i )Pio j= 0Xσy= PσX . Denoteròy= P σ xcomeσ(x)da ora in poi.yio= xσ( i )y= PσXσ( x )
Un'altra definizione: una matrice non negativa M è doppiamente stocastica se ciascuna delle sue righe e ciascuna delle sue colonne si somma a 1.n × nM
E un fatto che è molto importante nell'ottimizzazione combinatoria: il teorema di Birkhoff-von Neumann:
Una matrice è doppiamente stocastica se e solo se è una combinazione convessa di matrici di permutazione, cioè se e solo se esistono permutazioni σ 1 , … , σ k e reali positivi α 1 , … , α k tale che M = ∑ k i = 1 α i P σ i e ∑ α i = 1 .Mσ1, ... , σKα1, ... , αKM= ∑Ki = 1αioPσio∑ αio= 1
Si noti che una matrice doppiamente stocastica è definita dalle disuguaglianze
∀ j : n ∑ i = 1 M i j = 1 ∀ i , j : M i j ≥ 0
∀ i : ∑j = 1nMio j= 1
∀ j : ∑i = 1nMio j= 1
∀ i , j : Mio j≥ 0
Tutte queste disuguaglianze prese insieme determinano un politopo , e il teorema di Birkhoff-von Neumann afferma che i punti estremi (vertici) di questo politopo sono tutte matrici di permutazione. Dalla programmazione lineare di base, sappiamo che questo implica che qualsiasi programma lineare che abbia le suddette disuguaglianze come i suoi vincoli (e nessun altro vincolo) avrà una matrice di permutazione come soluzione ottimale.P
Quindi, dato un input da ordinare, dobbiamo solo trovare un obiettivo lineare f a ( M ) per il quale:a = ( a1, ... , unn)fun'( M)
- se σ ( a ) è ordinato ma τ ( a ) no.fa(Pτ)<fa(Pσ)σ(a)τ(a)
Quindi formulare un programma lineare con l'obiettivo di massimizzare e le disuguaglianze sopra come vincoli, e si è sicuri che una soluzione ottimale sia la matrice di permutazione P σ per σ tale che σ ( a ) sia ordinato. Naturalmente, è facile "leggere" σ da P σ .fa(M)Pσσσ(a)σPσ
fa(M)vTMav=(1,…,n)
- M
- Pσfa(Pσ)=∑ni=1iaσ(i)
- σσ(a)σ(a)
E voilà, hai un programma lineare per l'ordinamento. Sembra sciocco per l'ordinamento, ma questo è in realtà un potente metodo di ottimizzazione.