Anda di halaman 1dari 4

Fungsi [tugas, biaya] = munkres (costMat)

% MUNKRES Munkres (Hungaria) Algoritma Linear Assignment Problem.


%
% [ASSIGN, BIAYA] = munkres (COSTMAT) mengembalikan indeks kolom yang optimal,
% ASSIGN ditugaskan untuk setiap baris dan BIAYA minimum berdasarkan tugas
Masalah% diwakili oleh COSTMAT, di mana (i, j) th unsur merupakan biaya untuk me
netapkan j yang
% Pekerjaan untuk pekerja engan.
%
% Tugas Partial: Kode ini dapat mengidentifikasi tugas parsial adalah penuh
% Tugas tidak layak. Untuk tugas parsial, ada beberapa
% Nol elemen dalam vektor tugas kembali, yang mengindikasikan
Tugas% un-ditugaskan. Biaya dikembalikan hanya berisi biaya sebagian
% Ditugaskan tugas.
% Ini adalah implementasi vectorized algoritma. Ini adalah tercepat
% Di antara semua implementasi Matlab dari algoritma.
Contoh%
Contoh% 1: 5 x 5 contoh
% {
[tugas, biaya] = munkres (magic (5));
disp (tugas); % 3 2 1 5 4
disp (biaya); % 15
%}
% Contoh 2: 400 x 400 data acak
% {
n = 400;
A = rand (n);
gerenyet
[a, b] = munkres (A);
toc% sekitar 2 detik
%}
Contoh% 3: tugas persegi panjang dengan biaya inf
% {
A = rand (10,7);
A (A> 0,7) = Inf;
[a, b] = munkres (A);
%}
Contoh% 4: contoh tugas parsial
% {
A = [1 3 Inf; Inf Inf 5; Inf Inf 0,5];
[a, b] = munkres (A)
%}
% A = [1 0 3]
% B = 1.5
% Referensi:
% "Munkres 'Tugas Algoritma, Modifikasi untuk Rectangular Matriks",
% http://csclab.murraystate.edu/bob.pilgrim/445/munkres.html
% Versi 2.3 dengan Yi Cao di Cranfield University pada 11 September 2011
tugas = nol (1, ukuran (costMat, 1));
Biaya = 0;
validMat = costMat == costMat & costMat <Inf;
bigM = 10 ^ (ceil (log10 (sum (costMat (validMat)))) + 1);
costMat (~ validMat) = bigM;
% CostMat (costMat ~ = costMat) = Inf;

% ValidMat = costMat <Inf;


validCol = apapun (validMat, 1);
validRow = apapun (validMat, 2);
nrows = sum (validRow);
nCols = sum (validCol);
n = max (nrows, nCols);
jika ~ n
kembali
akhir
maxv = 10 * max (costMat (validMat));
dMat = nol (n) + maxv;
dMat (1: nrows, 1: nCols) = costMat (validRow, validCol);
% *************************************************
% Munkres 'Tugas Algoritma dimulai di sini
% *************************************************
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%
% LANGKAH 1: Kurangi minimum baris dari setiap baris.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%
minR = min (dMat, [], 2);
Minc = min (bsxfun (minus, dMat, minR));
% ************************************************* *************************
% LANGKAH 2: Cari nol dMat. Jika tidak ada angka nol berbintang di nya
% Kolom atau baris mulai nol. Ulangi untuk setiap nol
% ************************************************* *************************
ZP = dMat == bsxfun (plus, Minc, minR);
Starz = nol (n, 1);
sementara setiap (ZP (:))
[r, c] = menemukan (ZP, 1);
Starz (r) = c;
ZP (r,:) = false;
ZP (:, c) = false;
akhir
sementara 1
% ************************************************* *************************
% LANGKAH 3: Tutup setiap kolom dengan nol bintangnya. Jika semua kolom
% Tertutup maka pencocokan maksimum
% ************************************************* *************************
jika semua (Starz> 0)
istirahat
akhir
coverColumn = false (1, n);
coverColumn (Starz (Starz> 0)) = true;
coverRow = false (n, 1);
primeZ = nol (n, 1);
[rIdx, cIdx] = menemukan (dMat (~ coverRow, ~ coverColumn) == bsxfun (@ ditambah, m
inR (~ coverRow), Minc (~ coverColumn)));
sementara 1
% ************************************************* *************************
% LANGKAH 4: Cari nol noncovered dan perdana itu. Jika tidak ada starred
% Nol di baris yang berisi ini prima nol, Pergi ke Langkah 5.
% Jika tidak, meliputi baris ini dan mengungkap kolom yang berisi
% Yang dibintangi nol. Lanjutkan dengan cara ini sampai tidak ada

% Nol terungkap kiri. Menyimpan nilai uncovered terkecil dan


