はじめに

この記事は公立はこだて未来大学 Advent Calendar 2022 4日目の記事です。

どうも。あずらたと申します。普段はETロボコンでUMLを書いていたり、高度ICT演習でWebRTCの勉強をしていたり、某企業でフロントエンドを書いたりしています。

前日の記事は健康さんの「アイマスかるたを作った話」でした。僕もアイマスが好きで、デレでの担当は結城晴、シャニでの担当は黛冬優子です。皆もシャニマスの曲聞いてくれ。ちなみに記事を取った時にmalloc(sizeof(void*)); // 黛冬優子の誕生日なんて書いていましたが、今日の話はアイマスに一切関係がありません。は?

ほんへ

僕にとっては苦い思い出ですが、未来大では2年次に上がる学生をコース分けする「コース分属」というイベントがあります。

コース分属は、1年次の必修科目を4つ以上落としていない学生に対して希望をとり、必修科目の成績順でコースを配属するものです。なお、成績順というのは必修GP1の合計値です。今回はこれを実装しようと思います。

学生の序列をつけるにあたって、学生の順序関係を定めましょう。

学生の集合をSとしたとき、s_i, s_j ∈ S, 0 <= i, j =< |S|, i ≠ jとする。また、学生sのGPはGP(s)と表わす。
s_i >= s_jとは、s_iとs_jが必修科目でF評価を受けていない、または両方ともF評価を受けたときはGP(s_i) >= GP(s_j)、もしくはs_jのみが必修科目でF評価を受けたときは絶対にs_i >= s_jとする。

これを降順にソートすると自然と最初の学生から希望を優先していけばよいです。これをJavaのComparableインターフェースをimplementしたクラスで実装するとこうなります。

@Override
	public int compareTo(Student that) {
		// Failed both students, or not failed both students
		if((this.hasFailed() && that.hasFailed()) || !this.hasFailed() && !that.hasFailed()) {
			if(this.getScoreSum() == that.getScoreSum()) {
				return 0;
			}
			return this.getScoreSum() > that.getScoreSum() ? 1 : -1;
		}

		// Failed only "this"
		if(this.hasFailed()) {
			return -1;
		}

		// Failed only "that"
		return 1;
	}

まあ割とそのままなので素直に読めると思います。ただ時々Comparison method violates its general contract!と出るのでどこかがバグってるかもしれません。動かす際は注意してください。

コメントが英語なのは、僕が使っているSKKと開発に使ったIDEが相性が悪いので、どうせならと英語で書いてます。英語のミスは許して。

本プログラムを動かすにあたって学生のデータが必要なわけですが、データを作成するのも面倒なので、成績だけを重み付け確率で決定しました。また、コースの優先度は完全にランダムです。

成績の重みは下の図の通りです。

成績の重み付け確率

コードの全貌はGitHubで公開しているので、暇な人は見てみてください。先述の通りJavaで記述されています。

それでは実行してみましょう。

