zoukankan      html  css  js  c++  java
  • Java实现稳定婚姻问题

    1 问题描述
    何为稳定婚姻问题?

    有一个男士的集合Y = {m1,m2,m3…,mn}和一个女士的计划X = {n1,n2,n3,…,nn}。每一个男士有一个排序的列表,把女士按照潜在的优先级进行排序。同样,每一个女士也有一个男士的优先级列表。现在,把男士和女士进行配对,要求尽可能的符合优先级的要求。使得最终的配对结果,男士对女士都可接受,不会出现拒绝的情况,即每对男士和女士都是稳定的。

    2 解决方案
    上述对于稳定婚姻问题的解释有点牵强,具体可以看一下下面截图:

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    下面代码所使用的男士和女士集合数据是上图的实例,即男士3人,女士3人。

    package com.liuzhen.practice;
    
    import java.util.Scanner;
    
    public class Main {
        
        public void getResult(int[][] boys, int[][] girls) {
            int[] result = new int[boys.length];
            int[] used = new int[girls.length];   //最终女士配对的男士
            for(int i = 0;i < girls.length;i++) {
                used[i] = -1;
                result[i] = -1;
            }
            int count = 0;   //统计已完成配对个数
            while(count < boys.length) {
                for(int i = 0;i < boys.length;i++) {
                    if(result[i] != -1)   //当男士i已完成配对时,进行下一个男士配对
                        continue;
                    for(int j = 0;j < boys[0].length;j++) {
                        if(used[boys[i][j]] == -1) {
                            used[boys[i][j]] = i;       //女士boys[i][j]与男士i配对
                            result[i] = boys[i][j];    //男士i和女士boys[i][j]配对
                            break;  //男士i完成配对,退出循环
                        } else {
                            int temp = 0, temp1 = 0;
                            for(;temp < girls[0].length;temp++) {  //求出男士i在女士boys[i][j]心中的优先级
                                if(girls[boys[i][j]][temp] == i)
                                    break;
                            }
                            for(;temp1 < girls[0].length;temp1++) { //求出当前女士已配对男士在其心中的优先级
                                if(girls[boys[i][j]][temp1] == used[boys[i][j]])
                                    break;
                            }
                            if(temp < temp1) {  //当男士i比目前已与女士配对的男士优先级要高时
                                result[used[boys[i][j]]] = -1;   //已配对男士被踢
                                used[boys[i][j]] = i;    //当前女士的配偶换成男士i
                                result[i] = boys[i][j];
                                break;       //男士i完成配对,退出循环
                            }
                        }
                    }
                }
                count = 0;
                for(int i = 0;i < used.length;i++) {
                    if(used[i] != -1)
                        count++;
                }
            }
            //打印出结果
            for(int i = 0;i < result.length;i++)
                System.out.println("男士"+i+"和女士"+result[i]+"配对");
            return;
        }
        
        public static void main(String[] args) {
            Main test = new Main();
            Scanner in = new Scanner(System.in);
            int n = in.nextInt();
            int[][] boys = new int[n][n];         //男士的心中对象优先级
            int[][] girls = new int[n][n];        //女士的心中对象优先级
            for(int i = 0;i < n;i++) { 
                int one = in.nextInt();   //优先级为1
                int two = in.nextInt();   //优先级为2
                int three = in.nextInt();  //优先级为3
                boys[i][0] = one;
                boys[i][1] = two;
                boys[i][2] = three;
            }
            for(int i = 0;i < n;i++) {
                int one = in.nextInt();   //优先级为1
                int two = in.nextInt();   //优先级为2
                int three = in.nextInt();  //优先级为3
                girls[i][0] = one;
                girls[i][1] = two;
                girls[i][2] = three;
            }
            test.getResult(boys, girls);
        }
    }
    

    运行结果:

    1 0 2
    2 0
    1 0
    2 0
    0 1
    2 0
    男士0和女士0配对
    男士1和女士2配对
    男士2和女士1配对
    
  • 相关阅读:
    Android——继续深造——从安装Android Studio 2.0开始(详)
    PHP——安装wampserver丢失MSVCR110.dll
    Marza Gift for GDC 2016
    Retrieve OpenGL Context from Qt 5.5 on OSX
    Space Time Varying Color Palette
    Screen Space Depth Varying Glow based on Heat Diffusion
    Visualization of Detail Point Set by Local Algebraic Sphere Fitting
    Glass Dragon
    Jump Flood Algorithms for Centroidal Voronoi Tessellation
    京都之行
  • 原文地址:https://www.cnblogs.com/a1439775520/p/12947900.html
Copyright © 2011-2022 走看看