

Gale-Shapleyアルゴリズムを用いた安定結婚問題(安定マッチング)についての質問です。  
このプログラムの人数を男女それぞれN人に拡張し、N組のカップルを作りたいのですが5人以上にする目処が立たなくて困っています。課題の期限が迫っていてたいへん焦っています。  
以下のソースコードを書き換えてN組の安定マッチングが実現できるソースコードにしていただけ  
環境はEclipseで、Java言語での記述です。  
C言語のソースコード例は探せたのですが、力がなくJavaに書き換えることが上手くできませんでした。  
すみません、よろしくお願い致します。

[code]

    import java.util.Scanner;
    
    
    /** 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;//男性の婚約者
    
      /** コンストラクタ **/
      public GaleShapley(String[] m, String[] w, String[][] mp, String[][] wp)
      {
        N = mp.length;//mp配列(menPref)の長さを取得
        engagedCount = 0;
        men = m;
        women = w;
        menPref = mp;
        womenPref = wp;
        menEngaged = new boolean[N];
        womenPartner = new String[N];
        calcMatches();
      }
    
      /** 全ての好みが一致するかの計算 **/
      private void calcMatches()
      {
      //プロポーズを男性の選好順序すべて終わるまで繰り返す
        while (engagedCount < N)
        {
          int free;
          //男性の選好順序すべて終わるまで繰り返す
          for (free = 0; free < N; free++)
          //もし、男性のプロポーズ回数が０でなければbreak
            if (!menEngaged[free])
              break;
    
          //男性の選好順序すべて終わり、かつ男性のプロポーズ回数がfree回でなければ繰り返す
          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();
      }
    
      /** 女性が現在のパートナーよりも新しいパートナーを好むかどうかをチェックする **/
      private boolean morePreference(String curPartner, String newPartner, int index)
      {
        for (int i = 0; i < N; i++)
        {
          //もし、新しい男性が女性の好みと一致したら:true
          if (womenPref[index][i].equals(newPartner))
            return true;
          //もし、現在の男性が女性の好みと一致したら:false
          if (womenPref[index][i].equals(curPartner))
            return false;
        }
        return false;
      }
    
      /** 男性の番号を取得 **/
      private int menIndexOf(String str)
      {
        for (int i = 0; i < N; i++)
        //もし、男性の名前がが与えられた文字列と一致したらiを返す
          if (men[i].equals(str))
            return i;
        //そうでなければ-1を返す
        return -1;
      }
    
      /** 女性の番号を取得 **/
      private int womenIndexOf(String str)
      {
        for (int i = 0; i < N; i++)
        //もし、女性の名前がが与えられた文字列と一致したらiを返す
          if (women[i].equals(str))
            return i;
        //そうでなければ-1を返す
        return -1;
      }
    
      /** 結果表示 **/
      public void printCouples()
      {
        System.out.println("カップルは以下の組で成立 ");
        for (int i = 0; i < N; i++)
        {
          System.out.println(womenPartner[i] +" "+ women[i]);
        }
      }
    
      /** main **/
      public static void main(String[] args) 
      {
        System.out.println("数値(n)を入力して下さい。");
        Scanner scan = new Scanner(System.in);
    
        int N = scan.nextInt();
    
        System.out.println("Gale Shapley Marriage Algorithm\n");
        /** 男性の要素 **/
        String[] m = {"M1", "M2", "M3", "M4", "M5"};
        /** 女性の要素 **/
        String[] w = {"W1", "W2", "W3", "W4", "W5"};
    
        /** 男性の選好順序 **/
        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"}
        };
    
        /** 女性の選好順序 **/ 
        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); 
      }
    }
    
[/code]


CC BY-SA 3.0
2017-02-04T08:03:06.263
32378
2017-02-05T07:11:38.003
2017-02-05T07:11:38.003
3605
20511
question
java
Gale-Shapleyアルゴリズムを用いた安定結婚問題(安定マッチング)についての質問