sophiaの書

なんか書く

六畳間に布団を4枚敷くとき、部屋に占める布団の面積を最大化する

以前合宿で部屋に布団を敷いていたとき、誰かが「この作業は布団の面積を最大化する問題に置き換えられるのではないか?」と言っていたので確かめてみた。

条件

そのときの部屋の大きさは覚えていないので、適当に六畳間とする。畳の寸法は団地間(85 cm×170 cm)とする。

また、敷き布団の大きさを測ってなかったのでここでは直置き用のシングルサイズ(100 cm×210 cm)とする。

計算量を減らすために布団の縁が部屋の壁と平行になるように布団を敷くことにする。

計算量を減らすために布団を20 cmずつずらして布団の面積を計算し、布団の面積が最大となるような布団の配置を探す。具体的には布団4枚についてx方向とy方向にそれぞれ動かすのでプログラムで八重ループを使う。

面積は図1に●で示した格子点の個数を数えて計算する。図1の場合は●が84個ある。●はそれぞれ20 cm×20 cmの面積と対応している。よって、図1では布団の面積は84×20×20平方センチメートルとなる。ただし図1において灰色で示した部分は無視している。布団の長辺210 cmは20 cmで割り切れないからである。なお、図1には縦置きと横置きの布団が2枚置いてある様子を示してある。格子点の個数はMATLABのunion関数とsize関数を用いることで簡単に求められる。

図1 面積計算法

図1 面積計算法

部屋の大きさは340 cm×255 cmである。布団を20 cmずつ動かすため必ずしも布団を部屋の隅まで動かすわけではない。布団配置決定のための八重ループに時間がかかるので、計算量を減らすためにこのような粗い評価をせざるを得ない。

結果

横置きの布団が4枚のとき、布団面積は67200平方センチメートルであった。この面積の値は上でも述べたように布団の一部を無視して計算した値である。図2にこのときの布団配置を示す。黒枠は六畳間を表す。左上の角が原点であり右方向にx軸を、下方向にy軸を取る。それぞれの布団の位置は布団左上の角の座標で表す。見やすさのために4枚の布団を赤、黄、緑、青で区別する。図2の場合、赤い布団の位置は(0 cm, 0 cm)、黄色い布団の位置は(0 cm, 100 cm)、緑の布団の位置は(120 cm, 0 cm)、青の布団の位置は(120 cm, 140 cm)であった。この布団配置が横置き4枚を今回の条件の下で動かし布団の面積が最大となる布団配置である。例えば緑の布団を青の布団に接するまで図2の下方向に動かしても布団の面積は変わらない。このように面積を変えずにある程度布団の位置をずらせるので、求めた布団配置は唯一の配置ではない。

布団を20 cmずつ動かして評価しているので布団を部屋の隅まで動かせてないことが図2から分かる。

図2 横置き4枚

図2 横置き4枚

横置きが3枚、縦置きが1枚のとき布団の面積は70400平方センチメートルであった。図3にこのときの布団配置を示す。図3の場合、赤い布団の位置は(0 cm, 0 cm)、黄色い布団の位置は(0 cm, 100 cm)、緑の布団の位置は(40 cm, 140 cm)、青の布団の位置は(240 cm, 0 cm)であった。

図3 横置き3枚、縦置き1枚

図3 横置き3枚、縦置き1枚

横置きが2枚、縦置きが2枚のとき布団の面積は72800平方センチメートルであった。図4にこのときの布団配置を示す。図4の場合、赤い布団の位置は(0 cm, 0 cm)、黄色い布団の位置は(40 cm, 140 cm)、緑の布団の位置は(100 cm, 0 cm)、青の布団の位置は(240 cm, 40 cm)であった。

図4 横置き2枚、縦置き2枚

図4 横置き2枚、縦置き2枚

横置きが1枚、縦置きが3枚のとき布団の面積は70400平方センチメートルであった。図5にこのときの布団配置を示す。図5の場合、赤い布団の位置は(0 cm, 0 cm)、黄色い布団の位置は(40 cm, 140 cm)、緑の布団の位置は(100 cm, 0 cm)、青の布団の位置は(240 cm, 0 cm)であった。

図5 横置き1枚、縦置き3枚

図5 横置き1枚、縦置き3枚

縦置きが4枚のとき布団の面積は70400平方センチメートルであった。図6にこのときの布団配置を示す。図6の場合、赤い布団の位置は(0 cm, 0 cm)、黄色い布団の位置は(40 cm, 40 cm)、緑の布団の位置は(140 cm, 0 cm)、青の布団の位置は(240 cm, 0 cm)であった。

図6 縦置き4枚

図6 縦置き4枚

考察

布団の面積が最大となったのは横置き2枚、縦置き2枚のとき(図4)であった。

今回の条件では布団の一部を無視して面積を計算した。同じ布団の配置で布団の一部を無視せずに計算し直してみる。横置き4枚のときは69600平方センチメートルである。横置き3枚、縦置き1枚のときは73100平方センチメートルである。横置き2枚、縦置き2枚のときは74600平方センチメートルである。横置き1枚、縦置き3枚のときは72100平方センチメートルである。縦置き4枚のときは73800平方センチメートルである。

よって布団の一部を無視せず面積を計算したとしても横置き2枚、縦置き2枚のとき面積が最大となる。

二番目に大きな面積との差は74600-73800=800平方センチメートルである。この値は布団一枚の面積210×100=21000平方センチメートルの800÷21000×100≒3.8%である。あまり大きな違いはないと言える。

また、今回は布団を20 cmずつずらして面積を計算したので雑な評価であり、今回の計算結果は本当の最大値ではない。

加えて、計算結果は布団と畳の寸法によって変わることに注意しなければならない。

よく考えてみれば、実際には六畳間に布団を4枚敷くとき部屋の床面積に占める布団の面積の割合を最大化しているわけではない。部屋の入り口付近には布団を敷かないようにしたり、荷物置き場を用意したり、布団の重なり合いをどの布団でも同じくらいにしたりしている。

単純に布団の面積を最大化するだけでは不十分である。

MATLABプログラムについて

横置きの布団が4枚のとき私のPCでMATLABプログラムを動かすのにかかった時間は117.901秒であった。部屋の対称性と布団の形が全て同じであることを利用して八重ループの回数を減らす工夫をしている。

同様にして、横置き3枚、縦置きが1枚のとき計算時間は398.045秒。

横置き2枚、縦置きが2枚のとき計算時間は202.037秒。

横置きが1枚、縦置きが3枚のとき計算時間は106.175秒。

縦置きが4枚のとき計算時間は23.338秒であった。