わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

組体操・人間ピラミッドの荷重計算をRubyで

組体操で,人が乗ることによってかかる荷重を計算するRubyスクリプト,gfload.rbを作成しました.ソースはgistよりご覧ください.ソースファイルといくつかの出力(テキストおよび画像)をzipにして,http://d.hatena.ne.jp/takehikom/files/gfload.zip?d=downloadよりダウンロードできるようにしました.
算出は,http://www.geocities.jp/ma85003/math/human_pyramid.pdfと同じように行い,『教育という病 子どもと先生を苦しめる「教育リスク」 (光文社新書)』pp.53-54も参照しました.ピラミッドは三角形タイプ(俵型)と三角錐タイプ(立体型)の両方に対応しています.
またピラミッドに限定することなく,(1)それぞれの体重がいくらか,(2)誰が誰にどれだけの割合で荷重をかけて乗っているか,を指定すれば,各人にかかる荷重を求めることができます.なおwikipedia:人間ピラミッドで書かれている「クリープ(自重による構造物の変形)」には,対応していません.
zipファイルには,Graphvizを使って,荷重状況を平面図(有向グラフ)のPNG画像にしたものを入れています.5段の三角錐タイプのピラミッドでは,次のようになりました.
*1
丸1つが,1人です.中に2つの数値がありますが,上の行は3つの数を下線でつなぎ,「下から何段目」の「前から何列目」で「左*2から何番目」かを示しています.カッコ書きにした2行目は,荷重の算出値です.この中では,1_2_2と1_2_3の人の「1.47」が最大となっています.
丸の間で結ばれる矢印は,乗る乗られるの上下関係で,添えた数値は,荷重割合(どれだけの力をかけるか)を表します.どの人も,下に伸びる荷重割合の和は1以下です.和が1でないときは,体が地面についていることを意味します.下向きの矢印がないのは,誰にも体を預けていない,最下段を意味します.
三角形タイプ(triangle)と三角錐タイプ(trigonal)で1段ずつ変えたときの,人数と最大荷重は,次のとおりです.

triangle human pyramids (level=2)... 3 persons, total_weight=3, max_load=0.5
triangle human pyramids (level=3)... 6 persons, total_weight=6, max_load=1.5
triangle human pyramids (level=4)... 10 persons, total_weight=10, max_load=2.125
triangle human pyramids (level=5)... 15 persons, total_weight=15, max_load=3.125
triangle human pyramids (level=6)... 21 persons, total_weight=21, max_load=3.8125
triangle human pyramids (level=7)... 28 persons, total_weight=28, max_load=4.8125
triangle human pyramids (level=8)... 36 persons, total_weight=36, max_load=5.53906
trigonal human pyramids (level=3)... 6 persons, total_weight=6, max_load=0.5
trigonal human pyramids (level=4)... 13 persons, total_weight=13, max_load=1.05
trigonal human pyramids (level=5)... 22 persons, total_weight=22, max_load=1.4725
trigonal human pyramids (level=6)... 37 persons, total_weight=37, max_load=1.72263
trigonal human pyramids (level=7)... 55 persons, total_weight=55, max_load=2.40612
trigonal human pyramids (level=8)... 81 persons, total_weight=81, max_load=2.79931
trigonal human pyramids (level=9)... 111 persons, total_weight=111, max_load=3.07871
trigonal human pyramids (level=10)... 151 persons, total_weight=151, max_load=3.85408
trigonal human pyramids (level=11)... 196 persons, total_weight=196, max_load=4.20128

人数と総重量(total_weightの値)が同じなのは,各人の体重を1としていたからです.キログラムに置き換えたり,下の段の人をより重く,上の段の人をより軽くしたりすることも,可能です.zipファイルに入れたrbファイル(Rubyスクリプト)を書き換えれば,簡単に計算し直せます.
出力した数値について,上でリンクしたhuman_pyramid.pdfの最後の表と一致しています.と言いたいのですが,表の立体型で段数が5,6のところで,人数が少し違っていました.
プログラムの内部について,少しだけ書きます.三角形タイプの人員配置は,ボトムアップ(下から上に)で問題なくコーディングできたのですが,三角錐タイプを,本やPDFの図を見ながら同様に配置すると,混乱してきました.そこでトップダウン(上から下に)で書き換えました.
配置と荷重のルールを,文字を使って表すと,次のようになります.i.j.kで,「下からi段目」の「前からj列目」で「左からk番目」の人を表すことにします.ピラミッドの段数をlevelとすると,level.1.1,(level-1).1.1,(level-1).1.2を配置し,前者は後二者に0.5ずつの荷重をかけます.以下最上段の人は除外します.下から3段目以上で,i.j.kの人は,(i-2).(j+1).kと(i-2).(j+1).(k+1)の人に0.35ずつ(足を乗せることに対応する)荷重をかけます.下から2段目以上で,i.j.kの人は,(i-1).j.kと(i-1).j.(k+1)の人に0.15ずつ(手を乗せることに対応する)荷重をかけます.
このルールで得られる{i.j.k}だけを,処理の対象とし,出力しています.例えば5段の三角錐タイプに1_5_1がないのは,そういった事情からです.
『教育という病』p.54の図で,10段でも,11段でも土台(最下段)が5列なのが,気になっていましたが,自分なりにコーディングして,出力を見てみると*3,なるほど納得です.

*1:大きなサイズ:http://f.st-hatena.com/images/fotolife/t/takehikom/20151016/20151016052630_original.png

*2:右からでもいいのですが.

*3:zipファイル内にあるtrigonal10_result.txtとtrigonal11_result.txtをそれぞれ開き,「name=2.1.1」を探せば,その1つ前の行が,最下段の一番後ろの列の端の人の情報となります.10段は「name=1.5.6」,11段は「name=1.5.7」です.念のため9段(trigonal9_result.txt)も見ておくと,「name=1.4.6」でした.