Android 学生的稳定婚姻算法&xD7;团体协会

Android 学生的稳定婚姻算法&xD7;团体协会,android,algorithm,sqlite,Android,Algorithm,Sqlite,我正在开发一个应用程序,该程序将学生姓名保存在一个列表中以及他们的组号中。 每个学生都可以转到另一个小组,这样就有另一个领域承载他们的愿望 我希望程序携带与学生愿望相匹配的组号,并在0冲突和更新SQLite数据库的情况下获得最佳结果 有人告诉我使用稳定婚姻算法:它非常适合这类问题 问题是,我不太了解最后一个,也不知道它在android中是什么样子,所以如果你能给我一个简单的解释和一个包含SQLite、Java代码的示例,那就太完美了。一个非常好的解释: 动画: 您可以查看此动画,它很好地解释了

我正在开发一个应用程序,该程序将学生姓名保存在一个列表中以及他们的组号中。
每个学生都可以转到另一个小组,这样就有另一个领域承载他们的愿望

我希望程序携带与学生愿望相匹配的组号,并在0冲突和更新SQLite数据库的情况下获得最佳结果

有人告诉我使用稳定婚姻算法:它非常适合这类问题

问题是,我不太了解最后一个,也不知道它在android中是什么样子,所以如果你能给我一个简单的解释和一个包含SQLite、Java代码的示例,那就太完美了。

一个非常好的解释:

动画: 您可以查看此动画,它很好地解释了问题

这是Gale Shapely的实现,它是稳定婚姻问题的著名解决方案

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.InputStreamReader;

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 = {"1", "2", "3"};
    /** list of women **/
    String[] w = {"1", "2", "3"};

    /** men preference **/


    String[][] mp = null ;
    /** women preference **/                      
    String[][] wp= null ;

 // Input.txt is like
 // 3 <--defines the size of array
 // male preference array
 // 1 3 2
 // 1 2 3
 // 2 3 1

//female preference array
//1 3 2
//2 1 3
//2 1 3


    try{
      FileInputStream fstream = new FileInputStream("input.txt");
      DataInputStream in = new DataInputStream(fstream);
      BufferedReader br = new BufferedReader(new InputStreamReader(in));
      String strLine;
      int line=0;
      int k=0;
      int n=0;
      int i=0;
      while ((strLine = br.readLine()) != null) {
         if(line==0){
            n =Integer.valueOf(strLine);
            mp=new String[n][n];
            wp=new String[n][n];
            line++;
         }
         else{

             String[] preferences=strLine.split(" ");

             if(i<n){
                 mp[i]=preferences;
             }
             else{
                 wp[i-n]=preferences;
             }
             i++;
         }
      }
      in.close();

        }catch (Exception e){//Catch exception if any
              System.err.println("Error: " + e.getMessage());
        }
    GaleShapley gs = new GaleShapley(m, w, mp, wp);                        
   }
  }
导入java.io.BufferedReader;
导入java.io.DataInputStream;
导入java.io.FileInputStream;
导入java.io.InputStreamReader;
公共课
{
私人帐户,专用帐户;
私有字符串[][]menPref;
私有字符串[][]womenPref;
私人字符串[]人;
妇女的私人财产;
私人字符串[]女性伴侣;
私人布尔值已启用;
/**建造师**/
public GaleShapley(String[]m,String[]w,String[]mp,String[]wp)
{
N=mp.长度;
engagedCount=0;
男性=男性;
女性=w;
menPref=mp;
女性pref=wp;
menEngaged=新布尔值[N];
女性伴侣=新字符串[N];
calcMatches();
}
/**函数计算所有匹配项**/
私有无效calcMatches()
{
while(占用数量
动画:
您可以查看此动画,它很好地解释了问题

这是Gale Shapely的实现,它是稳定婚姻问题的著名解决方案

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.InputStreamReader;

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 = {"1", "2", "3"};
    /** list of women **/
    String[] w = {"1", "2", "3"};

    /** men preference **/


    String[][] mp = null ;
    /** women preference **/                      
    String[][] wp= null ;

 // Input.txt is like
 // 3 <--defines the size of array
 // male preference array
 // 1 3 2
 // 1 2 3
 // 2 3 1

//female preference array
//1 3 2
//2 1 3
//2 1 3


    try{
      FileInputStream fstream = new FileInputStream("input.txt");
      DataInputStream in = new DataInputStream(fstream);
      BufferedReader br = new BufferedReader(new InputStreamReader(in));
      String strLine;
      int line=0;
      int k=0;
      int n=0;
      int i=0;
      while ((strLine = br.readLine()) != null) {
         if(line==0){
            n =Integer.valueOf(strLine);
            mp=new String[n][n];
            wp=new String[n][n];
            line++;
         }
         else{

             String[] preferences=strLine.split(" ");

             if(i<n){
                 mp[i]=preferences;
             }
             else{
                 wp[i-n]=preferences;
             }
             i++;
         }
      }
      in.close();

        }catch (Exception e){//Catch exception if any
              System.err.println("Error: " + e.getMessage());
        }
    GaleShapley gs = new GaleShapley(m, w, mp, wp);                        
   }
  }
导入java.io.BufferedReader;
导入java.io.DataInputStream;
导入java.io.FileInputStream;
导入java.io.InputStreamReader;
公共课
{
私人帐户,专用帐户;
私有字符串[][]menPref;
私有字符串[][]womenPref;
私人字符串[]人;
妇女的私人财产;
私人字符串[]女性伴侣;
私人布尔值已启用;
/**建造师**/
public GaleShapley(String[]m,String[]w,String[]mp,String[]wp)
{
N=mp.长度;
engagedCount=0;
男性=男性;
女性=w;
menPref=mp;
女性pref=wp;
menEngaged=新布尔值[N];
女性伴侣=新字符串[N];
calcMatches();
}
/**函数计算所有匹配项**/
私有无效calcMatches()
{
while(占用数量Gale Shapley Marriage Algorithm

Couples are : 
1 1
2 2
3 3