はもちくわ

コードについて自分なりの解釈を書いてます。

四角の中に円形のものがいくつ並ぶか考えた話

f:id:hamochikuwa440:20220129001130p:plain

 

物流やタイヤ製造などの経験はないのですが、タイヤを倉庫に格納する際、パレットへタイヤを並べて積付けるパターンを算出する仕組みを作る機会があり、とにかくお金をかけずに・・・とのことなので、有料ソフトなどは使わず、素人なりに頑張って考えた結果、満足してもらえるものが完成しました。

その時の話を書いてみます。



まず、計算条件です。

  1. 同じパレット(四角)に同じタイヤ(円形)だけ載せる
  2. パレット(四角)からタイヤ(円形)がはみ出ないこと
  3. パレット(四角)は複数種類があるのでサイズが可変できること
  4. タイヤは限定無く、なんでもあり
  5. タイヤサイズは品名のデータのみで外寸データなし

この5のタイヤサイズの表記はちょっとクセがありました。よく使われるサイズ表記に、計算で使いたい直径表記がないのです。なので、ネットで直径を計算する方法をしらべて、サイズがわかれば自動計算できるように加工しました。
早速、サンプルデータを使ってパターンマッチングで計算してみると、、、、あれ?ヒットしないものがいくつかある。。。

またネットの力を借り、原因をつぶした結果、次の3つのサイズ表記のパターンでなんとか網羅できました。

f:id:hamochikuwa440:20220128174032p:plain

②のサイズ表記が少ないタイヤはどうするんだろう??って思ったんですが、調べると出てきますね〜。みんな困ってるんでしょうか??これは扁平率が抜けているらしく、その場合は大体82%の計算らしいです。あまり日常生活には役に立たない知識ですね(笑)
この3つのパターンマッチングで条件分岐させ、タイヤごとの直径をサイズ表記のテキストから得ることは難なく完成。
(パターンマッチングや直径算出の詳細は話がズレるのでしません。)

 

さて、ここから本題の積付けパターンの計算。

四角形の入れ物の大きさと円形の物の大きさがわかれば、数学の公式なんかで答えが一発算出できるのかも、、、、、、と思いましたが、残念ながら、私にはそういった数学知識はない。。。。

ひとまず上から見た図を書いて考えてみました。

どんな並べ方でも枠から出てはいけないということは、、、

f:id:hamochikuwa440:20220128182937p:plain

図のようにタイヤをパレットの端ギリギリをぐるっとはみ出さないように回転させると、パレットの大きさからタイヤ半径分、内側へずらした四角の範囲内で中心の位置を考えればいいはず。この許容範囲をXとしておきましょう。

次にタイヤを積み付けるパターンを聞いたとおり書いてみる。聞いたのは1本から5本まででしたが、一応6本まで考えよう。

f:id:hamochikuwa440:20220128175634p:plain

そして、小中学校時代に先生から教えてもらった、
「とりあえず線を引いて考えてみよう!」ですね。

まず6本パターンから

f:id:hamochikuwa440:20220128205942p:plain

パレットにタイヤがピッタリ6本収まっている状態を考える。
その時、6本のタイヤの中心点が作る図形の端が最初に考えた許容範囲X以内なら載るはず。
なので一番図形が長くなる箇所を式で表すことができればOKそうですね。

ひとまずαの長さを出してみる。

(パレット横幅−タイヤ直径)÷2とタイヤ直径を2辺持つ直角三角形の残り一辺なので、直角三角形ならば2辺わかれば残り1辺は公式で導けますね。(そのへんは数学のページで調べてください。)

公式に当てはめるためにわかりやすく1辺をアルファベットに変換して式にしてみます。
(パレット横幅−タイヤ直径)÷2をA、タイヤ直径をBとすると、式は

B×B−A×A=α×α

となります。二乗、平方根計算はそれぞれ使う言語や関数(sqrt とかSqrとか)でやれば、問題なくαはすぐ出ますね。これで一つ条件が整いました。

α+タイヤ直径 <= パレット奥行き−タイヤ直径

次は横幅を考えたほうがよいのでしょうが、この条件を導き出すために横幅、奥行き、直径すべて絡んでます。
なので、条件はこの1択で良さそうです。面倒なのでやめましょう(笑)
ただ、タイヤが大きすぎて計算上マイナスになると平方根計算に不都合が出るので、事前に除外することにしました。上の条件計算の前に

・パレット横幅 <= タイヤ直径×2

