20121130 kashiwa.r#5
DESCRIPTION
シンプレックス法を用いた実習班割当問題をシミュレーションした。TRANSCRIPT
![Page 1: 20121130 Kashiwa.R#5](https://reader036.vdocuments.site/reader036/viewer/2022062513/556151f5d8b42aa20d8b4f76/html5/thumbnails/1.jpg)
変態に R を与えた結果がこれだよ…実習のコース決めで意中の相手と同じ班になることを考える
20121130Kashiwa.R @ 東京大学柏キャンパス 柏図書館
YF@Med_KU
![Page 2: 20121130 Kashiwa.R#5](https://reader036.vdocuments.site/reader036/viewer/2022062513/556151f5d8b42aa20d8b4f76/html5/thumbnails/2.jpg)
lpSolve: 混合整数線形計画法割付問題に使える
snow, foreach, ff: 並列計算たくさん計算するときに使える
本日の紹介
![Page 3: 20121130 Kashiwa.R#5](https://reader036.vdocuments.site/reader036/viewer/2022062513/556151f5d8b42aa20d8b4f76/html5/thumbnails/3.jpg)
某大学異学部
実習班を決める時期が毎年やってくる…
![Page 4: 20121130 Kashiwa.R#5](https://reader036.vdocuments.site/reader036/viewer/2022062513/556151f5d8b42aa20d8b4f76/html5/thumbnails/4.jpg)
> は~いそれじゃあ 6 人 1 組の実習班作って~
> おう〇〇 !! オレと組もうぜ !!
![Page 5: 20121130 Kashiwa.R#5](https://reader036.vdocuments.site/reader036/viewer/2022062513/556151f5d8b42aa20d8b4f76/html5/thumbnails/5.jpg)
あぶれるだろ
![Page 6: 20121130 Kashiwa.R#5](https://reader036.vdocuments.site/reader036/viewer/2022062513/556151f5d8b42aa20d8b4f76/html5/thumbnails/6.jpg)
じゃあわかった…やり方を変えよう。100 人分の実習コースを用意するから、どのコースに行きたいか、行きたくないか全コース順位付けしろ。みんなの希望調査を眺めて、全体の満足度が最大になるように決めるから。その後前から順番にグループ切っていきます。常識的に考えて。
![Page 7: 20121130 Kashiwa.R#5](https://reader036.vdocuments.site/reader036/viewer/2022062513/556151f5d8b42aa20d8b4f76/html5/thumbnails/7.jpg)
というふうに決まったのが数年前
そして今年も実習班を決める時期がやってくる…
![Page 8: 20121130 Kashiwa.R#5](https://reader036.vdocuments.site/reader036/viewer/2022062513/556151f5d8b42aa20d8b4f76/html5/thumbnails/8.jpg)
ミク!ミク!ミク!ミクたんぅぅうううわぁああああああああああああああああああああああん!!! あぁああああ…ああ…あっあっー!あぁああああああ!!!ミクミクミクぅううぁわぁああああ!!! あぁクンカクンカ!クンカクンカ!スーハースーハー!スーハースーハー!いい匂いだなぁ…くんくん んはぁっ!ミクたんの緑色ツインテールの髪をクンカクンカしたいお!クンカクンカ!あぁあ!! 間違えた!モフモフしたいお!モフモフ!モフモフ!髪髪モフモフ!カリカリモフモフ…きゅんきゅんきゅい!! 台湾ミクパのミクたんかわいかったよぅ!!あぁぁああ…あああ…あっあぁああああ!!ふぁぁあああんんっ!! DIVAf発売されて良かったねミクたん!あぁあああああ!かわいい!ミクたん!かわいい!あっああぁああ! アニメ化もされて嬉し…いやぁああああああ!!!にゃああああああああん!!ぎゃああああああああ!!ぐあああああああああああ!!!アニメなんて現実じゃない!!!!あ…ボカロも MMD もよく考えたら…ミ ク ち ゃ ん は 現実 じ ゃ な い?にゃあああああああああああああん!!うぁああああああああああ!!そんなぁああああああ!!いやぁぁぁあああああああああ!!はぁああああああん!!クリプトォォオオオオン!!この!ちきしょー!やめてやる!!現実なんかやめ…て…え!?見…てる?パッケージのミクたんが僕を見てる?パッケージのミクたんが僕を見てるぞ!ミクたんが僕を見てるぞ!挿絵のミクちゃんが僕を見てるぞ!! PC のミクちゃんが僕に話しかけてるぞ!!!よかった…世の中まだまだ捨てたモンじゃないんだねっ!いやっほぉおおおおおおお!!!僕にはミクたんがいる!!やったよケティ!!ひとりでできるもん!!!あ、ミクたぁああああああああああああああん!!いやぁあああああああああああああああ!!!!あっあんああっああんあルカ様ぁあ!!リ、リンちゅわぁぁあああああん!!レンきゅぅぅううううん!!!カイトォォオオ!!ううっうぅうう!!俺の想いよミクへ届け!!クリプトンのミクへ届け!
ミクたんと一緒の実習班になりたいお!!
![Page 9: 20121130 Kashiwa.R#5](https://reader036.vdocuments.site/reader036/viewer/2022062513/556151f5d8b42aa20d8b4f76/html5/thumbnails/9.jpg)
> 今年も例年通りのプログラムで決めます
クソッ そうしたらミクたんと同じ班になれるかわからないじゃかお !
こんな運任せな制度さえどうにかなれば裏工作はいくらでもできたお…
![Page 10: 20121130 Kashiwa.R#5](https://reader036.vdocuments.site/reader036/viewer/2022062513/556151f5d8b42aa20d8b4f76/html5/thumbnails/10.jpg)
ミクたんと同じ班になれるような希望調査にしたいんだお…
でも現実は一緒になれるかわからないんだお…
だからシミュレーションでやるお !
![Page 11: 20121130 Kashiwa.R#5](https://reader036.vdocuments.site/reader036/viewer/2022062513/556151f5d8b42aa20d8b4f76/html5/thumbnails/11.jpg)
実習先ってどうやって決まってるんだお ?教えろください。
![Page 12: 20121130 Kashiwa.R#5](https://reader036.vdocuments.site/reader036/viewer/2022062513/556151f5d8b42aa20d8b4f76/html5/thumbnails/12.jpg)
プログラムの概要を説明しよう。学生が人、実習コースがだけある。とある学生はすべてのコースについて、それぞれ希望点数をつける。どの学生がどのコースになるかは行列で表すことができて、
となる。そうして、
を満たすように行列を決定するのが問題だ。常識的に考えて。
![Page 13: 20121130 Kashiwa.R#5](https://reader036.vdocuments.site/reader036/viewer/2022062513/556151f5d8b42aa20d8b4f76/html5/thumbnails/13.jpg)
4 人の学生を 4 つのコースに割り付ける場合を考えよう。今、学生の希望点数行列
があって、各コースの割付行列を決定する。 R 的には
を、割付行列の各行と各列について 1 をひとつだけ、残りはすべて 0 という制限のもとで、最大または最小にすることだ。これは lpSolve パッケージの lp.assign で可能だ。常識的に考えて。すると答えは
R 言語でおk
![Page 14: 20121130 Kashiwa.R#5](https://reader036.vdocuments.site/reader036/viewer/2022062513/556151f5d8b42aa20d8b4f76/html5/thumbnails/14.jpg)
だがしかし、最適割付の仕方は一意に決まらなことがあるので、行と列の入れ替えで別の結果になることもある。常識的に考えて。事後計算だが、 40! 通りの割付パターン、 6 人 1 組のグループ分けを考えても天文学的な確率だった気がするぞ。常識的に考えて。
![Page 15: 20121130 Kashiwa.R#5](https://reader036.vdocuments.site/reader036/viewer/2022062513/556151f5d8b42aa20d8b4f76/html5/thumbnails/15.jpg)
まじかお !?!?
![Page 16: 20121130 Kashiwa.R#5](https://reader036.vdocuments.site/reader036/viewer/2022062513/556151f5d8b42aa20d8b4f76/html5/thumbnails/16.jpg)
そそそそういう場合はどうしたらいいんだお ?
こういうときは、シミュレーションを行なって、どんな希望調査ならどう割り付けられるか確率を求めるんだ。常識的に考えて。
![Page 17: 20121130 Kashiwa.R#5](https://reader036.vdocuments.site/reader036/viewer/2022062513/556151f5d8b42aa20d8b4f76/html5/thumbnails/17.jpg)
幸いにも希望調査は学年全体に公開の掲示板で行われているからな。締切ギリギリまで粘って、ミクと同じ班になるように希望調査を書いてこい。
そうと決まればこんなところにいる場合じゃねぇお !
![Page 18: 20121130 Kashiwa.R#5](https://reader036.vdocuments.site/reader036/viewer/2022062513/556151f5d8b42aa20d8b4f76/html5/thumbnails/18.jpg)
マジでやりおってストーカーか
そうだお何が悪い( 一応、行きたいコースをまじめに選びました )
![Page 19: 20121130 Kashiwa.R#5](https://reader036.vdocuments.site/reader036/viewer/2022062513/556151f5d8b42aa20d8b4f76/html5/thumbnails/19.jpg)
こういうひたすら試行回数を稼ぎたい時は並列計算をする。常識的に考えて。R では snow パッケージを始めとして、複数提供されている。今回は私の初期のプログラムなので、 snowを使って説明するぞ。常識的に考えて。
![Page 20: 20121130 Kashiwa.R#5](https://reader036.vdocuments.site/reader036/viewer/2022062513/556151f5d8b42aa20d8b4f76/html5/thumbnails/20.jpg)
library(snow) で読み込んだら、並列計算で使用するCPU の登録をするぞ。常識的に考えて。まずmakeCluster() で CPU を呼び出し、 clusterExport()で登録する。並列計算がそもそも何かとかは私は専門外なので ggrks 。Snow パッケージでは、 apply関数群に似た parApply関数群があり、これらを使うと並列計算ができる。
![Page 21: 20121130 Kashiwa.R#5](https://reader036.vdocuments.site/reader036/viewer/2022062513/556151f5d8b42aa20d8b4f76/html5/thumbnails/21.jpg)
並列計算し終わった後は stopCluster() で使用したCPU を開放しないと、なんか知らんがいつまでも残ってるぞ。
![Page 22: 20121130 Kashiwa.R#5](https://reader036.vdocuments.site/reader036/viewer/2022062513/556151f5d8b42aa20d8b4f76/html5/thumbnails/22.jpg)
調子に乗って 10万回設定したが、 1万回もすれば十分に確率は収束してるぞ。常識的に考えて。
![Page 23: 20121130 Kashiwa.R#5](https://reader036.vdocuments.site/reader036/viewer/2022062513/556151f5d8b42aa20d8b4f76/html5/thumbnails/23.jpg)
マージンのために 10万回設定してラボのサーバーで並列計算するお
チラッ
![Page 24: 20121130 Kashiwa.R#5](https://reader036.vdocuments.site/reader036/viewer/2022062513/556151f5d8b42aa20d8b4f76/html5/thumbnails/24.jpg)
スレでも開いて時間潰すお
![Page 25: 20121130 Kashiwa.R#5](https://reader036.vdocuments.site/reader036/viewer/2022062513/556151f5d8b42aa20d8b4f76/html5/thumbnails/25.jpg)
まあこの手の計算は気長に待つことだな…常識的に考えて…おっ…結果が出たようだな。
・・・
![Page 26: 20121130 Kashiwa.R#5](https://reader036.vdocuments.site/reader036/viewer/2022062513/556151f5d8b42aa20d8b4f76/html5/thumbnails/26.jpg)
全同級生の中で最大だがしかし…
40%
赤は 100%
![Page 27: 20121130 Kashiwa.R#5](https://reader036.vdocuments.site/reader036/viewer/2022062513/556151f5d8b42aa20d8b4f76/html5/thumbnails/27.jpg)
ミクはグループが確定してしまっている !?!?
ここが 40% だったけど
赤は 100%
![Page 28: 20121130 Kashiwa.R#5](https://reader036.vdocuments.site/reader036/viewer/2022062513/556151f5d8b42aa20d8b4f76/html5/thumbnails/28.jpg)
ま…待て冷静に考えるんだ。ミクのグループが確定してるんならその周辺に変更して…
> 希望調査は締め切られました。
![Page 29: 20121130 Kashiwa.R#5](https://reader036.vdocuments.site/reader036/viewer/2022062513/556151f5d8b42aa20d8b4f76/html5/thumbnails/29.jpg)
ま…待て。冷静に考えればオレがミクと同じグループになる確率が 40% はあるんだ…
チラッ
![Page 30: 20121130 Kashiwa.R#5](https://reader036.vdocuments.site/reader036/viewer/2022062513/556151f5d8b42aa20d8b4f76/html5/thumbnails/30.jpg)
> 抽選結果やる夫: 4 グループミク: 7 グループ
![Page 31: 20121130 Kashiwa.R#5](https://reader036.vdocuments.site/reader036/viewer/2022062513/556151f5d8b42aa20d8b4f76/html5/thumbnails/31.jpg)
まあ…シミュレーション通りに 3次元のこの世界は思ったとおりにはいかないということを身をもって学んだよ…
![Page 32: 20121130 Kashiwa.R#5](https://reader036.vdocuments.site/reader036/viewer/2022062513/556151f5d8b42aa20d8b4f76/html5/thumbnails/32.jpg)
~完~