%
% [MATCHING, BIAYA] = Hungarian_New (bobot)
%
% Pencocokan Fungsi untuk menemukan bobot sisi minimum yang diberikan Edge MxN
% Bobot matriks berat menggunakan Algoritma Hungaria.
%
Sebuah% berat tepi Inf menunjukkan bahwa pasangan simpul yang diberikan oleh per
usahaan
Posisi% tidak memiliki tepi yang berdekatan.
%
% MATCHING kembali matriks MxN dengan orang-orang di tempat yang matching dan
% Nol di tempat lain.
%
% BIAYA mengembalikan biaya pencocokan minimum
% Ditulis oleh: Alex Melin 30 Juni 2006
% Inisialisasi Variabel
Matching = nol (ukuran (Perf));
% Menyingkat Matrix Kinerja dengan menghapus setiap simpul tidak terhubung ke
% Meningkatkan kecepatan algoritma
% Cari nomor di setiap
num_y = sum (~ isinf
% Cari nomor di setiap
num_x = sum (~ isinf
exit_flag = 1;
stepnum = 1;
sementara exit_flag
beralih stepnum
kasus 1
[P_cond, stepnum] = step1 (P_cond);
kasus 2
[r_cov, c_cov, M, stepnum] = step2 (P_cond);
kasus 3
[c_cov, stepnum] = step3 (M, P_size);
kasus 4
[M, r_cov, c_cov, Z_r, Z_c, stepnum] = step4 (P_cond, r_cov, c_cov, M);
kasus 5
[M, r_cov, c_cov, stepnum] = step5 (M, Z_r, Z_c, r_cov, c_cov);
kasus 6
[P_cond, stepnum] = step6 (P_cond, r_cov, c_cov);
kasus 7
exit_flag = 0;
akhir
akhir
% Hapus semua satelit virtual dan target dan uncondense yang
% Matching dengan ukuran kinerja matriks asli.
Matching (x_con, y_con) = M (1: length (x_con), 1: length (y_con));
Biaya = sum (sum (Perf (Matching == 1)));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%
% LANGKAH 1: Tentukan jumlah terkecil nol di setiap baris
% Dan mengurangi minimum yang dari barisnya
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%
Fungsi [P_cond, stepnum] = step1 (P_cond)
P_size = panjang (P_cond);
% Loop, melalui penerapan setiap baris
untuk ii = 1: P_size
Rmin = min (P_cond (ii, :));
P_cond (ii, :) = P_cond (ii,:) - Rmin;
akhir
stepnum = 2;
%
%
%
%
************************************************* *************************
LANGKAH 2: Cari nol di P_cond. Jika tidak ada angka nol berbintang di nya
Kolom atau baris mulai nol. Ulangi untuk setiap nol
************************************************* *************************
jika P_cond (ii, jj) == 0 && r_cov (ii) == 0 && c_cov (jj) == 0
M (ii, jj) = 1;
r_cov (ii) = 1;
c_cov (jj) = 1;
akhir
akhir
akhir
% Re-inisialisasi vektor penutup
r_cov = nol (P_size, 1); % A vektor yang menunjukkan jika berturut-turut tert
utup
c_cov = nol (P_size, 1); % A vektor yang menunjukkan jika kolom ditutupi
stepnum = 3;
%
%
%
%
************************************************* *************************
LANGKAH 3: Tutup setiap kolom dengan nol bintangnya. Jika semua kolom
Tertutup maka pencocokan maksimum
************************************************* *************************
Z_r = 0;
Z_c = 0;
lain
% Perdana nol uncovered
M (baris, col) = 2;
% Jika ada nol berbintang di baris yang
% Tutup baris dan mengungkap kolom yang berisi nol
jika sum (menemukan (M (baris,:) == 1)) ~ = 0
r_cov (baris) = 1;
zcol = find (M (baris,:) == 1);
c_cov (zcol) = 0;
lain
stepnum = 5;
zflag = 0;
Z_r = baris;
Z_c = col;
akhir
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 Lan
gkah 3.
% ************************************************* *************************
Fungsi [M, r_cov, c_cov, stepnum] = step5 (M, Z_r, Z_c, r_cov, c_cov)
zflag = 1;
ii = 1;
sementara zflag
% Cari nomor indeks yang membintangi nol dalam kolom
rindex = find (M (:, Z_c (ii)) == 1);
jika rindex> 0
Simpan% yang dibintangi nol
ii = ii + 1;
% Simpan deretan nol berbintang
Z_r (ii, 1) = rindex;
% Kolom dari membintangi nol adalah sama dengan kolom
% Prima nol
Z_c (ii, 1) = Z_c (ii-1);
lain
zflag = 0;
akhir
Lanjutkan% jika ada membintangi nol di kolom nol prima
jika zflag == 1;
% Cari kolom dari nol prima di babak berbintang nol baris
cindex = find (M (Z_r (ii),:) == 2);
ii = ii + 1;
Z_r (ii, 1) = Z_r (ii-1);
Z_c (ii, 1) = cindex;
akhir
akhir
% Redupkan semua nol berbintang di jalan dan STAR semua nol prima
untuk ii = 1: length (Z_r)
jika M (Z_r (ii), Z_c (ii)) == 1
M (Z_r (ii), Z_c (ii)) = 0;
lain
M (Z_r (ii), Z_c (ii)) = 1;
akhir
akhir
Batal% selimut
r_cov = r_cov * 0.;
c_cov = c_cov * 0.;
% Hapus semua bilangan prima
M (M == 2) = 0;
stepnum = 3;
% ************************************************* ************************
% LANGKAH 6: Tambah nilai uncovered minimum untuk setiap elemen masing-masing te
rtutup
% Baris, dan kurangi dari setiap elemen setiap kolom ditemukan.
% Kembali ke Langkah 4 tanpa mengubah apapun bintang, bilangan prima, atau garis
tertutup.
% ************************************************* *************************
Fungsi [P_cond, stepnum] = step6 (P_cond, r_cov, c_cov)
a = find (r_cov == 0);
b = find (c_cov == 0);
minval = min (min (P_cond (a, b)));
P_cond (menemukan (r_cov == 1), :) = P_cond (menemukan (r_cov == 1), :) + minval
;
P_cond (:, menemukan (c_cov == 0)) = P_cond (:, menemukan (c_cov == 0)) - minval
;
stepnum = 4;
Fungsi cnum = min_line_cover (Ujung)
Langkah 2%
[r_cov, c_cov, M, stepnum] = step2 (Ujung);
Langkah 3%
[c_cov, stepnum] = step3 (M, panjang (Ujung));
Langkah 4%
[M, r_cov, c_cov, Z_r, Z_c, stepnum] = step4 (Edge, r_cov, c_cov, M);
% Hitung kekurangan
cnum = panjang (Ujung) -sum (r_cov) -sum (c_cov);
Google Terjemahan untuk Bisnis:Perangkat PenerjemahPenerjemah Situs WebPeluang P
asar Global