Students: 
[BCCBFSSCSCBBS:28, AABASABBCAABB:33, CBBCBACSACAAB:28, BBBABABBAABAA:32, ABCBCBBFBSBAC:25, BSCCCFCCBBABS:24, SCABBBABCCABA:29, BBBCASCSAACFB:28, CBBBCBBCBABFB:22, ABBCCBBBBACBA:26, BCCBCABBBCASS:28, CBCCBACCABCBA:23, BBABBABABBACC:28, ABFCBAASBABBB:29, BCBCBACCSSCFC:23, ABSFCCBCCBBBB:23, CCBCCCFABACSC:21, ACCSCCABAASSC:31, CCABBBCCASBCC:24, SCFABAABACBBB:28, CBBFBSACBBBBF:23, CSCBCSFBFASCC:24, CCAACCASCACSA:29, CFFBBFCAACBBS:21, SSACCSCFFCACA:26, CCBBAABBSBCBS:29, ABAACBBCACBAS:30, CBCABBCCBBBBB:23, BBASBAABSBBBA:34, BFBBBSBABBSCS:30, AAAABBSCBFBFB:27, BABBABACBCBBS:29, FCABACBCCBACB:22, CCBCSBSBBBCAB:27, BSBBCBABCCBSB:28, ACBAFBCAAABCC:25, ABFCCCBFBBABA:22, SACABBBSSCBSF:32, ABABCBBBBCCBA:26, BBBACSCSCSBAC:30, FCBBCCBBACBFA:20, BSCBABCCABCCB:25, ABCAAACASACSC:32, CBSCCBBSBBBBC:26, ACSBCCSCFCFBA:23, FASABBCBASBAC:30, CAACFACBBCBCB:22, BBASBABSCBBFA:30, FCBBCBSCABBBA:25, CCASSCCABBABS:31, BCBBABFABCCCC:21, BAAABCABABBBB:30, BCCCBCSSSCBAC:27, BSBBCCABBCAAF:26, ABBBCBBBBCBBC:24, SACSFBCBBBBCB:26, SBBASCBACABCC:29, BCBBBCBBBCCSA:25, CBAFBBBCBCFBB:20, BABCCBSBFAAAS:30, BBCBCFCCAABBB:22, SBBCBSSABCCAC:30, BBAACBCBBBBBB:26, BBBBFBCBABBBS:26, CFABAACBBBBBC:24, FCBBFFSBSAABB:25, AABBCBBBBFBFA:24, CBBBSABSAAABB:33, FBABCABBBBBBC:24, BFBBACBBCBCAB:23, ABBBAABSBBBSB:33, CBACABFSBBBBC:25, BABSCBFABBCCB:25, ACABBABCABBAC:28, SCAABASBSAACC:34, SBBCBCBSCCSBB:28, CBCBCSACCBBBC:23, BBCCCBABAACAB:26, BFCBFBBCCBCBA:19, ABABAACACCAFB:27, BABCCBSSFCCAS:28, BBFBABCABCABB:25, CBAAFBACSBABA:29, CBBFCFBSBBCAF:20, BBSSCSAASCSAB:37, BABCBCBBBBFSB:25, BABCCCCBFSBAC:23, CAACAACABBBBB:28, AACACSFBBBBBB:27, BCBASCFBFACBB:23, SCSSCCACBCBBB:28, ACCAABASSASBB:35, BSBAAACBBABSB:33, CBSABBFBBBCAC:25, SBBCBCCSBBCBA:27, BBSFBCCCAACCA:24, BASCBACBAAACC:29, CSCCAFCCBBBFC:19, BBBBSCCAABSBB:30, CABBCBFABACAA:26, BCBBABSBABBCF:26, CBBBAACBCCABB:25, BCABBSCCACBBA:27, ABACAACCCAAAC:28, BSCBABBBCSCAC:28, CBBCCBBFCBAAC:21, CCBBBBBBABBFB:23, BFSACSFAACBSA:30, AFCBFASFSBBCB:24, BCBBBACBAAAAC:28, BCCACBCBABAAB:26, CCBBBBFBACSCS:25, SAASBBASSBCAB:37, SABCACABBCABB:29, BBABBBBCCCFFB:20, CBCBCCBCBBBAB:22, ABBABBACCAACB:28, BASBBBBCBBCAA:29, CCBCBCBSBCCAC:22, BSBBBCASBABSS:35, FABFCBBSBFCAS:24, SBCCBABCBCBCA:25, CACBBBSCASCSA:31, CCCBAASFACBBS:27, SBBBCBBCAASCS:31, CCCABBASCBCSA:28, CSBFCBBSBCCCA:24, SFBBSBCSBCBCF:25, BSABBACCBBBBA:29, ABBBFBCBFAFCC:19, ACASBAFSCCCSC:28, BBBCSSBSBCBAA:32, CACBBBCCBBCAB:23, AFAACCBACABBB:26, BBCBBCBBCABBA:25, ABBASCCCSCCAS:30, BBBBACASBCBBB:28, AACBSBCCSCACB:28, SBCBBABBCBCCB:25, CBSBCCCBSBBAB:27, BCBBSCCBACBFB:23, CCCSBCACCBABC:23, ABAACCFCBBBBB:24, FBABAACBACBAB:27, BCBCCABCBCBSB:24, CCABBBSACAABB:29, AABSBBSBBCACS:33, BSAABCSSBBSAC:35, CBAFBBSBABSCA:29, ACBBBCBSCCABC:25, ABBFBBCSBBBFB:24, ABBCABABSAACB:31, SSABBBSBBBSCC:33, CBASSBCSABCBA:32, CBABCFCSBBBCB:23, BABBAABCCABCS:29, BABCBBBABABAA:30, BBABSCCBSASBA:33, ABCABBAABBABB:30, BBBSBBBBBBBBB:28, BABBAABCABBBB:29, CBACCSCAAFCBC:23, BBAFCCAACCFBC:20, BACBAABABBBBB:29, BABBBABCBCBAA:28, SBBABSCCBCABA:30, BCBAACFABFSSC:26, BBBBCSABASAAB:33, BABBCCFBSCBAC:24, CBBBCSCCFBBBC:21, ACBCBACBACCSB:26, BFCABBBCBBSSS:29, BBBBBACFBABBB:25, CABBCCABSAACC:27, BCBBCBBBBSCSB:27, CBFBBBCAAABBA:26, BBCBSBCBABABC:27, CBBCAAFCBBBCA:23, CCASBFBBBABBA:27, BBCASBBCSBBAC:29, AASBSCBBBACCA:31, SBCCBFACABBAB:26, CBCBSFABCCCBC:21, CABFABAABCCAC:25, BBCCBBCBBFACC:20, BCCSABBBCABFC:24, ACCABSBBCSCBS:30, BBACABCBCACCB:24, SBBAASBACABBC:32, BBAAABCCBCBBF:24, FBCCCBABABBSS:27, ACBBCBAFFABAB:24, CBSCBBBACCSAB:28, CBAABBBABACBB:28, BBBCCABFSSBAF:26, ABCCSCSBBBBCC:26, BBCSBBBBCCFCS:24, BABABBSBFBABB:29, BSBBBBASBABBB:32, CSABBCCBSBACB:28, ACCACABAASABB:31, BCCCBCCCBCBFC:16, CBBBBBCFSBSCB:25, CSBCBBBASABBB:30, CACACBBFCCABF:20, BABBACASCSASS:36, BCABABFABBCFB:23, CBAASCBCACCBC:25, BSBSBCACSABSB:34, CFCBBBBSSSFCC:24, BBCCABBSBBSAC:29, ACCBAACFCCCBB:21, BABBCCABCBCCS:25, ABBBBABASABBB:32, ABSCCCABAACFC:25, BBCBCBABSBCAA:28, BCBCFFBACBCCC:17, BCSBBCSCASACB:30, CCBBCBBBSBBAC:25, BBSBCBASFCBBF:25, BCASSABCCCCBC:26, BCBSCFAABBBBB:26, CBBCCCSSBCAAB:27, BBACCSBBCABCA:27, BSCBBBFACCBCA:24, ABCCBFSCAFABC:23, ABBAACSFBBBCB:27, ABCABBBBCACBB:26, FBACBAACCBSBB:26, AAACABCCAAAAB:31, ASFBCBBBCBCBA:25, BBAABABBBBBCB:28, BFBAACSCAFBCB:24, FCSCBBBACBSBA:27, SBCBSBCCSACBB:29, CCACBAACSASBC:29, CBBAAABBBCBSB:29, BSCCBAASABCBC:29, CACSBBBBSBACC:28, BBACAACBFAFAB:25]
Sorted Students: 
[SAASBBASSBCAB:37, BBSSCSAASCSAB:37, BABBACASCSASS:36, BSAABCSSBBSAC:35, BSBBBCASBABSS:35, ACCAABASSASBB:35, BSBSBCACSABSB:34, SCAABASBSAACC:34, BBASBAABSBBBA:34, BBBBCSABASAAB:33, BBABSCCBSASBA:33, SSABBBSBBBSCC:33, AABSBBSBBCACS:33, BSBAAACBBABSB:33, ABBBAABSBBBSB:33, CBBBSABSAAABB:33, AABASABBCAABB:33, ABBBBABASABBB:32, BSBBBBASBABBB:32, SBBAASBACABBC:32, CBASSBCSABCBA:32, BBBCSSBSBCBAA:32, ABCAAACASACSC:32, BBBABABBAABAA:32, AAACABCCAAAAB:31, ACCACABAASABB:31, AASBSCBBBACCA:31, ABBCABABSAACB:31, SBBBCBBCAASCS:31, CACBBBSCASCSA:31, CCASSCCABBABS:31, ACCSCCABAASSC:31, BCSBBCSCASACB:30, CSBCBBBASABBB:30, ACCABSBBCSCBS:30, SBBABSCCBCABA:30, ABCABBAABBABB:30, BABCBBBABABAA:30, ABBASCCCSCCAS:30, BBBBSCCAABSBB:30, SBBCBSSABCCAC:30, BAAABCABABBBB:30, BBBACSCSCSBAC:30, ABAACBBCACBAS:30, BSCCBAASABCBC:29, CBBAAABBBCBSB:29, CCACBAACSASBC:29, SBCBSBCCSACBB:29, BBCCABBSBBSAC:29, BBCASBBCSBBAC:29, BACBAABABBBBB:29, BABBAABCABBBB:29, BABBAABCCABCS:29, CCABBBSACAABB:29, BSABBACCBBBBA:29, BASBBBBCBBCAA:29, SABCACABBCABB:29, BASCBACBAAACC:29, SBBASCBACABCC:29, BABBABACBCBBS:29, CCBBAABBSBCBS:29, CCAACCASCACSA:29, SCABBBABCCABA:29, CACSBBBBSBACC:28, BBAABABBBBBCB:28, BBCBCBABSBCAA:28, CSABBCCBSBACB:28, CBAABBBABACBB:28, CBSCBBBACCSAB:28, BABBBABCBCBAA:28, BBBSBBBBBBBBB:28, AACBSBCCSCACB:28, BBBBACASBCBBB:28, CCCABBASCBCSA:28, ABBABBACCAACB:28, BCBBBACBAAAAC:28, BSCBABBBCSCAC:28, ABACAACCCAAAC:28, SCSSCCACBCBBB:28, CAACAACABBBBB:28, SBBCBCBSCCSBB:28, ACABBABCABBAC:28, BSBBCBABCCBSB:28, BBABBABABBACC:28, BCCBCABBBCASS:28, CBBCBACSACAAB:28, BBACCSBBCABCA:27, CBBCCCSSBCAAB:27, BBCBSBCBABABC:27, BCBBCBBBBSCSB:27, CABBCCABSAACC:27, CBSBCCCBSBBAB:27, BCABBSCCACBBA:27, SBBCBCCSBBCBA:27, BCCCBCSSSCBAC:27, CCBCSBSBBBCAB:27, ABCABBBBCACBB:26, BCASSABCCCCBC:26, ABCCSCSBBBBCC:26, ACBCBACBACCSB:26, BCCACBCBABAAB:26, BBCCCBABAACAB:26, BBAACBCBBBBBB:26, CBSCCBBSBBBBC:26, ABABCBBBBCCBA:26, ABBCCBBBBACBA:26, CCBBCBBBSBBAC:25, BABBCCABCBCCS:25, CBAASCBCACCBC:25, ACBBBCBSCCABC:25, SBCBBABBCBCCB:25, BBCBBCBBCABBA:25, SBCCBABCBCBCA:25, CBBBAACBCCABB:25, BCBBBCBBBCCSA:25, BSCBABCCABCCB:25, BBACABCBCACCB:24, BCBCCABCBCBSB:24, ABBBCBBBBCBBC:24, CCABBBCCASBCC:24, CCCSBCACCBABC:23, CACBBBCCBBCAB:23, CBCBCSACCBBBC:23, CBCABBCCBBBBB:23, CBCCBACCABCBA:23, CCBCBCBSBCCAC:22, CBCBCCBCBBBAB:22, SACABBBSSCBSF:32, BFSACSFAACBSA:30, BABCCBSBFAAAS:30, BBASBABSCBBFA:30, FASABBCBASBAC:30, BFBBBSBABBSCS:30, BABABBSBFBABB:29, BFCABBBCBBSSS:29, CBAFBBSBABSCA:29, CBAAFBACSBABA:29, ABFCBAASBABBB:29, ACASBAFSCCCSC:28, BABCCBSSFCCAS:28, SCFABAABACBBB:28, BBBCASCSAACFB:28, BCCBFSSCSCBBS:28, FCSCBBBACBSBA:27, ABBAACSFBBBCB:27, FBCCCBABABBSS:27, CCASBFBBBABBA:27, FBABAACBACBAB:27, CCCBAASFACBBS:27, AACACSFBBBBBB:27, ABABAACACCAFB:27, AAAABBSCBFBFB:27, FBACBAACCBSBB:26, BCBSCFAABBBBB:26, BBBCCABFSSBAF:26, SBCCBFACABBAB:26, CBFBBBCAAABBA:26, BCBAACFABFSSC:26, AFAACCBACABBB:26, BCBBABSBABBCF:26, CABBCBFABACAA:26, BBBBFBCBABBBS:26, SACSFBCBBBBCB:26, BSBBCCABBCAAF:26, SSACCSCFFCACA:26, BBACAACBFAFAB:25, ASFBCBBBCBCBA:25, BBSBCBASFCBBF:25, ABSCCCABAACFC:25, CBBBBBCFSBSCB:25, CABFABAABCCAC:25, BBBBBACFBABBB:25, SFBBSBCSBCBCF:25, CCBBBBFBACSCS:25, CBSABBFBBBCAC:25, BABCBCBBBBFSB:25, BBFBABCABCABB:25, BABSCBFABBCCB:25, CBACABFSBBBBC:25, FCBBFFSBSAABB:25, FCBBCBSCABBBA:25, ACBAFBCAAABCC:25, ABCBCBBFBSBAC:25, BFBAACSCAFBCB:24, BSCBBBFACCBCA:24, CFCBBBBSSSFCC:24, BBCSBBBBCCFCS:24, ACBBCBAFFABAB:24, BBAAABCCBCBBF:24, BCCSABBBCABFC:24, BABBCCFBSCBAC:24, ABBFBBCSBBBFB:24, ABAACCFCBBBBB:24, CSBFCBBSBCCCA:24, FABFCBBSBFCAS:24, AFCBFASFSBBCB:24, BBSFBCCCAACCA:24, FBABCABBBBBBC:24, AABBCBBBBFBFA:24, CFABAACBBBBBC:24, CSCBCSFBFASCC:24, BSCCCFCCBBABS:24, ABCCBFSCAFABC:23, BCABABFABBCFB:23, CBBCAAFCBBBCA:23, CBACCSCAAFCBC:23, CBABCFCSBBBCB:23, BCBBSCCBACBFB:23, CCBBBBBBABBFB:23, BCBASCFBFACBB:23, BABCCCCBFSBAC:23, BFBBACBBCBCAB:23, ACSBCCSCFCFBA:23, CBBFBSACBBBBF:23, ABSFCCBCCBBBB:23, BCBCBACCSSCFC:23, BBCBCFCCAABBB:22, CAACFACBBCBCB:22, ABFCCCBFBBABA:22, FCABACBCCBACB:22, CBBBCBBCBABFB:22, ACCBAACFCCCBB:21, CBCBSFABCCCBC:21, CBBBCSCCFBBBC:21, CBBCCBBFCBAAC:21, BCBBABFABCCCC:21, CFFBBFCAACBBS:21, CCBCCCFABACSC:21, CACACBBFCCABF:20, BBCCBBCBBFACC:20, BBAFCCAACCFBC:20, BBABBBBCCCFFB:20, CBBFCFBSBBCAF:20, CBAFBBBCBCFBB:20, FCBBCCBBACBFA:20, ABBBFBCBFAFCC:19, CSCCAFCCBBBFC:19, BFCBFBBCCBCBA:19, BCBCFFBACBCCC:17, BCCCBCCCBCBFC:16]