をつけました。要するにタイヤ2本を横に並べてはみ出すなら、6本は絶対載らないということです。

逆に小さすぎる場合も事前考慮します。横にきれいに並ぶならαが発生しないからです。
・パレット横幅 >= タイヤ直径×3
・パレット奥行き >= タイヤ直径×2

この場合は、きれいに2列に並んでるはずですね。

 

次は5本で考えます。

f:id:hamochikuwa440:20220128212933p:plain

これは対角線の長さで比べます。

パレットの横幅と奥行きがわかれば、先程の直角三角形の1辺の出し方で対角線は出せます。
さらに図のAの長さもタイヤの半径を一辺とする正方形の対角線です。
ということは、

パレットの対角線 >= タイヤ直径×2+A×2

これで条件が整いました。マイナス計算に陥らないのでこれでOKでしょう。

 

次に4本です。

f:id:hamochikuwa440:20220128223205p:plain

 

タイヤが4本載るギリギりの時を想定すると、図のBは

・パレットの奥行き−タイヤ直径

図のCは

・パレット横幅−タイヤ直径×2

このときαは直角三角形の一辺を求める式で求められます。
条件としては、

α >= タイヤ直径

となります。
ただ、また小さすぎる場合と大きすぎる場合も想定しておかないといけません。

・パレット横幅 >= タイヤ直径×2
・パレット奥行き >= タイヤ直径×2

きれいに2列並ぶ場合ですね。

 

はい、次は3本の場合

f:id:hamochikuwa440:20220128224650p:plain

図のαの長さを求めます。
まずAは
パレットの横幅-タイヤ直径
です。この求めた半分の長さとタイヤ直径が2辺となる直角三角形の一辺がαです。
上でやってきた公式と一緒ですね。条件としては、

パレット奥行き−タイヤ直径 >= α

最初の許容範囲Xの奥行きと比べて収まるかどうかで判断してます。

 

2本の場合

f:id:hamochikuwa440:20220128230240p:plain

5本のときと同様に対角線で判断します。

タイヤ半径を一辺とする対角線をAとして求め、パレットの対角線からA×2を引き、タイヤ直径と比べて判断します。
条件としては、

パレット対角線−A×2 >= タイヤ直径

とします。

 

1本の場合は、、、

言わずもがな。。。直径がパレット奥行き、横幅以下ならば載りますね。

この書いてきた条件を6本から1本へと順番に当てはめていきます。条件に合わない大きいものが順番に1本の方に降りてくる感じ。結果、どの条件にも当てはまらないものは「該当なし」で処理するものにしました。

 

これで意地悪な人が規格外のパレットで入力すると、、、、対応できないかもしれませんが(笑)、実際の想定ならばうまく判断できるようになりました。
さらにタイヤの幅も計算でわかっているので、収める棚の高さがわかれば格納本数も算出できるようにしておきました。ただ、使ってもらってわかったのですが、タイヤはゴムなので積むと重みで幅が変わるみたいです。その上、タイヤ規格によるものですが、サイズ表記は「5」で丸めてあるそうで、実寸は少し違うみたいなんです。。。奥が深い。。。

まあ、それでもおおよその積付けは結構な精度で判定できるようになったそうです。

お役に立ててよかった!

さらに計算から外れたものは、データベースで積付け一覧を作ればもっと精度が良くなるでしょうね。計算する仕組みを必ず通すなら尚更完璧なデータベースになりそう!
。。。まあ、でも運用の際にデータベースをどこに置くかで随分変わるのでこれ以上は相談あればってことで(笑)

 

私の作ったものは、稚拙な計算式だし、穴だらけかもしれません。そして、計算効率をもっと上げれる可能性もかなりありそうです。例えば、パレットの大きさがわかっているなら指数を作っておいて、タイヤ直径と比較させるだけにするとか、、、、そうか、方程式にして解いていけばそれはできそうだな(笑)いま思いついても遅い。。。
また、計算エラーがでたら教えてもらうことにしてますので、そのとき考えようかな!!

こんなんだから、私は「仕事で使えるレベルじゃない」って言われちゃうんだろうな。。。

まあ、どうせ無価値なものなんだから、どんどん無償で配ってやろう!と思っております!!

 

そうそう、この仕組はJavaScriptVBAの両方で関数化しました。テキストを得るとパターンで返す感じ。
コードを記事にするのは手間がかかるので、、、また今度更新しま〜す。