20121130 Kashiwa.R#5

Post on 24-May-2015

282 views 5 download

description

シンプレックス法を用いた実習班割当問題をシミュレーションした。

Transcript of 20121130 Kashiwa.R#5

変態に R を与えた結果がこれだよ…実習のコース決めで意中の相手と同じ班になることを考える

20121130Kashiwa.R @ 東京大学柏キャンパス 柏図書館

YF@Med_KU

lpSolve: 混合整数線形計画法割付問題に使える

snow, foreach, ff: 並列計算たくさん計算するときに使える

本日の紹介

某大学異学部

実習班を決める時期が毎年やってくる…

> は~いそれじゃあ 6 人 1 組の実習班作って~

> おう〇〇 !! オレと組もうぜ !!

あぶれるだろ

じゃあわかった…やり方を変えよう。100 人分の実習コースを用意するから、どのコースに行きたいか、行きたくないか全コース順位付けしろ。みんなの希望調査を眺めて、全体の満足度が最大になるように決めるから。その後前から順番にグループ切っていきます。常識的に考えて。

というふうに決まったのが数年前

そして今年も実習班を決める時期がやってくる…

ミク!ミク!ミク!ミクたんぅぅうううわぁああああああああああああああああああああああん!!! あぁああああ…ああ…あっあっー!あぁああああああ!!!ミクミクミクぅううぁわぁああああ!!! あぁクンカクンカ!クンカクンカ!スーハースーハー!スーハースーハー!いい匂いだなぁ…くんくん んはぁっ!ミクたんの緑色ツインテールの髪をクンカクンカしたいお!クンカクンカ!あぁあ!! 間違えた!モフモフしたいお!モフモフ!モフモフ!髪髪モフモフ!カリカリモフモフ…きゅんきゅんきゅい!! 台湾ミクパのミクたんかわいかったよぅ!!あぁぁああ…あああ…あっあぁああああ!!ふぁぁあああんんっ!! DIVAf発売されて良かったねミクたん!あぁあああああ!かわいい!ミクたん!かわいい!あっああぁああ! アニメ化もされて嬉し…いやぁああああああ!!!にゃああああああああん!!ぎゃああああああああ!!ぐあああああああああああ!!!アニメなんて現実じゃない!!!!あ…ボカロも MMD もよく考えたら…ミ ク ち ゃ ん は 現実 じ ゃ な い?にゃあああああああああああああん!!うぁああああああああああ!!そんなぁああああああ!!いやぁぁぁあああああああああ!!はぁああああああん!!クリプトォォオオオオン!!この!ちきしょー!やめてやる!!現実なんかやめ…て…え!?見…てる?パッケージのミクたんが僕を見てる?パッケージのミクたんが僕を見てるぞ!ミクたんが僕を見てるぞ!挿絵のミクちゃんが僕を見てるぞ!! PC のミクちゃんが僕に話しかけてるぞ!!!よかった…世の中まだまだ捨てたモンじゃないんだねっ!いやっほぉおおおおおおお!!!僕にはミクたんがいる!!やったよケティ!!ひとりでできるもん!!!あ、ミクたぁああああああああああああああん!!いやぁあああああああああああああああ!!!!あっあんああっああんあルカ様ぁあ!!リ、リンちゅわぁぁあああああん!!レンきゅぅぅううううん!!!カイトォォオオ!!ううっうぅうう!!俺の想いよミクへ届け!!クリプトンのミクへ届け!

ミクたんと一緒の実習班になりたいお!!

> 今年も例年通りのプログラムで決めます

クソッ そうしたらミクたんと同じ班になれるかわからないじゃかお !

こんな運任せな制度さえどうにかなれば裏工作はいくらでもできたお…

ミクたんと同じ班になれるような希望調査にしたいんだお…

でも現実は一緒になれるかわからないんだお…

だからシミュレーションでやるお !

実習先ってどうやって決まってるんだお ?教えろください。

プログラムの概要を説明しよう。学生が人、実習コースがだけある。とある学生はすべてのコースについて、それぞれ希望点数をつける。どの学生がどのコースになるかは行列で表すことができて、

となる。そうして、

を満たすように行列を決定するのが問題だ。常識的に考えて。

4 人の学生を 4 つのコースに割り付ける場合を考えよう。今、学生の希望点数行列

があって、各コースの割付行列を決定する。 R 的には

を、割付行列の各行と各列について 1 をひとつだけ、残りはすべて 0 という制限のもとで、最大または最小にすることだ。これは lpSolve パッケージの lp.assign で可能だ。常識的に考えて。すると答えは

R 言語でおk

だがしかし、最適割付の仕方は一意に決まらなことがあるので、行と列の入れ替えで別の結果になることもある。常識的に考えて。事後計算だが、 40! 通りの割付パターン、 6 人 1 組のグループ分けを考えても天文学的な確率だった気がするぞ。常識的に考えて。

まじかお !?!?

そそそそういう場合はどうしたらいいんだお ?

こういうときは、シミュレーションを行なって、どんな希望調査ならどう割り付けられるか確率を求めるんだ。常識的に考えて。

幸いにも希望調査は学年全体に公開の掲示板で行われているからな。締切ギリギリまで粘って、ミクと同じ班になるように希望調査を書いてこい。

そうと決まればこんなところにいる場合じゃねぇお !

マジでやりおってストーカーか

そうだお何が悪い( 一応、行きたいコースをまじめに選びました )

こういうひたすら試行回数を稼ぎたい時は並列計算をする。常識的に考えて。R では snow パッケージを始めとして、複数提供されている。今回は私の初期のプログラムなので、 snowを使って説明するぞ。常識的に考えて。

library(snow) で読み込んだら、並列計算で使用するCPU の登録をするぞ。常識的に考えて。まずmakeCluster() で CPU を呼び出し、 clusterExport()で登録する。並列計算がそもそも何かとかは私は専門外なので ggrks 。Snow パッケージでは、 apply関数群に似た parApply関数群があり、これらを使うと並列計算ができる。

並列計算し終わった後は stopCluster() で使用したCPU を開放しないと、なんか知らんがいつまでも残ってるぞ。

調子に乗って 10万回設定したが、 1万回もすれば十分に確率は収束してるぞ。常識的に考えて。

マージンのために 10万回設定してラボのサーバーで並列計算するお

チラッ

スレでも開いて時間潰すお

まあこの手の計算は気長に待つことだな…常識的に考えて…おっ…結果が出たようだな。

・・・

全同級生の中で最大だがしかし…

40%

赤は 100%

ミクはグループが確定してしまっている !?!?

ここが 40% だったけど

赤は 100%

ま…待て冷静に考えるんだ。ミクのグループが確定してるんならその周辺に変更して…

> 希望調査は締め切られました。

ま…待て。冷静に考えればオレがミクと同じグループになる確率が 40% はあるんだ…

チラッ

> 抽選結果やる夫: 4 グループミク: 7 グループ

まあ…シミュレーション通りに 3次元のこの世界は思ったとおりにはいかないということを身をもって学んだよ…

~完~