Giustificazione del metodo ungherese (Kuhn-Munkres)


14

Ho scritto un'implementazione dell'algoritmo Kuhn-Munkres per il problema della corrispondenza perfetta bipartita di peso minimo basato sugli appunti delle lezioni che ho trovato qua e là sul web. Funziona davvero bene, anche su migliaia di vertici. E sono d'accordo sul fatto che la teoria che sta dietro sia veramente bella. Eppure mi chiedo ancora perché ho dovuto fare così tanto. Trovo che questi appunti non spieghino perché non possiamo semplicemente prendere il programma lineare primario e passarlo al metodo simplex. Ovviamente sospetto che si tratti di prestazioni prevedibili, ma dal momento che non l'ho visto esplicitamente dichiarato, non sono troppo sicuro. È stato dimostrato che i punti estremi del primitivo del politopo sono in 0-1, quindi sembra che possiamo alimentarlo direttamente a un'implementazione simplex senza nemmeno formulare il doppio. O sto diventando semplicistico?

Risposte:


16

(Spostato da un commento.)

Ovviamente puoi risolvere qualsiasi LP usando un solutore LP generico, ma gli algoritmi specializzati in genere hanno molto prestazioni migliori.

Non si tratta solo di garanzie teoriche di prestazioni asintotiche, ma anche di prestazioni pratiche del mondo reale. Algoritmi come il metodo ungherese possono essere estremamente semplificati e sono relativamente facili da implementare in modo corretto ed efficiente.

Spesso puoi anche evitare problemi come l'uso di numeri razionali esatti rispetto a numeri in virgola mobile; tutto può essere fatto facilmente con numeri interi.


14

Sebbene questa risposta sia corretta in senso generale, è anche utile cercare di capire specificamente cosa non va quando si applica il simplex primitivo al problema di assegnazione. Si consideri un problema di assegnazione NxN con matrice di costo quadrata c_ij. L'LP corrispondente ha N ^ 2 variabili x_ij da risolvere. Pensando a questi x_ij come a una matrice quadrata X, una soluzione fattibile richiede che X sia una matrice di permutazione, che è applicata da vincoli 2N-1 nel nostro LP (a prima vista può sembrare che ci siano vincoli 2N, uno per ogni riga e uno per ogni colonna, ma non sono tutti indipendenti e ne eliminiamo uno). I vincoli LP formano quindi una matrice (2N-1) x (N ^ 2) A.

Ora, si forma una soluzione di base scegliendo un insieme di (2N-1) variabili di base. Tuttavia, affinché questa soluzione di base sia fattibile, solo N di quelle variabili può avere valore 1 e l'altra (N-1) è 0. Pertanto, ogni soluzione fattibile è degenerata. Il problema con questa degenerazione è che una qualsiasi delle variabili di base (N-1) che sono 0 può essere scambiata con una qualsiasi delle variabili non basiche (N ^ 2-2N + 1), un cosiddetto "perno degenerato", senza effetto sul valore della funzione obiettivo [stai semplicemente scambiando una variabile 0 con un'altra]. Quando N è grande, l'algoritmo simplex primario spreca molto tempo a creare perni degenerati che non migliorano la soluzione. Questo è il nocciolo del perché l'algoritmo ingenuo simplex primitivo non viene utilizzato direttamente per risolvere il problema di assegnazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.