わさっきhb

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

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

組体操で,人が乗ることによってかかる荷重を計算するRubyスクリプト(gfload.rb)をもとに,より実態に合わせた負荷の試算を試みるため,昨日付けでリリースしたもの(gfload+.rb)を改良した,新たなRubyスクリプト(gfload_est.rb)を作成しました.ソースはgistよりご覧ください.
昨日付けのgfload+.rbでは,上から2段目の人の荷重割合が0.5で,最前面で荷重割合が0.5を上回る人がいないこともあって,やや重い人が割り当てられていました.
改良にあたっては,「土台」「上2段」「残り」に分け,最上段を最も軽い者,その直下を次に軽い2人としました.土台(1段目)は全員の体重を1としたときの負荷順に割り当ててから,残り(下から2段目〜上から3段目)も負荷順に割り当てました.
スクリプトのgfload_est.rbでは,コマンドライン引数で算出方法を切り替えられます.-m 0だと全員の体重を1として(分布に基づく体重を使用せずに)求めます.-m 1は,全員の体重を1として算出した荷重の順で,体重の重い者を割り当てます.-m 2は昨日付けのアルゴリズム,-m 4は上述の改良アルゴリズムです.-m 3というオプションもありまして,残り(下から2段目〜上から3段目)を負荷順ではなく総当たりで当てはめ,最も荷重割合が小さくなる割り当てを求めます…なのですが,-m 4の結果と一致します.総当たりというのは順列ですので,5段だと「残り」の対象者が10人,なので10の階乗=3628800通りを試しており,手元の計算機では10分弱を要しました.それより多い段数では,やる気が起こりません.
段数と算出方法をいろいろ変えたときの実行結果は,次のとおりとなりました.

