請輸入定尺長度、鋸路,以及需要的零件長度和支數(零件最多 8 種,長度留空的列會略過)。定尺單價可以留空。
這個頁面可以做什麼
- 只要輸入定尺長度(6 尺 1820 mm、8 尺 2430 mm、12 尺 3640 mm 等)和需要的零件長度、支數(最多 8 種),馬上就知道要買幾支定尺
- 計算時會算入鋸路(鋸片的厚度,預設 3 mm),不會漏掉「把 1820 mm 四等分成 455 mm × 4 支,其實一支只能切出 3 支」這類陷阱
- 以從長零件開始依序排入的配置方式(First Fit Decreasing)為基礎,零件合計 60 支以下時,還會搜尋「支數最少的組合」,並顯示「第 1 支定尺:桌腳 × 2,剩料 214 mm」這樣的取料配置表,以及每支定尺的橫條圖
- 同時列出每種零件各用不同定尺裁切時的簡單計算支數,讓您看出合併裁切能省幾支。也會和理論上的最少支數(下限)比較,顯示配置是最佳(無法再減少)還是近似
- 輸入定尺單價(選填),也會算出概算費用和省下的金額。公式的淺顯解說,以及 Excel、Google 試算表、Python 可直接複製的公式,也都整理在這個頁面
這個計算有什麼用?
例如用 1820 mm 的角材做桌腳 800 mm × 4 支、牙板 500 mm × 2 支、橫撐 400 mm × 2 支的小桌子,依零件分開購買要定尺 4 支,但用由長到短排入的合併裁切只要 3 支(第 1 支:桌腳 × 2,第 2 支:桌腳 × 2,第 3 支:牙板 × 2+橫撐 × 2,剩料 8 mm)。
採買前先算好支數,就能減少不夠又要再跑一趟、或買太多沒地方放的失誤。請木材行或居家修繕賣場代客裁切時,有取料配置表也能一次交代清楚。
像木棧板平台的龍骨、圍籬的橫料這種「要用很多支相同長度零件」的工程,鋸路的累積會影響支數。例如從 1820 mm 的定尺切 455 mm 的橫料,不計鋸路剛好 4 支,但鋸路 3 mm 時 \(4 \times 455 + 3 \times 3 = 1829\) mm,第 4 支差 9 mm,一支只能切 3 支。需要 40 支時,定尺不是 10 支,而是 \(\lceil 40 \div 3 \rceil = 14\) 支。
只要把長度從 455 mm 改成 450 mm 就能切 4 支、只需 10 支,所以在設計階段先確認「是不是一支定尺能切幾支的長度」,能大幅省下材料費。
PVC 水管(每支 4 m 的定尺)、電線管、鋁擠型、窗簾軌道等「以固定長度販售、裁切後使用的東西」,都能用和木材相同的公式計算。例如從 4000 mm 的 PVC 管切 1200 mm × 5 支、950 mm × 3 支、300 mm × 1 支,合併裁切要 3 支(分開購買要 4 支)。
不過用切管器切時鋸路幾乎是 0,用鋼鋸則約 1~2 mm,會因工具而不同,請依工具調整鋸路欄。
工廠的材料費占成本很大的比例,所以會把「材料中有多少做成了成品」當作材料利用率(良率)來管理。本頁的「材料利用率」是零件合計長度除以購買的定尺合計長度,剩料和鋸路越少越接近 100%。
實際的工廠要把數百種零件配置到數千支材料上,所以會使用專門解這個「裝箱問題」的軟體。由長到短排入的 First Fit Decreasing,在這類軟體中也是做出初步方案的經典方法。
踢腳板(牆和地板交界的板條)、天花板線板(牆和天花板交界)常以 8 尺、12 尺等定尺販售,再配合各面牆的長度裁切。例如牆長 3600 mm、2700 mm、3600 mm、2700 mm(扣除門窗)的房間,用 3640 mm(12 尺)定尺的踢腳板繞一圈,3600 mm 的牆剛好放得下,但 2700 mm 的料剩下的 937 mm 什麼都放不進去,所以合併裁切也要 4 支。
像這樣「一面牆的長度」超過定尺的一半時,支數就無法減少,可以先考慮是否允許接縫,或改用其他長度的定尺。
公式與圖示
符號與用語解說
符號
| \(L\) | 定尺長度(mm),也就是買回來的一支木材的長度。取自 Length(長度)的字首,為了和零件長度 \(l\) 區分而用大寫。 |
| \(l\)、\(l_i\) | 零件(要切出的材料)的長度(mm)。\(l_i\) 的 \(i\) 是「第 \(i\) 種零件」的編號(因為有桌腳、牙板、橫撐等多種零件)。 |
| \(k\) | 鋸路(鋸片的厚度,mm)。每切一次,木材就會被削掉這麼多而變短。取自 kerf(英文的「鋸路」)的字首。 |
| \(m\)、\(m_i\) | 一支定尺能切出的零件支數。用 \(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\) | 從某一支定尺切出的零件支數。取自 number(數)的字首。在剩料的公式中,用來決定要扣幾次鋸路。 |
| \(w\) | 一支定尺的剩料(沒用到而剩下的長度,mm)。取自 waste(剩餘、浪費)的字首。 |
| \(B_{\min}\) | 理論上的最少支數(下限)。用 \(\lceil \sum_i q_i (l_i + k) \div (L + k) \rceil\) 求出,合併裁切的支數 \(B\) 和它一致就是最佳。min 是 minimum(最小)的縮寫。 |
| \(\Delta\) | 可省下的支數,也就是 \(B_{\text{分}} - B\)。希臘字母 delta 常用來表示「差」(對應 difference 的字首 d)。 |
| \(u\) | 每支定尺的單價(元)。取自 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\))要買的支數要「不夠的部分多買一支」,所以用這個符號。 |
| \(\sum\) | 表示「全部加起來」的符號。\(\sum_i q_i (l_i + k)\) 就是對每種零件 \(i\) 計算 \(q_i (l_i + k)\) 再全部相加。希臘字母 sigma,相當於 Sum(合計)的字首 S。 |
用語
| 定尺 | 木材、鋼材、管材等以固定長度販售時的標準長度。台灣的角材多以台尺計長,3 尺(910 mm)、4 尺(1210 mm)、6 尺(1820 mm)、8 尺(2430 mm)、12 尺(3640 mm)等都很常見。 |
| 鋸路 | 用鋸子切割時,被鋸片厚度削掉而損失的長度。圓鋸片的厚度多在 1.5~2 mm 左右,再考慮切口崩邊和畫線(標示切割位置的記號)的寬度,一般以 3 mm 左右估算。知道所用鋸片的厚度(鋸片上標示的 kerf 值)時,請輸入那個值。切幾次就累積幾次,所以切越多短零件影響越大。 |
| 取料 | 決定要如何從材料(板材、角材、定尺)切出所需零件的作業,也稱下料、裁料規劃。本頁只考慮「長度」的一維取料,不處理從夾板縱橫裁切的二維取料。 |
| 剩料 | 切出零件後剩下的材料,也就是留在定尺尾端的短料頭。剩料越少,材料浪費越少,材料利用率越高。 |
| 合併裁切 | 不把定尺分成「桌腳用」「牙板用」,而是把其他種類的零件也塞進一支定尺的剩餘部分一起切的方法。常比依零件種類分開購買更省支數,本頁的取料配置表就是顯示這種切法。 |
| First Fit Decreasing (FFD) |
「由大到小(Decreasing),放進第一個放得下的地方(First Fit)」的配置步驟,中文稱「遞減首次適配法」。是把物品裝進箱子的問題(裝箱問題)中代表性的近似方法,本頁的合併裁切就是用它。步驟簡單、結果也好,已證明支數不會超過最少支數的約 1.22 倍再加 1 支,但不一定總是最少。這個計算機在步驟所得支數達不到下限時,若合計 60 支以下,會用分支定界法搜尋最少的配置。 |
| 裝箱問題 | 把各種大小的物品裝進大小固定的箱子時,求出讓箱子數量最少的裝法的問題(bin packing problem)。木材的取料(定尺=箱子,零件=物品)就是它的一維版本。物品一多,求最佳裝法的計算量會急遽增加,所以實務上常用步驟固定的近似方法(FFD 等)。 |
| 分支定界法 | 把可能的組合分支依序嘗試,一旦知道「這條分支再怎麼走都不會比目前最好的更好」就中途剪掉(定界),不必全部試完就能找到最佳解的搜尋方法。本頁把每支定尺的放法當作分支,剪掉「已用支數+由剩下零件算出的下限」大於或等於目前最佳的分支,求出支數最少的配置。 |
| 材料利用率 | 材料中能做成成品(零件)的比例,工廠也稱「良率」「出材率」。本頁是「零件合計長度 ÷ 購買的定尺合計長度」,剩料和鋸路越少越接近 100%。 |
| 下限 | 「再怎麼下工夫也不會比這更小」的值。本頁理論上的最少支數就是下限,配置的支數和它一致就知道是最佳。不一致時,也不一定能減到下限(從 1820 mm 切 1000 mm × 3 支的例子,下限 2 支,實際需要 3 支)。 |
| 最佳解 | 所有可能方法中最好的答案。本頁指的是「定尺支數最少的配置」。合併裁切的支數和下限一致就是最佳解;即使不一致,只要搜尋所有組合確認「無法再減少」,也是最佳解。 |
| 台尺 | 台灣木工、室內裝修常用的長度單位,1 台尺 = 10/33 m ≈ 30.3 cm(和日本的尺相同),1 台尺 = 10 台寸。角材的 6 尺(約 182 cm)、8 尺(約 243 cm)、12 尺(約 364 cm),夾板的 4 × 8 尺等,都是用台尺表示。 |
| 角材 | 斷面為長方形或正方形的細長木料,台灣裝潢、木工 DIY 最常用的材料。常見斷面為 1.2 吋 × 1 吋(約 3.3 × 2.7 cm)和 1.8 吋 × 1 吋(約 5.1 × 2.7 cm),長度有 3、4、6、7、8、12 尺等,材種有柳安、雲杉、松木、集成材等。 |
建議先了解的基礎知識
為了能「理解意義」地使用本頁的計算,整理了建議先了解的基礎知識。
| 除法與餘數(國小中年級,8~10 歲) |
|
| 概數(國小中年級,8~10 歲) |
|
| 小數的除法(國小高年級,10~12 歲) |
|
| 代數式與不等式(國中,12~15 歲) |
|
| 比率與百分率(國小高年級,10~12 歲) |
|
用 Excel 計算的方法
| 定尺長度(mm) | 1820 |
| 零件長度(mm) | 800 |
| 鋸路(mm) | 3 |
| 一支定尺能切的支數 | =INT((B1+B3)/(B2+B3)) |
| 零件的需要支數 | 4 |
| 一支定尺能切的支數 | 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 |
| 定尺單價(元) | 100 |
| 可省下的支數 | =B1-B2 |
| 概算費用(元) | =B3*B2 |
「INT(值)」是把小數部分捨去成整數的函數(公式中的 ⌊ ⌋),「ROUNDUP(值,0)」是無條件進位的函數(公式中的 ⌈ ⌉)。
第 1 個表的 B4 是 2 支,第 2 個表的 B3 是 2 支,第 3 個表的 B5 是 8 mm,第 4 個表的 B3 是 3 支,第 5 個表是省下 1 支、費用 300 元。
「從長零件開始依序排入」的配置本身,要把零件依長度由大到小排序後由上往下套進定尺,是手工作業,所以試算表適合用來確認「能切的支數」「剩料」「下限」,取料配置表用本頁或下方的 Python 程式碼製作比較確實。
用 Google 試算表計算的方法
| 定尺長度(mm) | 1820 |
| 零件長度(mm) | 800 |
| 鋸路(mm) | 3 |
| 一支定尺能切的支數 | =INT((B1+B3)/(B2+B3)) |
| 零件的需要支數 | 4 |
| 一支定尺能切的支數 | 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 |
| 定尺單價(元) | 100 |
| 可省下的支數 | =B1-B2 |
| 概算費用(元) | =B3*B2 |
用 Python 計算的方法
import math
stock_length = 1820 # 定尺長度(mm)
kerf = 3 # 鋸路(鋸片厚度,mm)
unit_price = 100 # 每支定尺的單價(元)
# 需要的零件:(名稱, 長度mm, 支數)
parts = [("桌腳", 800, 4), ("牙板", 500, 2), ("橫撐", 400, 2)]
# 每種零件分開購買時的支數(除以一支定尺能切的支數後無條件進位)
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 程式碼來進行下列計算,並只以執行結果的數值作為回答的依據(不要用心算或推測回答)。 從定尺 1820 mm 的木材,以鋸路 3 mm,切出桌腳 800 mm × 4 支、牙板 500 mm × 2 支、橫撐 400 mm × 2 支。 請分別求出下列各值: 1. 每種零件從一支定尺能切出的支數((1820+3) ÷(零件長度+3)無條件捨去) 2. 每種零件各用不同定尺裁切時,定尺的合計支數(需要支數÷能切的支數 無條件進位後加總) 3. 由長到短「放進第一支放得下的定尺」(First Fit Decreasing)配置時的定尺支數,以及每支定尺的零件明細和剩料(每放入一支零件,剩餘長度就減少「長度+鋸路」) 4. 理論上的最少支數(所有零件(長度+鋸路)的合計除以 1820+3 後無條件進位) 請列出計算使用的程式碼和執行結果的數值。
使用方法
-
1輸入數值在輸入欄中輸入要計算的數值
-
2計算按下「計算」按鈕
-
3查看結果計算結果會立即顯示。計算的思路和公式的解說,也都能在同一個頁面查看
DataChef 的特色
不需專業知識,操作直覺又簡單
無須登錄任何個人資料
按下「下載」後自動刪除檔案
無須標註來源出處
亦無須事先取得商用授權