Câu trả lời sau đây về cơ bản tương đương với câu bạn đã biết, nhưng có vẻ hơi "ma thuật" hơn một chút. Mặt khác, nó mang tính kỹ thuật cao hơn, nhưng tôi tin rằng kỹ thuật chung "viết vấn đề của bạn như là một sự tối ưu hóa trên ma trận hoán vị và gọi Birkhoff-von Neumann" là một điều tuyệt vời cần biết.
Đối với hoán vị của { 1 , Trực , n } xác định ma trận hoán vị P σ là ma trận 0-1 sao cho P i j = 1 nếu j = σ ( i ) và P i j = 0 nếu không. Đây đơn giản là ma trận mà permutes tọa độ của một vectơ x theo σ : nếu y = P σ x sau đó y i = x σσ{ 1 , ... , n }PσPtôi j= 1j = σ( tôi )Ptôi j= 0xσy= Pσx . Tôi sẽ biểu thịy= P σ xlàσ(x)từ bây giờ.ytôi= xσ( tôi )y= Pσxσ( x )
Một nét hơn: a không âm ma trận M là gấp đôi-ngẫu nhiên nếu mỗi người trong các hàng của nó và mỗi một trong các cột số tiền của mình cho 1.n × nM
Và một thực tế rất quan trọng trong tối ưu hóa tổ hợp - định lý Birkhoff-von Neumann:
Một ma trận là gấp đôi ngẫu nhiên khi và chỉ khi nó là sự kết hợp lồi của ma trận hoán vị, tức là nếu và chỉ nếu có tồn tại hoán vị σ 1 , ... , σ k và tập số thực dương alpha 1 , ... , α k mà M = Σ k i = 1 α i P σ i và ∑ α i = 1 .Mσ1, ... , σkα1, ... , αkM= ∑ki = 1αtôiPσtôiΣ alphatôi= 1
Lưu ý rằng một ma trận ngẫu nhiên kép được xác định bởi các bất đẳng thức
∀ j : n Σ i = 1 M i j = 1 ∀ i , j : M i j ≥ 0
∀ i : Σj = 1nMtôi j= 1
∀ j : Σi = 1nMtôi j= 1
∀ i , j : Mtôi j≥ 0
Tất cả các bất đẳng thức được kết hợp với nhau xác định một đa giác và định lý Birkhoff-von Neumann nói rằng các điểm cực trị (đỉnh) của đa giác này đều là ma trận hoán vị. Từ lập trình tuyến tính cơ bản, chúng ta biết điều này ngụ ý rằng bất kỳ chương trình tuyến tính nào có bất đẳng thức trên là các ràng buộc của nó (và không có ràng buộc nào khác) sẽ có ma trận hoán vị là một giải pháp tối ưu.P
Vì vậy, được sắp xếp một đầu vào , chúng ta chỉ cần đưa ra một mục tiêu tuyến tính f a ( M ) mà:a = ( a1, ... , mộtn)fmột( M)
- fmột( Pτ) < fmột( Pσ)σ( a )τ( a )
fmột( M)Pσσσ( a )σPσ
fmột( M)vTMmộtv = ( 1 , ĐI , n )
- M
- Pσfmột( Pσ) = ∑ni = 1tôi mộtσ( tôi )
- σσ( a )σ( a )
Và voila, bạn có một chương trình tuyến tính để sắp xếp. Có vẻ ngớ ngẩn để sắp xếp, nhưng thực tế đây là một phương pháp mạnh mẽ trong tối ưu hóa.