İki parçalı graflarda eşleşmeleri maksimize eden Bipartite Matching ve tercih sıralamalarına göre kararlı çiftler oluşturan Kararlı Evlilik (Stable Marriage - Gale-Shapley) algoritmalarını içerir.
Eşleştirme (Matching), bir grafta ortak ucu olmayan kenarların seçilmesi problemidir.
İki Parçalı Eşleştirme (Bipartite Matching), düğümlerin iki gruba ayrıldığı (örn. işler ve işçiler) ve sadece gruplar arası kenarların olduğu yapılarda eşleşmeleri maksimize eder. Bu problem, kaynağa ve hedefe sanal kenarlar eklenerek maksimum akış (Network Flow) problemine indirgenebilir.
Kararlı Evlilik Problemi (Stable Marriage), iki eşit büyüklükteki kümenin (örn. adaylar ve şirketler) birbirleri hakkındaki tercih listelerine göre eşleştirilmesidir. Gale-Shapley algoritması, hiçbir adayın ve şirketin mevcut eşlerinden ziyade birbirlerini tercih etmeyeceği "kararlı" (stable) bir eşleşmeyi garanti eder. Algoritma her zaman kararlı ve teklif eden taraf lehine en optimum sonucu üretir.
Aşağıdaki uygulamalar PDF kaynaklarındaki pseudo kod akışını modern veri yapılarıyla ifade eder. Kenar durumları görünür bırakıldığı için örnekler doğrudan test edilebilir.
1function galeShapley(2 menPrefs: Record, 3 womenPrefs: Record 4): Record { 5 const men = Object.keys(menPrefs);6 const freeMen = [...men];7 const engagements: Record = {}; // Kadın -> Erkek 8 const proposals: Record = {}; // Erkek -> Teklif indeksi 910 for (const m of men) proposals[m] = 0;1112 // Yardımcı tercih sırası araması13 const womenPrefIndex: Record> = {}; 14 for (const w of Object.keys(womenPrefs)) {15 womenPrefIndex[w] = {};16 womenPrefs[w].forEach((man, rank) => {17 womenPrefIndex[w][man] = rank;18 });19 }2021 while (freeMen.length > 0) {22 const m = freeMen.shift()!;23 const mList = menPrefs[m];24 const pIdx = proposals[m];2526 if (pIdx < mList.length) {27 const w = mList[pIdx];28 proposals[m]++; // Sonraki teklif için2930 const currentPartner = engagements[w];31 if (!currentPartner) {32 // Kadın bekar33 engagements[w] = m;34 } else {35 // Tercih karşılaştır36 const rankNew = womenPrefIndex[w][m] ?? Infinity;37 const rankOld = womenPrefIndex[w][currentPartner] ?? Infinity;3839 if (rankNew < rankOld) {40 engagements[w] = m;41 freeMen.push(currentPartner); // Eski eş serbest kaldı42 } else {43 freeMen.push(m); // Teklif reddedildi44 }45 }46 }47 }4849 return engagements;50}Erkek ve Kadın tercihlerini ayırın (; ve | ile). Örnek: M1:W1,W2|M2:W2,W1 ; W1:M2,M1|W2:M1,M2
Erkek ve Kadın tercihlerini ayırın (; ve | ile). Örnek: M1:W1,W2|M2:W2,W1 ; W1:M2,M1|W2:M1,M2
En İyi Durum: O(N)
Ortalama Durum: O(N^2)
En Kötü Durum: O(N^2)
O(N^2) tercih matrisleri - Bu algoritmanın karmaşıklığı belirtilmemiş.
Eşleştirme ve Evlilik (Matching & Marriage) Algoritması ile benzer veya alternatif olarak değerlendirilebilecek diğer başlıklar: