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

更多细节请参考:
http://download.csdn.net/detail/qq_32962727/9766885

稳定匹配算法是一种经典的算法,用于解决匹配问题。其中,gs(Gale-Shapley)算法是最为常见的一种稳定匹配算法,通过迭代的方式,将多对男女进行配对,使得每对配对都是稳定的。 在Python中,我们可以使用以下方式实现gs稳定匹配算法: 首先,创建两个队列,分别为男性和女性的队列,分别用man_list和woman_list来表示。然后,对于每个男性和女性,我们可以定义一个“prefer”列表,用于记录该人对对方倾向程度的排序。 接下来,我们创建一个空的字典,用于保存每个男性与其配对的女性的关系。我们将字典命名为matches。然后,创建一个空的字典,用于保存每个女性与其配对的男性的关系。将该字典命名为inverse_matches。 然后,我们开始进行迭代,直到所有男性都有配对为止。在每一轮迭代中,对于每个男性,我们取出他还未提出过请求的最喜欢的女性。然后,对于这个女性,我们判断她是否已经有了男性的配对。如果是,我们比较该女性的现有男性和当前男性,如果当前男性更受女性喜欢,则我们将当前男性与该女性配对,并更新matches和inverse_matches。如果不是,我们直接将当前男性与该女性配对,并更新matches和inverse_matches。 最后,当所有男性都有配对时,我们可以返回matches字典作为最终的稳定匹配结果。 以上就是用Python实现gs稳定匹配算法的简要步骤。当然,具体的实现细节可能会根据实际情况有所不同,但是核心思想和步骤是相似的。希望能对您有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值