1. 程式人生 > >GS 穩定匹配演算法 Java實現

GS 穩定匹配演算法 Java實現

演算法描述

給定n個男人,n個女人,每個男人都有一張對所有女人的偏愛表,每個女人都有一張對所有的男人的偏愛表,要求設計一演算法,產生一穩定匹配。

匹配過程

初始化所有的男人和女人都是自由的
while (存在男人m是自由的且還沒對每個女人都求過婚)
    選擇這樣一個男人m
    令w是m的優先表中m還沒求過婚的最高排名的女人
        if w是自由的
            (m,v)變成約會狀態
        else w當前與m’約會
            if w更愛m’(對比m)
                m保持自由
            else
w更愛m (對比m’) (m,v)變成約會狀態 m’變成自由 endif endif

Java程式碼實現如下

GS類

import java.util.Arrays;

public class GS {

    static int num = 4;

    static Woman women[] = new Woman[num];
    static Man men[] = new Man[num];

    public static void main
(String[] args) { // 男女優先表 int menArray[][] = { { 2, 3, 1, 0 }, { 2, 1, 3, 0 }, { 0, 2, 3, 1 }, { 1, 3, 2, 0 } }; int womenArray[][] = { { 0, 3, 2, 1 }, { 0, 1, 2, 3 }, { 0, 2, 3, 1 }, { 1, 0, 3, 2 } }; System.out.println("男生的優先表"); for (int i = 0; i < num; i++) { Man m = new
Man(); int a[] = {0,0,0,0}; for(int j=0; j<num; j++) a[j]=menArray[i][j]; System.out.println(Arrays.toString(a)); m.setRank(a); m.setId(i); men[i] = m; } System.out.println("女生的優先表"); for (int i = 0; i < num; i++) { Woman w = new Woman(); int a[] = {0,0,0,0}; for(int j=0; j<num; j++) a[j]=womenArray[i][j]; System.out.println(Arrays.toString(a)); w.setRank(a); w.setId(i); women [i]= w; } System.out.println("——————————————————"); Man theMan = null; while ((theMan = findMan(men)) != null) { pursue(theMan, women); for (int i = 0; i < num; i++) { System.out.println("男生" + i + "&" + "女生" + men[i].getPresent()); } System.out.println("——————————————————"); } System.out.println("GS finished"); } static Man findMan(Man[] men) { for (int i = 0; i < men.length; i++) { if (!men[i].isDate()) { System.out.println("單身男生" + i); return men[i]; } } System.out.println("沒有單身男生"); return null; } static void pursue(Man m, Woman[] women) { Woman w = women[m.rank[m.getBetter()]]; System.out.println("想追女生" + w.getId()); if (!w.isDate()) { System.out.println("女生沒有物件"); date(m, w); System.out.println("在一起"); } else { System.out.println("女生有物件"); if (pk(m, w)) { System.out.println("換男友"); date(m, w); } else { System.out.println("不換男友"); m.setBetter(m.getBetter() + 1); } } } static void date(Man m, Woman w) { if (!w.isDate()) { m.setDate(true); m.setPresent(w.getId()); w.setDate(true); w.setPresent(m.getId()); } else { m.setDate(true); m.setPresent(w.getId()); men[w.getPresent()].setDate(false); men[w.getPresent()].setPresent(100); w.setPresent(m.getId()); } } static boolean pk(Man m, Woman w) { System.out.println("優先表"+Arrays.toString(w.getRank())); int former = 100; for (int i = 0; i < num; i++) { if (w.getRank()[i] == w.getPresent()) { former = i; break; } } int later = 100; for (int i = 0; i < num; i++) { if (w.getRank()[i] == m.getId()) { later = i; break; } } System.out.println("前任排行" + former + " vs 挑戰者排行" + later); if (later < former) { return true; } else { return false; } } }

Man類


public class Man {

    private int id;
    private int better = 0; // 追求過幾位女生
    int[] rank = {0,0,0,0};
    private boolean date = false;
    private int present = 100;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getBetter() {
        return better;
    }

    public void setBetter(int better) {
        this.better = better;
    }

    public int[] getRank() {
        return rank;
    }

    public void setRank(int[] rank) {
        this.rank = rank;
    }

    public boolean isDate() {
        return date;
    }

    public void setDate(boolean date) {
        this.date = date;
    }

    public int getPresent() {
        return present;
    }

    public void setPresent(int present) {
        this.present = present;
    }

}

Woman類


public class Woman {
    private int id;
    int[] rank = {0,0,0,0};
    private boolean date = false;
    private int present = 100;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int[] getRank() {
        return rank;
    }

    public void setRank(int[] rank) {
        this.rank = rank;
    }

    public boolean isDate() {
        return date;
    }

    public void setDate(boolean date) {
        this.date = date;
    }

    public int getPresent() {
        return present;
    }

    public void setPresent(int present) {
        this.present = present;
    }
}

執行結果如下

男生的優先表
[2, 3, 1, 0]
[2, 1, 3, 0]
[0, 2, 3, 1]
[1, 3, 2, 0]
女生的優先表
[0, 3, 2, 1]
[0, 1, 2, 3]
[0, 2, 3, 1]
[1, 0, 3, 2]
——————————————————
單身男生0
想追女生2
女生沒有物件
在一起
男生0&女生2
男生1&女生100
男生2&女生100
男生3&女生100
——————————————————
單身男生1
想追女生2
女生有物件
優先表[0, 2, 3, 1]
前任排行0  vs  挑戰者排行3
不換男友
男生0&女生2
男生1&女生100
男生2&女生100
男生3&女生100
——————————————————
單身男生1
想追女生1
女生沒有物件
在一起
男生0&女生2
男生1&女生1
男生2&女生100
男生3&女生100
——————————————————
單身男生2
想追女生0
女生沒有物件
在一起
男生0&女生2
男生1&女生1
男生2&女生0
男生3&女生100
——————————————————
單身男生3
想追女生1
女生有物件
優先表[0, 1, 2, 3]
前任排行1  vs  挑戰者排行3
不換男友
男生0&女生2
男生1&女生1
男生2&女生0
男生3&女生100
——————————————————
單身男生3
想追女生3
女生沒有物件
在一起
男生0&女生2
男生1&女生1
男生2&女生0
男生3&女生3
——————————————————
沒有單身男生
GS finished