Studentsは生成してそのまま、Sorted Studentsは先述の基準に則ってソートした学生のデータになります。

少し見づらいですが、Sorted Studentsは22→32となっているところがあるので、1つでも必修を落とすと、他で頑張っても割と致命傷に成り得ることがわかります。なるかならないかはその年にも依りますし、この例だと結構な割合で落単者がいるので全くの参考にはならないでしょうが。

この学生のデータを基に学生をコースに分けると下のようになります。

Grouped: 
INFO_SYSTEM: 
[BSBBBCASBABSS:35, SCAABASBSAACC:34, BBBBCSABASAAB:33, SSABBBSBBBSCC:33, AABSBBSBBCACS:33, BSBAAACBBABSB:33, ACCACABAASABB:31, SBBBCBBCAASCS:31, SBBABSCCBCABA:30, BBBACSCSCSBAC:30, ABAACBBCACBAS:30, CCACBAACSASBC:29, SBCBSBCCSACBB:29, BABBAABCABBBB:29, BABBAABCCABCS:29, BASBBBBCBBCAA:29, SABCACABBCABB:29, CCBBAABBSBCBS:29, BBCBCBABSBCAA:28, BBBSBBBBBBBBB:28, ABACAACCCAAAC:28, CAACAACABBBBB:28, BCBBCBBBBSCSB:27, CABBCCABSAACC:27, BCCCBCSSSCBAC:27, ACBCBACBACCSB:26, CBBBAACBCCABB:25, BSCBABCCABCCB:25, CCABBBCCASBCC:24, CBCCBACCABCBA:23, BBASBABSCBBFA:30, FASABBCBASBAC:30, BFBBBSBABBSCS:30, ACASBAFSCCCSC:28, AACACSFBBBBBB:27, SBCCBFACABBAB:26, BCBAACFABFSSC:26, BCBBABSBABBCF:26, BBBBFBCBABBBS:26, BBSBCBASFCBBF:25, CABFABAABCCAC:25, FCBBFFSBSAABB:25, ACBAFBCAAABCC:25, ABCBCBBFBSBAC:25, ACBBCBAFFABAB:24, BABBCCFBSCBAC:24, CSBFCBBSBCCCA:24, AFCBFASFSBBCB:24, FBABCABBBBBBC:24, BSCCCFCCBBABS:24, BCABABFABBCFB:23, CBACCSCAAFCBC:23, BCBASCFBFACBB:23, ACSBCCSCFCFBA:23, CBBFBSACBBBBF:23, BCBCBACCSSCFC:23, BBCBCFCCAABBB:22, CAACFACBBCBCB:22, ABFCCCBFBBABA:22, FCABACBCCBACB:22, CBBBCBBCBABFB:22, ACCBAACFCCCBB:21, CBCBSFABCCCBC:21, CBBBCSCCFBBBC:21, CBBCCBBFCBAAC:21, BCBBABFABCCCC:21, CFFBBFCAACBBS:21, CCBCCCFABACSC:21, CACACBBFCCABF:20, BBCCBBCBBFACC:20, BBAFCCAACCFBC:20, BBABBBBCCCFFB:20, CBBFCFBSBBCAF:20, CBAFBBBCBCFBB:20, FCBBCCBBACBFA:20, ABBBFBCBFAFCC:19, CSCCAFCCBBBFC:19, BFCBFBBCCBCBA:19, BCBCFFBACBCCC:17, BCCCBCCCBCBFC:16]
INFO_DESIGN: 
[SAASBBASSBCAB:37, BBBABABBAABAA:32, AASBSCBBBACCA:31, ABBCABABSAACB:31, CCASSCCABBABS:31, BCSBBCSCASACB:30, ACCABSBBCSCBS:30, BABCBBBABABAA:30, BAAABCABABBBB:30, BBAABABBBBBCB:28, CBSCBBBACCSAB:28, BABBBABCBCBAA:28, CCCABBASCBCSA:28, BSCBABBBCSCAC:28, SBBCBCBSCCSBB:28, CBSBCCCBSBBAB:27, BCABBSCCACBBA:27, ABCABBBBCACBB:26, BCASSABCCCCBC:26, ABABCBBBBCCBA:26, ABBCCBBBBACBA:26, CCBBCBBBSBBAC:25, CBCABBCCBBBBB:23, CBCBCCBCBBBAB:22, SACABBBSSCBSF:32, BFSACSFAACBSA:30, BABCCBSSFCCAS:28, ABABAACACCAFB:27, AFAACCBACABBB:26, BBACAACBFAFAB:25, ASFBCBBBCBCBA:25, BBFBABCABCABB:25, BABSCBFABBCCB:25, BCCSABBBCABFC:24, ABBFBBCSBBBFB:24, ABAACCFCBBBBB:24, FABFCBBSBFCAS:24, BBSFBCCCAACCA:24, ABCCBFSCAFABC:23, CBABCFCSBBBCB:23]
COMP_LIKE: 
[BABBACASCSASS:36, ACCAABASSASBB:35, BSBSBCACSABSB:34, AABASABBCAABB:33, ABBBBABASABBB:32, SBBAASBACABBC:32, ABCAAACASACSC:32, ACCSCCABAASSC:31, ABCABBAABBABB:30, ABBASCCCSCCAS:30, BBBBSCCAABSBB:30, SBBCBSSABCCAC:30, BSCCBAASABCBC:29, CBBAAABBBCBSB:29, BBCASBBCSBBAC:29, BSABBACCBBBBA:29, SBBASCBACABCC:29, BABBABACBCBBS:29, CCAACCASCACSA:29, SCABBBABCCABA:29, CACSBBBBSBACC:28, CBAABBBABACBB:28, AACBSBCCSCACB:28, BBBBACASBCBBB:28, ABBABBACCAACB:28, BCBBBACBAAAAC:28, ACABBABCABBAC:28, BBABBABABBACC:28, BCCBCABBBCASS:28, SBBCBCCSBBCBA:27, ABCCSCSBBBBCC:26, BCCACBCBABAAB:26, BBCCCBABAACAB:26, BBAACBCBBBBBB:26, BABBCCABCBCCS:25, CBAASCBCACCBC:25, BBCBBCBBCABBA:25, BCBBBCBBBCCSA:25, BBACABCBCACCB:24, ABBBCBBBBCBBC:24, CCCSBCACCBABC:23, CACBBBCCBBCAB:23, CBCBCSACCBBBC:23, BABABBSBFBABB:29, BFCABBBCBBSSS:29, CBAAFBACSBABA:29, ABFCBAASBABBB:29, FCSCBBBACBSBA:27, ABBAACSFBBBCB:27, CCASBFBBBABBA:27, CCCBAASFACBBS:27, AAAABBSCBFBFB:27, BCBSCFAABBBBB:26, SACSFBCBBBBCB:26, SSACCSCFFCACA:26, SFBBSBCSBCBCF:25, BABCBCBBBBFSB:25, CBACABFSBBBBC:25, BFBAACSCAFBCB:24, CFABAACBBBBBC:24]
INTE_SYSTEM: 
[BBSSCSAASCSAB:37, BSAABCSSBBSAC:35, BBASBAABSBBBA:34, BBABSCCBSASBA:33, ABBBAABSBBBSB:33, CBBBSABSAAABB:33, BSBBBBASBABBB:32, CBASSBCSABCBA:32, BBBCSSBSBCBAA:32, AAACABCCAAAAB:31, CACBBBSCASCSA:31, CSBCBBBASABBB:30, BBCCABBSBBSAC:29, BACBAABABBBBB:29, CCABBBSACAABB:29, BASCBACBAAACC:29, CSABBCCBSBACB:28, SCSSCCACBCBBB:28, BSBBCBABCCBSB:28, CBBCBACSACAAB:28, BBACCSBBCABCA:27, CBBCCCSSBCAAB:27, BBCBSBCBABABC:27, CCBCSBSBBBCAB:27, CBSCCBBSBBBBC:26, ACBBBCBSCCABC:25, SBCBBABBCBCCB:25, SBCCBABCBCBCA:25, BCBCCABCBCBSB:24, CCBCBCBSBCCAC:22, BABCCBSBFAAAS:30, CBAFBBSBABSCA:29, SCFABAABACBBB:28, BBBCASCSAACFB:28, BCCBFSSCSCBBS:28, FBCCCBABABBSS:27, FBABAACBACBAB:27, FBACBAACCBSBB:26, BBBCCABFSSBAF:26, CBFBBBCAAABBA:26, CABBCBFABACAA:26, BSBBCCABBCAAF:26, ABSCCCABAACFC:25, CBBBBBCFSBSCB:25, BBBBBACFBABBB:25, CCBBBBFBACSCS:25, CBSABBFBBBCAC:25, FCBBCBSCABBBA:25, BSCBBBFACCBCA:24, CFCBBBBSSSFCC:24, BBCSBBBBCCFCS:24, BBAAABCCBCBBF:24, AABBCBBBBFBFA:24, CSCBCSFBFASCC:24, CBBCAAFCBBBCA:23, BCBBSCCBACBFB:23, CCBBBBBBABBFB:23, BABCCCCBFSBAC:23, BFBBACBBCBCAB:23, ABSFCCBCCBBBB:23]

