Poniższa odpowiedź jest w zasadzie równoważna tej, którą już znasz, ale może wydawać się nieco mniej „magiczna”. Z drugiej strony jest bardziej techniczna, ale uważam, że ogólna technika „napisz swój problem jako optymalizacja macierzy permutacji i wywołaj Birkhoffa-von Neumanna” jest świetna do poznania.
Dla permutacji z zdefiniuj macierz permutacji jako macierz 0-1, tak że jeśli i przeciwnym razie. Jest to po prostu macierz, która permutuje współrzędne wektora zgodnie z : jeśli to . Odtąd oznaczę jako .{ 1 , … , n } P σ P i j = 1 j = σ ( i ) P i j = 0 x σ y = P σ x y i = x σ ( i ) y = P σ x σ ( x )σ{1,…,n}PσPij=1j=σ(i)Pij=0xσy=Pσxyi=xσ(i)y=Pσxσ(x)
Jeszcze jedna definicja: nieujemna macierz jest podwójnie stochastyczna, jeśli każdy z jej wierszy i każda z kolumn sumuje się do 1.M.n×nM
I jeden fakt, który jest bardzo ważny w optymalizacji kombinatorycznej - twierdzenie Birkhoffa-von Neumanna:
Macierz jest podwójnie stochastyczna wtedy i tylko wtedy, gdy jest wypukłą kombinacją macierzy permutacji, tj. i tylko wtedy, gdy istnieją permutacje i dodatnie reals takie, że i .σ 1 , … , σ k α 1 , … , α k M = ∑ k i = 1 α i P σ i ∑ α i = 1Mσ1,…,σkα1,…,αkM=∑ki=1αiPσi∑αi=1
Zauważ, że podwójnie stochastyczna matryca jest definiowana przez nierówności
∀i:∑j=1nMij=1
∀j:∑i=1nMij=1
∀i,j:Mij≥0
Wszystkie te nierówności wzięte razem determinują polytop , a twierdzenie Birkhoffa-von Neumanna stwierdza, że wszystkie krańcowe punkty (wierzchołki) tego polytopa są macierzami permutacji. Z podstawowego programowania liniowego wiemy, że oznacza to, że każdy program liniowy, który ma powyższe nierówności jako swoje ograniczenia (i żadnych innych ograniczeń), będzie miał macierz permutacji jako optymalne rozwiązanie.P
Zatem biorąc pod uwagę dane wejściowe do posortowania, musimy tylko opracować liniowy cel dla którego:a=(a1,…,an)fa(M)
- fa(Pτ)<fa(Pσ) jeśli jest posortowane, ale nie jest.σ(a)τ(a)
Następnie sformułuj program liniowy w celu maksymalizacji i powyższych nierówności jako ograniczeń, a masz gwarancję, że optymalnym rozwiązaniem jest macierz permutacji dla tak że jest sortowane. Oczywiście łatwo jest „odczytać” z .fa(M)Pσσσ(a)σPσ
Jednym wyborem dla jest gdzie . Zweryfikuj tofa(M)vTMav=(1,…,n)
- jest to liniowe w ;M
- dla , ;f a ( P σ ) = ∑ n i = 1 i a σ ( i )Pσfa(Pσ)=∑ni=1iaσ(i)
- powyższe jest zmaksymalizowane przy dla którego sortowana jest (sprzecznie: w przeciwnym razie możesz zmienić dwie współrzędne i osiągnąć wyższą wartość).σ ( a ) σ ( a )σσ(a)σ(a)
I voila, masz liniowy program do sortowania. Wydaje się głupie do sortowania, ale w rzeczywistości jest to skuteczna metoda optymalizacji.