% Pergi ke Langkah 6.
% ************************************************* *************************
cR = find (~ coverRow);
cC = menemukan (~ coverColumn);
rIdx = cR (rIdx);
cIdx = cC (cIdx);
Langkah = 6;
sementara ~ IsEmpty (cIdx)
uZr = rIdx (1);
uZc = cIdx (1);
primeZ (uZr) = uZc;
STZ = Starz (uZr);
jika ~ STZ
Langkah = 5;
break;
akhir
coverRow (uZr) = true;
coverColumn (STZ) = false;
z = rIdx == uZr;
rIdx (z) = [];
cIdx (z) = [];
cR = find (~ coverRow);
z = dMat (~ coverRow, STZ) == minR (~ coverRow) + Minc (STZ);
rIdx = [rIdx (:); cR (z)];
cIdx = [cIdx (:); STZ (yang (sum (z), 1))];
akhir
jika Langkah == 6
% ************************************************* ************************
% LANGKAH 6: Tambah nilai uncovered minimum untuk setiap elemen masing-masing te
% Baris, dan kurangi dari setiap elemen setiap kolom ditemukan.
% Kembali ke Langkah 4 tanpa mengubah apapun bintang, bilangan prima, atau garis
% ************************************************* *************************
[minval, rIdx, cIdx] = outerplus (dMat (~ coverRow, ~ coverColumn), minR (~ cove
(~ coverColumn));
Minc (~ coverColumn) = Minc (~ coverColumn) + minval;
minR (coverRow) = minR (coverRow) - minval;
lain
istirahat
akhir
akhir
% ************************************************* *************************
% LANGKAH 5:
% Buatlah serangkaian bolak prima dan dibintangi nol sebagai
% Berikut:
Biarkan% Z0 mewakili ditemukan prima nol ditemukan pada Langkah 4.
Biarkan% Z1 menyatakan membintangi nol di kolom Z0 (jika ada).
Biarkan% Z2 menyatakan prima nol dalam deretan Z1 (ada akan selalu
% Menjadi salah satu). Lanjutkan sampai seri berakhir pada nol prima
% Yang tidak memiliki membintangi nol dalam kolomnya. Redupkan setiap berbintang
% Nol dari seri, masing-masing membintangi prima nol dari seri, menghapus
% Semua bilangan prima dan mengungkap setiap baris dalam matriks. Kembali ke Langka
h 3.
% ************************************************* *************************
rowZ1 = find (Starz == uZc);
Starz (uZr) = uZc;
sementara rowZ1> 0
Starz (rowZ1) = 0;
uZc = primeZ (rowZ1);
uZr = rowZ1;

rowZ1 = find (Starz == uZc);


Starz (uZr) = uZc;
akhir
akhir
% Biaya penugasan
rowIdx = find (validRow);
colIdx = find (validCol);
Starz = Starz (1: nrows);
vIdx = Starz <= nCols;
tugas (rowIdx (vIdx)) = colIdx (Starz (vIdx));
lulus = penugasan (assignment> 0);
lulus (~ diag (validMat (tugas> 0, lulus))) = 0;
tugas (tugas> 0) = lulus;
Biaya = trace (costMat (tugas> 0, tugas (assignment> 0)));
Fungsi [minval, rIdx, cIdx] = outerplus (M, x, y)
ny = ukuran (M, 2);
minval = inf;
untuk c = 1: ny
M (:, c) = M (:, c) - (x + y (c));
minval = min (minval, min (M (:, c)));
akhir
[rIdx, cIdx] = menemukan (M == minval);

Anda mungkin juga menyukai

  • MH
    MH
    Dokumen5 halaman
    MH
    MohammadMuchtarMahfudz
    Belum ada peringkat
  • Deret Fourier Revisi
    Deret Fourier Revisi
    Dokumen8 halaman
    Deret Fourier Revisi
    MohammadMuchtarMahfudz
    Belum ada peringkat
  • Tinjauan Pustaka M-File
    Tinjauan Pustaka M-File
    Dokumen4 halaman
    Tinjauan Pustaka M-File
    MohammadMuchtarMahfudz
    Belum ada peringkat
  • Translate Metode Hungarian
    Translate Metode Hungarian
    Dokumen5 halaman
    Translate Metode Hungarian
    MohammadMuchtarMahfudz
    Belum ada peringkat
  • Daftar Pustaka
    Daftar Pustaka
    Dokumen1 halaman
    Daftar Pustaka
    MohammadMuchtarMahfudz
    Belum ada peringkat
  • Daftar Isi
    Daftar Isi
    Dokumen4 halaman
    Daftar Isi
    MohammadMuchtarMahfudz
    Belum ada peringkat
  • Cover PKL
    Cover PKL
    Dokumen2 halaman
    Cover PKL
    MohammadMuchtarMahfudz
    Belum ada peringkat
  • Bab I Bingung
    Bab I Bingung
    Dokumen2 halaman
    Bab I Bingung
    MohammadMuchtarMahfudz
    Belum ada peringkat