この例では結構落単者が多かったので割と希望通りになってそうですね。成績の重み付き確率は改善の余地がよさそうです。ただ、先程も言った通り各学生のコースの希望順はランダムにしてあるので必ずしもこの通りにはなりません。

僕の年の例でいくと、必修科目を全て取っても情シスには行けませんでしたが、例年人気なデザインコースは単位を1つくらい落としても行けたみたいです。

最後にGPの平均を見てみます。

INFO_SYSTEM students' GP average: 25.1875
INFO_DESIGN students' GP average: 27.175
COMP_LIKE students' GP average: 27.816666666666666
INTE_SYSTEM students' GP average: 27.25

…まあコースの優先度の選択はランダムなので当然といえば当然ですね。若干情シスの平均GPが低いですが、学生の数が多いのでこうなっているのかもしれません。

改善するには、同期にアンケートをとってその結果をコース優先度に重み付き確率として反映してみると割と良い結果が得られるかもしれませんね。

以前、1021世代でアンケートはとりましたが、公開した時に一言も使うとは言っていないので、そのデータを使ったシミュレーションの結果を公開するのはやめておきます。

おわりに

この記事ではコース分属をシミュレートしてみました。各パラメーターを調整すればうまくいきそうな気がします(投げやり)。

この記事を通して伝えたいのは、1年生の皆勉強してくれってところですかね(2敗)。希望のコースに行きたいならば、最低でも必修科目を落としてはいけません。このシミュレーションでも、どれだけいい成績をとっても1つFがあるだけで優先順位をガンと下げられています。また、どうしても行きたいコースがあるなら、成績を下げないようにしましょう。あるコースがめちゃくちゃ人気になった時に落とされます2