$ ruby gfload_est.rb -p 4 -m 0
13 persons, total_weight=13, max_load=1.05, max_rate=1.05 (name=1.2.2, weight=1, load=1.05)
$ ruby gfload_est.rb -p 4 -m 1
13 persons, total_weight=516.89, max_load=40.2086, max_rate=0.861675 (name=1.2.2, weight=46.6634, load=40.2086)
$ ruby gfload_est.rb -p 4 -m 2
13 persons, total_weight=516.89, max_load=39.4887, max_rate=0.846246 (name=1.2.2, weight=46.6634, load=39.4887)
$ ruby gfload_est.rb -p 4 -m 4
13 persons, total_weight=516.89, max_load=36.5366, max_rate=0.782984 (name=1.2.2, weight=46.6634, load=36.5366)
$ ruby gfload_est.rb -p 5 -m 0
22 persons, total_weight=22, max_load=1.4725, max_rate=1.4725 (name=1.2.3, weight=1, load=1.4725)
$ ruby gfload_est.rb -p 5 -m 1
22 persons, total_weight=893.402, max_load=59.9219, max_rate=1.26346 (name=1.2.2, weight=47.4268, load=59.9219)
$ ruby gfload_est.rb -p 5 -m 2
22 persons, total_weight=893.402, max_load=56.1638, max_rate=1.18422 (name=1.2.2, weight=47.4268, load=56.1638)
$ ruby gfload_est.rb -p 5 -m 4
22 persons, total_weight=893.402, max_load=55.4351, max_rate=1.16886 (name=1.2.2, weight=47.4268, load=55.4351)
$ ruby gfload_est.rb -p 6 -m 0
37 persons, total_weight=37, max_load=1.72263, max_rate=1.72263 (name=1.2.3, weight=1, load=1.72263)
$ ruby gfload_est.rb -p 6 -m 1
37 persons, total_weight=1492.47, max_load=69.1975, max_rate=1.42918 (name=1.2.3, weight=48.4175, load=69.1975)
$ ruby gfload_est.rb -p 6 -m 2
37 persons, total_weight=1492.47, max_load=64.741, max_rate=1.36791 (name=2.2.2, weight=40.4577, load=55.3423)
$ ruby gfload_est.rb -p 6 -m 4
37 persons, total_weight=1492.47, max_load=65.0452, max_rate=1.34342 (name=1.2.3, weight=48.4175, load=65.0452)
$ ruby gfload_est.rb -p 7 -m 0
55 persons, total_weight=55, max_load=2.40612, max_rate=2.40612 (name=1.3.3, weight=1, load=2.40612)
$ ruby gfload_est.rb -p 7 -m 1
55 persons, total_weight=2225.21, max_load=98.7718, max_rate=1.79859 (name=1.3.3, weight=54.9163, load=98.7718)
$ ruby gfload_est.rb -p 7 -m 2
55 persons, total_weight=2225.21, max_load=93.8389, max_rate=1.70876 (name=1.3.3, weight=54.9163, load=93.8389)
$ ruby gfload_est.rb -p 7 -m 4
55 persons, total_weight=2225.21, max_load=91.558, max_rate=1.66723 (name=1.3.3, weight=54.9163, load=91.558)
$ ruby gfload_est.rb -p 8 -m 0
81 persons, total_weight=81, max_load=2.79931, max_rate=2.79931 (name=1.3.4, weight=1, load=2.79931)
$ ruby gfload_est.rb -p 8 -m 1
81 persons, total_weight=3293.94, max_load=117.1, max_rate=2.17662 (name=1.3.3, weight=53.7033, load=116.892)
$ ruby gfload_est.rb -p 8 -m 2
81 persons, total_weight=3293.94, max_load=109.302, max_rate=2.05899 (name=2.3.3, weight=44.3379, load=91.2912)
$ ruby gfload_est.rb -p 8 -m 4
81 persons, total_weight=3293.94, max_load=108.418, max_rate=2.01807 (name=1.3.3, weight=53.7033, load=108.377)
$ ruby gfload_est.rb -p 9 -m 0
111 persons, total_weight=111, max_load=3.07871, max_rate=3.07871 (name=1.3.4, weight=1, load=3.07871)
$ ruby gfload_est.rb -p 9 -m 1
111 persons, total_weight=4511.69, max_load=127.703, max_rate=2.35011 (name=1.4.3, weight=53.7033, load=126.209)
$ ruby gfload_est.rb -p 9 -m 2
111 persons, total_weight=4511.69, max_load=121.163, max_rate=2.43527 (name=2.3.3, weight=44.3891, load=108.1)
$ ruby gfload_est.rb -p 9 -m 4
111 persons, total_weight=4511.69, max_load=121.111, max_rate=2.41713 (name=2.3.3, weight=44.3891, load=107.294)
$ ruby gfload_est.rb -p 10 -m 0
151 persons, total_weight=151, max_load=3.85408, max_rate=3.85408 (name=1.4.4, weight=1, load=3.85408)
$ ruby gfload_est.rb -p 10 -m 1
151 persons, total_weight=6151.38, max_load=166.013, max_rate=2.96409 (name=1.4.4, weight=56.0081, load=166.013)
$ ruby gfload_est.rb -p 10 -m 2
151 persons, total_weight=6151.38, max_load=154.444, max_rate=2.75753 (name=1.4.4, weight=56.0081, load=154.444)
$ ruby gfload_est.rb -p 10 -m 4
151 persons, total_weight=6151.38, max_load=152.836, max_rate=2.72882 (name=1.4.4, weight=56.0081, load=152.836)
$ ruby gfload_est.rb -p 11 -m 0
196 persons, total_weight=196, max_load=4.20128, max_rate=4.20128 (name=1.4.4, weight=1, load=4.20128)
$ ruby gfload_est.rb -p 11 -m 1
196 persons, total_weight=7874.73, max_load=177.723, max_rate=3.23603 (name=1.4.5, weight=54.9163, load=177.711)
$ ruby gfload_est.rb -p 11 -m 2
196 persons, total_weight=7874.73, max_load=167.418, max_rate=3.38121 (name=2.4.4, weight=45.0448, load=152.306)
$ ruby gfload_est.rb -p 11 -m 4
196 persons, total_weight=7874.73, max_load=166.585, max_rate=3.33916 (name=2.4.4, weight=45.0448, load=150.412)

コマンドのうち「-p 数」が,三角錐人間ピラミッドの段数です.
各出力の比較に使用するとよいのは,max_rateの値(荷重/自重の最大値)です.同じ段数のあいだだと,11段以外では,-m 0のときの値<-m 1のときの値<-m 2のときの値<-m 4のときの値 となっています*1
異なる段数で,max_rateの値の比較を試みることも可能です.7段の従来試算(体重がみな同じ場合)では最大荷重は自重の2.4倍でしたが,学校で行う組体操には体重のばらつきがあり,そこを考慮して,誰がどこを担当するかを工夫すれば,1.7倍程度と,従来試算の6段相当になることを意味します(大阪市教委規制*2の5段の場合の従来試算値「1.5」までは,下がりませんでしたが).
段数が増えれば,割合などの下げ幅も大きくなっていますが,それでも50kg前後の子に3倍以上の負荷がかかるのは尋常ではないですし,ピラミッドで何段にするかを決めるのは負荷以外の要因があることを,忘れるわけにいきません.

*1:11段だけ,-m 1のときの値が最小ですが,-m 2と-m 4では「name=2.4.4」と,2段目の人になっています.weightのやや軽い者が,割り当てられてしまっています.割り当ての詳細は,-vコマンドをつけて実行すれば表示されます.

*2:http://www.geocities.jp/ma85003/math/human_pyramid.pdfを参照しました.ところで最後のページの表で,「立体型」の5段と6段の人数が修正されていてびっくりしました.