Java Program to Implement Gale Shapley Algorithm

This is a Java Program to Implement Gale Shapley Algorithm. Gale Shapley Algorithm is used to solve the stable marriage problem (SMP). SMP is the problem of finding a stable matching between two sets of elements given a set of preferences for each element.

Algorithm is as follows:

function stableMatching {
    Initialize all m ∈ M and w ∈ W to free
    while ∃ free man m who still has a woman w to propose to {
       w = m's highest ranked such woman to whom he has not yet proposed
       if w is free
         (m, w) become engaged
       else some pair (m', w) already exists
         if w prefers m to m'
           (m, w) become engaged
           m' becomes free
         else
           (m', w) remain engaged
    }
}

Here is the source code of the Java Program to Implement Gale Shapley Algorithm. The Java program is successfully compiled and run on a Windows system. The program output is also shown below.

/**
 *    Java Program to Implement Gale Shapley Algorithm 
 **/
 
/** Class GaleShapley **/
public class GaleShapley
{
    private int N, engagedCount;
    private String[][] menPref;
    private String[][] womenPref;
    private String[] men;
    private String[] women;
    private String[] womenPartner;
    private boolean[] menEngaged;
 
    /** Constructor **/
    public GaleShapley(String[] m, String[] w, String[][] mp, String[][] wp)
    {
        N = mp.length;
        engagedCount = 0;
        men = m;
        women = w;
        menPref = mp;
        womenPref = wp;
        menEngaged = new boolean[N];
        womenPartner = new String[N];
        calcMatches();
    }
    /** function to calculate all matches **/
    private void calcMatches()
    {
        while (engagedCount < N)
        {
            int free;
            for (free = 0; free < N; free++)
                if (!menEngaged[free])
                    break;
 
            for (int i = 0; i < N && !menEngaged[free]; i++)
            {
                int index = womenIndexOf(menPref[free][i]);
                if (womenPartner[index] == null)
                {
                    womenPartner[index] = men[free];
                    menEngaged[free] = true;
                    engagedCount++;
                }
                else
                {
                    String currentPartner = womenPartner[index];
                    if (morePreference(currentPartner, men[free], index))
                    {
                        womenPartner[index] = men[free];
                        menEngaged[free] = true;
                        menEngaged[menIndexOf(currentPartner)] = false;
                    }
                }
            }            
        }
        printCouples();
    }
    /** function to check if women prefers new partner over old assigned partner **/
    private boolean morePreference(String curPartner, String newPartner, int index)
    {
        for (int i = 0; i < N; i++)
        {
            if (womenPref[index][i].equals(newPartner))
                return true;
            if (womenPref[index][i].equals(curPartner))
                return false;
        }
        return false;
    }
    /** get men index **/
    private int menIndexOf(String str)
    {
        for (int i = 0; i < N; i++)
            if (men[i].equals(str))
                return i;
        return -1;
    }
    /** get women index **/
    private int womenIndexOf(String str)
    {
        for (int i = 0; i < N; i++)
            if (women[i].equals(str))
                return i;
        return -1;
    }
    /** print couples **/
    public void printCouples()
    {
        System.out.println("Couples are : ");
        for (int i = 0; i < N; i++)
        {
            System.out.println(womenPartner[i] +" "+ women[i]);
        }
    }
    /** main function **/
    public static void main(String[] args) 
    {
        System.out.println("Gale Shapley Marriage Algorithm\n");
        /** list of men **/
        String[] m = {"M1", "M2", "M3", "M4", "M5"};
        /** list of women **/
        String[] w = {"W1", "W2", "W3", "W4", "W5"};
 
        /** men preference **/
        String[][] mp = {{"W5", "W2", "W3", "W4", "W1"}, 
                         {"W2", "W5", "W1", "W3", "W4"}, 
                         {"W4", "W3", "W2", "W1", "W5"}, 
                         {"W1", "W2", "W3", "W4", "W5"},
                         {"W5", "W2", "W3", "W4", "W1"}};
        /** women preference **/                      
        String[][] wp = {{"M5", "M3", "M4", "M1", "M2"}, 
                         {"M1", "M2", "M3", "M5", "M4"}, 
                         {"M4", "M5", "M3", "M2", "M1"},
                         {"M5", "M2", "M1", "M4", "M3"}, 
                         {"M2", "M1", "M4", "M3", "M5"}};
 
        GaleShapley gs = new GaleShapley(m, w, mp, wp);                        
    }
}

Gale Shapley Marriage Algorithm
 
Couples are :
M4 W1
M2 W2
M5 W3
M3 W4
M1 W5

Related posts:

Lập trình hướng đối tượng (OOPs) trong java
Assertions in JUnit 4 and JUnit 5
String Initialization in Java
Spring 5 Functional Bean Registration
Java Program to Create a Minimal Set of All Edges Whose Addition will Convert it to a Strongly Conne...
Quick Guide to Spring MVC with Velocity
Remove the First Element from a List
Hướng dẫn sử dụng Java Reflection
Chuyển đổi Array sang ArrayList và ngược lại
Java Program to Describe the Representation of Graph using Incidence Matrix
Show Hibernate/JPA SQL Statements from Spring Boot
Java Program to Perform Preorder Non-Recursive Traversal of a Given Binary Tree
ThreadPoolTaskExecutor corePoolSize vs. maxPoolSize
Từ khóa static và final trong java
Java Program to Implement VList
Java Program to Implement AVL Tree
Hướng dẫn Java Design Pattern – State
Xử lý ngoại lệ trong Java (Exception Handling)
Java Program to Use Boruvka’s Algorithm to Find the Minimum Spanning Tree
LinkedList trong java
Introduction to PCollections
Java Program to Implement Adjacency List
Java Program to Solve Tower of Hanoi Problem using Stacks
Converting String to Stream of chars
Finding the Differences Between Two Lists in Java
Spring Security – security none, filters none, access permitAll
Comparing Dates in Java
Spring Boot - Cloud Configuration Client
Mảng (Array) trong Java
Hướng dẫn Java Design Pattern – Dependency Injection
Java Program to Check Whether a Given Point is in a Given Polygon
Guide to @ConfigurationProperties in Spring Boot