ついでにですが、希望のコースを落とされても気を落とさないようにしましょう。未来大はどのコースに行ってもだいたい楽しめます。あと、出たらコースとかあんまり関係ないです。ただ卒業はしましょう。

明日はふぁるさんの担当です。ふぁるさんは外部院進に成功したことを書くようです。合格めでたい🎉。

ここまで読んでくださり、ありがとうございます。

おまけ

おまけとして、ISD先生に脅された要望された卒研配属アルゴリズムについての調査結果を残しておきます。こちらもコーディングしようかなと思いましたが、コース外履修の加味とか、教員がコースの全ての学生に優先度をつけているのかとか、実装する側からしてみれば非常に非現実的な感じになりそうだったので実装は断念しました。

卒研配属は受入保留方式という方法で行なわれています。受入保留方式はGale-Sharplay(GS)アルゴリズムやDA法などとも呼ばれ、マッチングの分野では割と有名かつ公平に分配できるとされているようです。ちなみに、「双方が優先度をつけてマッチングするときに、互いの満足度をある程度保証してマッチングする」という問題を安定結婚問題と呼び、定式化されているようです。

この方式を卒研配属に採用しているという情報が確認できた大学はお茶の水女子大学と大阪電気通信大学の2つのみですが、「GSアルゴリズム 卒研」で調べると大量に論文がヒットするので恐らく様々な大学が採用していると思われます3


  1. GPは{S: 4, A: 3, B: 2, C: 1, F: 0}です。 ↩︎

  2. この記事の筆者である僕は、1年の時に必修科目全てを修得したものの、第二希望である知能システムコースに配属され、高度ICTコースを目指したら応用数学IIを落としてその夢も閉ざされました。ただ、今はメンタルを持ち直せてます。 ↩︎

  3. 調べても決定的な情報が少なかったのですが、まあ本学も採用しているようですしメジャーな方法と言ってもよいと思います。 ↩︎