定尺の長さと切り代、必要な部材の長さと本数を入力してください(部材は最大8種類。長さの空欄の行は無視します)。定尺の単価は空欄でもかまいません。
目次
このページでできること
- 定尺(1820mm・3640mm・4000mmなど)の長さと、必要な部材の長さ・本数(最大8種類)を入れるだけで、買うべき定尺の本数がその場でわかります
- 切り代(鋸の刃の厚み・既定3mm)を含めて計算するので、「1820mmを4等分の455mm×4本は、実は1本から3本しか取れない」といった落とし穴を見逃しません
- 長い部材から順に詰める割り付け(First Fit Decreasing)を基本に、部材の合計本数が60本以下なら「最も少ない本数になる組み合わせ」まで探索して、「定尺1本目:脚×2、端材214mm」のような割り付け表と、定尺ごとの横棒の図を表示します
- 部材ごとに別々の定尺から取る単純計算の本数も併記し、まとめ取りで何本節約できるかを見せます。理論上の最小本数(下限)と比べて、割り付けが最適(これ以上減らせない)か近似かも表示します
- 定尺の単価(任意)を入れると概算費用と節約できる金額も出ます。式のやさしい解説・Excel/Googleスプレッドシート/Python用のコピペ数式・計算ドリル(演習問題)もこのページにまとまっています
この計算は何の役に立つ?
例えば脚800mm×4本・幕板500mm×2本・貫400mm×2本の小さなテーブルを1820mmの2×4材で作るとき、部材ごとに別々に買うと定尺4本ですが、長い部材から順に詰めるまとめ取りなら3本で済みます(1本目:脚×2、2本目:脚×2、3本目:幕板×2+貫×2、端材8mm)。
買い出し前に本数を計算しておくと、足りずにもう一度買いに行く、逆に余らせて置き場に困る、といった失敗を減らせます。ホームセンターのカットサービスを使うときも、割り付け表があればカットの指示が一度で済みます。
ウッドデッキの根太や、フェンスの横桟のように「同じ長さの部材をたくさん」使う工事では、切り代の積み重ねが本数に効いてきます。例えば1820mmの定尺から455mmの横桟を取るとき、切り代なしなら4本ちょうどですが、切り代3mmでは \(4 \times 455 + 3 \times 3 = 1829\) mmとなって4本目が9mm足りず、1本から3本しか取れません。40本必要なら定尺は10本ではなく \(\lceil 40 \div 3 \rceil = 14\) 本です。
長さを455mmから450mmに変えるだけで4本取れて10本で済むので、設計の段階で「定尺から何本取れる長さか」を確かめておくと材料費を大きく節約できます。
塩ビ管(4m定尺)や電線管、アルミフレーム、カーテンレールなど「決まった長さで売られていて、切って使うもの」はすべて木材と同じ式で計算できます。例えば4000mmの塩ビ管から1200mm×5本・950mm×3本・300mm×1本を切り出すなら、まとめ取りで3本(別々に買うと4本)です。
ただし切り代はパイプカッターで切るなら0に近く、金鋸なら1〜2mm程度と道具で変わるので、切り代の欄を道具に合わせて変えてください。
工場では材料費が原価の大きな割合を占めるため、「材料のうちどれだけを製品にできたか」を歩留まり(ぶどまり)として管理します。このページの「歩留まり」は、部材の合計長さを買う定尺の合計長さで割った値で、端材と切り代が少ないほど100%に近づきます。
実際の工場では、何百種類もの部材を何千本もの材料に割り付けるため、このページと同じ「ビンパッキング問題」を解く専用のソフトウェアが使われています。長い順に詰めるFirst Fit Decreasingは、そうしたソフトウェアでも最初の目安を作る手順として定番の方法です。
巾木(壁と床の境目の板)や廻り縁(壁と天井の境目)は3640mm・4000mmの定尺で売られていて、部屋の各壁の長さに合わせて切って使います。例えば壁の長さが3600mm・2700mm・3600mm・2700mm(開口部を除く)の部屋に4000mm定尺の巾木を回すなら、3600と2700は同じ1本に入らないため、まとめ取りでも定尺4本です。
このように「壁1面ぶんの長さ」が定尺の半分を超えると本数は減らせないので、継ぎ目を許すか、定尺の長さを変えるか(3640mm定尺なら3600mmの壁にぴったり)を先に検討する材料になります。
式と図
用語・記号の解説
記号
| \(L\) | エル | 定尺の長さ(mm)。買ってくる木材1本の長さです。Length(長さ)の頭文字で、部材の長さ \(l\) と区別するため大文字にしています。 |
| \(l\)・\(l_i\) | エル・エルアイ | 部材(切り出したい材)の長さ(mm)。\(l_i\) の \(i\) は「\(i\) 番目の種類の部材」という番号です(脚・幕板・貫のように種類が複数あるため)。 |
| \(k\) | ケー | 切り代(鋸の刃の厚み・mm)。切るたびにこの分だけ木材が削れて短くなります。kerf(英語で「鋸の切り口」)の頭文字です。 |
| \(m\)・\(m_i\) | エム・エムアイ | 1本の定尺から取れる部材の本数。\(m = \lfloor (L + k) \div (l + k) \rfloor\) で求めます。 |
| \(q_i\) | キューアイ | 部材 \(i\) の必要本数。quantity(数量)の頭文字です。 |
| \(B_i\)・\(B_{\text{別}}\) | ビーアイ・ビーべつ | \(B_i\) は部材 \(i\) だけを取るのに必要な定尺の本数(\(\lceil q_i \div m_i \rceil\))。\(B_{\text{別}}\) は部材ごとに別々に買う場合の合計本数(\(B_i\) の合計)です。 |
| \(B\) | ビー | まとめ取り(長い部材から順に詰める割り付け)で必要な定尺の本数。このページの主役の値です。 |
| \(n\) | エヌ | ある定尺1本から取る部材の本数。number(数)の頭文字です。端材の式で、切り代を何回分引くかに使います。 |
| \(w\) | ダブリュー | 定尺1本の端材(使わずに余る長さ・mm)。waste(余り・無駄)の頭文字です。 |
| \(B_{\min}\) | ビーミン | 理論上の最小本数(下限)。\(\lceil \sum_i q_i (l_i + k) \div (L + k) \rceil\) で求め、まとめ取りの本数 \(B\) がこれと一致すれば最適です。min は minimum(最小)の略です。 |
| \(\Delta\) | デルタ | 節約できる本数。\(B_{\text{別}} - B\) です。ギリシャ文字のデルタは「差」を表すのによく使われます(difference の頭文字 d に対応する文字)。 |
| \(u\) | ユー | 定尺1本あたりの単価(円)。unit price(単価)の頭文字です。 |
| \(T\) | ティー | 概算費用(円)。total(合計)の頭文字です。木材本体のみで、カット代・送料は含みません。 |
| \(\lfloor x \rfloor\) | 床関数(ゆかかんすう) | 小数点以下を切り捨てて整数にする記号。(例:\(\lfloor 2.27 \rfloor = 2\)、\(\lfloor 3 \rfloor = 3\))取れる本数は「入りきらない分を切り捨てる」ので、この記号を使います。 |
| \(\lceil x \rceil\) | 天井関数(てんじょうかんすう) | 小数点以下を切り上げて整数にする記号。(例:\(\lceil 2.76 \rceil = 3\)、\(\lceil 2 \rceil = 2\))買う本数は「足りない分を1本増やす」ので、この記号を使います。 |
| \(\sum\) | シグマ | 「全部足す」ことを表す記号。\(\sum_i q_i (l_i + k)\) なら、部材の種類 \(i\) ごとに \(q_i (l_i + k)\) を計算して全部足します。ギリシャ文字のシグマで、Sum(合計)の頭文字 S にあたる文字です。 |
用語
| 定尺 | ていじゃく | 木材・鋼材・パイプなどが決まった長さで売られている、その標準の長さ。日本の木材は尺(しゃく・1尺=303mm)を基準にした1820mm(6尺)・3640mm(12尺)・4000mmなどが一般的で、2×4材やSPF材の1820mmはホームセンターの定番です。 |
| 切り代 | きりしろ | 鋸で切るときに刃の厚みの分だけ木材が削れて失われる長さ。丸鋸の刃厚は1.5〜2mm程度のものが多く、切り口の欠けや墨線(切る位置の印)の分も見て3mm前後で見積もるのが一般的です。お使いの刃の厚み(刃に刻印された kerf の値)がわかればその値を入れてください。切る回数の分だけ積み重なるので、短い部材をたくさん取るときほど効いてきます。 |
| 板取り | いたどり | 材料(板・角材・定尺)から必要な部材をどう切り出すかを決める作業。木取り(きどり)とも呼びます。このページは「長さだけ」を考える1次元の板取りで、合板から縦横に切り出す2次元の板取りは扱いません。 |
| 端材 | はざい | 部材を切り出した後に余る材料。定尺の端に残る短い切れ端のことです。端材が少ないほど材料の無駄が少なく、歩留まりが高くなります。 |
| まとめ取り | まとめどり | 「脚用」「幕板用」と定尺を分けずに、1本の定尺の余りに別の種類の部材も詰めて取る方法。部材の種類ごとに買うより本数を減らせることが多く、このページの割り付け表がその取り方を示します。 |
| First Fit Decreasing (FFD) |
ファースト・フィット・ディクリージング | 「大きい順(Decreasing)に、最初に入る所(First Fit)へ詰める」という割り付けの手順。荷物を箱に詰める問題(ビンパッキング問題)の代表的な近似の方法で、このページのまとめ取りに使っています。簡単な手順のわりに結果がよく、最少の本数の約1.22倍+1本以内に収まることが証明されていますが、常に最少になるとは限りません。この計算機は、この手順の本数が下限に届かないとき、合計60本以下なら分枝限定法で最少の割り付けを探索します。 |
| ビンパッキング問題 | ビンパッキングもんだい | 大きさの決まった箱(ビン)にいろいろな大きさの荷物を詰めるとき、箱の数を最も少なくする詰め方を求める問題。木材の板取り(定尺=箱、部材=荷物)はその1次元版です。荷物が多いと最適な詰め方を求める計算量が急激に増えるため、実務では手順の決まった近似の方法(FFDなど)がよく使われます。 |
| 分枝限定法 | ぶんしげんていほう | 考えられる組み合わせを枝分かれさせて順に試しながら、「この先をどう進めても今までの最良より良くならない」とわかった枝は途中で切り捨てる(限定する)ことで、全部を試さずに最適解を見つける探索の方法。このページでは、定尺1本ごとの詰め方を枝にし、「使った本数+残りの部材から計算した下限」が今までの最良以上になった枝を切り捨てて、最も少ない本数の割り付けを求めています。 |
| 歩留まり | ぶどまり | 材料のうち、製品(部材)として使えた割合。このページでは「部材の合計長さ ÷ 買う定尺の合計長さ」で、端材と切り代が少ないほど100%に近づきます。 |
| 下限 | かげん | 「どんなに工夫してもこれより小さくはならない」という値。このページの理論上の最小本数は下限で、割り付けの本数がこれと一致すれば最適だとわかります。一致しないときも、必ず下限まで減らせるとは限りません(1000mm×3本を1820mmから取る例では下限2本・実際は3本)。 |
| 最適解 | さいてきかい | 考えられるすべての方法の中で最もよい答え。このページでは「定尺の本数が最も少ない割り付け」のことです。まとめ取りの本数が下限と一致すれば最適解です。一致しなくても、組み合わせをすべて探索して「これ以上減らない」と確かめられれば最適解です。 |
| 尺 | しゃく | 日本の伝統的な長さの単位で、1尺=約303mm。木材の定尺の1820mm(6尺)・910mm(3尺)・3640mm(12尺)はこの尺の倍数です。6尺=1820mmは「1間(いっけん)」とも呼びます。 |
| 2×4材 | ツーバイフォーざい | 断面が約38mm×89mmの規格材で、ホームセンターで最も手に入りやすいDIY用の木材。長さは1820mm(6尺)が定番で、910mm・2440mm(8尺)・3650mmなども売られています。 |
前提として理解しておくといいこと
このページの計算を「意味がわかって」使えるようになるために、前提として理解しておくといいことをまとめました。
| 割り算と余り(小学3〜4年) |
|
| 概数・端数処理(小学4年) |
|
| 小数の割り算(小学5年) |
|
| 文字を使った式と不等式(中学1年) |
|
| 割合と百分率(小学5年) |
|
Excelで計算する方法
| 定尺の長さ(mm) | 1820 |
| 部材の長さ(mm) | 800 |
| 切り代(mm) | 3 |
| 1本の定尺から取れる本数 | =INT((B1+B3)/(B2+B3)) |
| 部材の必要本数 | 4 |
| 1本の定尺から取れる本数 | 2 |
| 必要な定尺の本数 | =ROUNDUP(B1/B2,0) |
| 定尺の長さ(mm) | 1820 |
| その定尺から取る部材の長さの合計(mm) | 1800 |
| その定尺から取る本数 | 4 |
| 切り代(mm) | 3 |
| 端材(mm) | =MAX(0,B1-B2-B3*B4) |
| すべての部材の(長さ+切り代)の合計(mm) | 5024 |
| 定尺の長さ+切り代(mm) | 1823 |
| 理論上の最小本数 | =ROUNDUP(B1/B2,0) |
| 別々に買う場合の本数 | 4 |
| まとめ取りの本数 | 3 |
| 定尺の単価(円) | 980 |
| 節約できる本数 | =B1-B2 |
| 概算費用(円) | =B3*B2 |
「INT(値)」は小数点以下を切り捨てて整数にする関数(式の ⌊ ⌋)、「ROUNDUP(値, 0)」は切り上げる関数(式の ⌈ ⌉)です。
1つ目の表のB4は2本、2つ目の表のB3は2本、3つ目の表のB5は8mm、4つ目の表のB3は3本、5つ目の表は節約1本・費用2,940円になります。
「長い部材から順に詰める」割り付けそのものは、部材を長さの大きい順に並べ替えて上から順に定尺に当てはめていく手作業になるため、表計算では「取れる本数」「端材」「下限」の確認に使い、割り付け表はこのページか下のPythonコードで作るのが確実です。
Googleスプレッドシートで計算する方法
| 定尺の長さ(mm) | 1820 |
| 部材の長さ(mm) | 800 |
| 切り代(mm) | 3 |
| 1本の定尺から取れる本数 | =INT((B1+B3)/(B2+B3)) |
| 部材の必要本数 | 4 |
| 1本の定尺から取れる本数 | 2 |
| 必要な定尺の本数 | =ROUNDUP(B1/B2,0) |
| 定尺の長さ(mm) | 1820 |
| その定尺から取る部材の長さの合計(mm) | 1800 |
| その定尺から取る本数 | 4 |
| 切り代(mm) | 3 |
| 端材(mm) | =MAX(0,B1-B2-B3*B4) |
| すべての部材の(長さ+切り代)の合計(mm) | 5024 |
| 定尺の長さ+切り代(mm) | 1823 |
| 理論上の最小本数 | =ROUNDUP(B1/B2,0) |
| 別々に買う場合の本数 | 4 |
| まとめ取りの本数 | 3 |
| 定尺の単価(円) | 980 |
| 節約できる本数 | =B1-B2 |
| 概算費用(円) | =B3*B2 |
Pythonで計算する方法
import math
stock_length = 1820 # 定尺の長さ(mm)
kerf = 3 # 切り代(鋸の刃厚・mm)
unit_price = 980 # 定尺1本の単価(円)
# 必要な部材:(名前, 長さmm, 本数)
parts = [("脚", 800, 4), ("幕板", 500, 2), ("貫", 400, 2)]
# 部材ごとに別々に買う場合の本数(1本の定尺から取れる本数で割って切り上げ)
stocks_separate = 0
for name, length, qty in parts:
per_stock = (stock_length + kerf) // (length + kerf) # 切り捨て(式の ⌊ ⌋)
stocks_separate += math.ceil(qty / per_stock) # 切り上げ(式の ⌈ ⌉)
# まとめ取り:長い部材から順に、最初に入る定尺へ詰める(First Fit Decreasing)
items = sorted([(length, name) for name, length, qty in parts for _ in range(qty)], key=lambda t: -t[0])
stocks = [] # 定尺ごとに {"parts": [...], "remaining": 残りの長さ}
for length, name in items:
for stock in stocks:
if length <= stock["remaining"]:
stock["parts"].append((name, length))
stock["remaining"] = max(0, stock["remaining"] - length - kerf)
break
else:
stocks.append({"parts": [(name, length)], "remaining": max(0, stock_length - length - kerf)})
# 理論上の最小本数(下限)
lower_bound = math.ceil(sum(qty * (length + kerf) for name, length, qty in parts) / (stock_length + kerf))
print(f"部材ごとに別々に買う場合: {stocks_separate} 本")
print(f"まとめ取り: {len(stocks)} 本(理論上の最小本数 {lower_bound} 本)")
for i, stock in enumerate(stocks, 1):
names = " + ".join(f"{name}{length}" for name, length in stock["parts"])
print(f" 定尺{i}本目: {names} 端材 {stock['remaining']} mm")
print(f"節約できる本数: {stocks_separate - len(stocks)} 本")
print(f"概算費用: {unit_price * len(stocks)} 円")
数式記述言語(LaTeX等)での書き方(コピペ可)
m = ⌊(L + k) ÷ (l + k)⌋
m = \left\lfloor \frac{L + k}{l + k} \right\rfloor
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<mi>m</mi>
<mo>=</mo>
<mo>⌊</mo>
<mfrac>
<mrow><mi>L</mi><mo>+</mo><mi>k</mi></mrow>
<mrow><mi>l</mi><mo>+</mo><mi>k</mi></mrow>
</mfrac>
<mo>⌋</mo>
</mrow>
</math>
m = |__ (L + k) / (l + k) __|
Floor[(L + k)/(l + k)]
m := floor((L + k)/(l + k));
m = floor((L + k)/(l + k));
m = ⌊(L + k)/(l + k)⌋
Bᵢ = ⌈qᵢ ÷ mᵢ⌉, B別 = B₁ + B₂ + …
B_i = \left\lceil \frac{q_i}{m_i} \right\rceil,\quad B_{\text{別}} = \sum_i B_i
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<msub><mi>B</mi><mi>i</mi></msub>
<mo>=</mo>
<mo>⌈</mo>
<mfrac><msub><mi>q</mi><mi>i</mi></msub><msub><mi>m</mi><mi>i</mi></msub></mfrac>
<mo>⌉</mo>
<mo>,</mo>
<msub><mi>B</mi><mtext>別</mtext></msub>
<mo>=</mo>
<munder><mo>∑</mo><mi>i</mi></munder>
<msub><mi>B</mi><mi>i</mi></msub>
</mrow>
</math>
B_i = |~ q_i / m_i ~|, B_"別" = sum_i B_i
Total[Ceiling[q/m]]
B := add(ceil(q[i]/m[i]), i = 1 .. n);
B = sum(ceil(q ./ m));
B_i = ⌈q_i/m_i⌉, B_別 = ∑_i B_i
w = L − (l₁ + l₂ + … + lₙ) − n × k
w = L - \sum_{j=1}^{n} l_j - n k
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<mi>w</mi>
<mo>=</mo>
<mi>L</mi>
<mo>−</mo>
<munderover><mo>∑</mo><mrow><mi>j</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover>
<msub><mi>l</mi><mi>j</mi></msub>
<mo>−</mo>
<mi>n</mi><mo>⁢</mo><mi>k</mi>
</mrow>
</math>
w = L - sum_(j=1)^n l_j - n k
L - Total[l] - Length[l]*k
w := L - add(l[j], j = 1 .. n) - n*k;
w = L - sum(l) - numel(l)*k;
w = L − ∑_(j=1)^n l_j − nk
Bmin = ⌈Σ qᵢ(lᵢ + k) ÷ (L + k)⌉
B_{\min} = \left\lceil \frac{\sum_i q_i (l_i + k)}{L + k} \right\rceil
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<msub><mi>B</mi><mi>min</mi></msub>
<mo>=</mo>
<mo>⌈</mo>
<mfrac>
<mrow><munder><mo>∑</mo><mi>i</mi></munder><msub><mi>q</mi><mi>i</mi></msub><mo>(</mo><msub><mi>l</mi><mi>i</mi></msub><mo>+</mo><mi>k</mi><mo>)</mo></mrow>
<mrow><mi>L</mi><mo>+</mo><mi>k</mi></mrow>
</mfrac>
<mo>⌉</mo>
</mrow>
</math>
B_min = |~ (sum_i q_i (l_i + k)) / (L + k) ~|
Ceiling[Total[q*(l + k)]/(L + k)]
Bmin := ceil(add(q[i]*(l[i] + k), i = 1 .. n)/(L + k));
Bmin = ceil(sum(q .* (l + k))/(L + k));
B_min = ⌈(∑_i q_i (l_i + k))/(L + k)⌉
Δ = B別 − B, T = u × B
\Delta = B_{\text{別}} - B,\quad T = u \times B
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<mi>Δ</mi>
<mo>=</mo>
<msub><mi>B</mi><mtext>別</mtext></msub>
<mo>−</mo>
<mi>B</mi>
<mo>,</mo>
<mi>T</mi>
<mo>=</mo>
<mi>u</mi>
<mo>×</mo>
<mi>B</mi>
</mrow>
</math>
Delta = B_"別" - B, T = u * B
{bSep - b, u*b}
Delta := Bsep - B; T := u*B;
Delta = Bsep - B; T = u*B;
Δ = B_別 − B, T = u × B
ChatGPT に聞いて計算してもらう方法
あなたは木工の板取り(木取り)の計算アシスタントです。次の計算を、必ずPythonコードを実際に実行して行い、実行結果の数値だけを根拠に回答してください(暗算や推測で答えないでください)。 定尺1820mmの木材から、切り代3mmで、脚800mm×4本・幕板500mm×2本・貫400mm×2本を切り出します。 次の値をそれぞれ求めてください。 1. 部材ごとに、1本の定尺から取れる本数((1820+3)÷(部材の長さ+3) の切り捨て) 2. 部材ごとに別々の定尺から取る場合の定尺の合計本数(必要本数÷取れる本数の切り上げの合計) 3. 長い部材から順に「最初に入る定尺へ詰める」(First Fit Decreasing)で割り付けたときの定尺の本数と、定尺ごとの部材の内訳と端材(部材を入れるたびに残りは「長さ+切り代」だけ減るものとします) 4. 理論上の最小本数(全部材の(長さ+切り代)の合計を 1820+3 で割った切り上げ) 計算に使ったコードと、実行結果の数値を示してください。
計算ドリル(演習問題)
このページの式を、自分の手で計算できるようになるための演習問題です。
答えと解説は解答ページにあります。
使い方
-
1数値を入力計算したい数値を入力欄に入力します
-
2計算「計算する」ボタンを押します
-
3結果を確認計算結果がその場に表示されます。計算の考え方や式の解説も同じページで確認できます
DataChefの特徴
専門知識不要、直感的で簡単な操作
個人情報を登録することなく使用できます
「ダウンロード」押下でファイルを自動削除
クレジット表記不要
商用利用許諾の連絡も不要です
