2. 助剂配方正交试验方案表生成与随机化

从 L9(3⁴) 表到可执行试验单

例1 已确定 3 个助剂因素(A 分散剂、B 增稠剂、C 消泡剂)各取 3 水平,并选用 L9(3⁴) 正交表,第 4 列为空列。本例的任务是把这张标准表转换成一张可直接下发给实验员的试验方案表,并完成试验号的随机化排序,同时把随机化种子记录下来,保证任何人用同一种子都能复现同一顺序。

L9(3⁴) 的标准表共 9 行,每行是一个试验号,每列的数字 1/2/3 代表该因素取第几水平。生成方案表的关键动作是列映射:把 A、B、C 分别绑定到第 1、2、3 列,第 4 列留空。空列不参与配方,但它在后续极差分析中可用于估计误差,因此方案表里要保留它,不能删掉。

L9(3⁴) 列映射 → 随机化 → 试验方案表 标准 L9(3⁴) 表 试验号 列1 列2 列3 列4 11111 21222 31333 42123 52231 62312 73132 83213 93321 列4 为空列,保留用于误差估计 列1 → 因素 A 列2 → 因素 B 列3 → 因素 C 列4 → 空列 随机化排序(种子 seed = 20240517) 执行序 原试验号 A B C 空列 173132 231333 393321 411111 552231 621222 783213 842123 962312 执行序 ≠ 试验号,配方内容不变,仅改变操作先后 随机化只重排执行顺序,不改变每个试验号的 A/B/C 水平组合;种子必须与方案表一同归档,否则顺序不可复现。 若中途补做某号试验,应记录补做日期与原因,不得悄悄插回原顺序。

方案表应包含的字段

一张合格的助剂配方正交试验方案表,除了 A/B/C 三列水平编码,还应带上水平对应的实际用量,否则实验员无法直接称量。建议字段如下:执行序、原试验号、A 编码、A 用量、B 编码、B 用量、C 编码、C 用量、空列、备注。水平编码与用量的对应关系来自例1 的水平表,本例直接沿用。

因素水平1水平2水平3
A 分散剂 / %0.51.01.5
B 增稠剂 / %0.20.40.6
C 消泡剂 / %0.050.100.15

用固定种子完成随机化

随机化必须可复现,因此不能靠“随手打乱”。下面用 Python 标准库 random.Random(seed) 生成排列,种子固定为 20240517。代码自包含,直接运行即可输出完整方案表。

import random

# 1) 标准 L9(3^4) 表:每行 = [列1, 列2, 列3, 列4]
L9 = [
    [1, 1, 1, 1],
    [1, 2, 2, 2],
    [1, 3, 3, 3],
    [2, 1, 2, 3],
    [2, 2, 3, 1],
    [2, 3, 1, 2],
    [3, 1, 3, 2],
    [3, 2, 1, 3],
    [3, 3, 2, 1],
]

# 2) 列映射:列1->A, 列2->B, 列3->C, 列4->空列
col_map = {0: "A", 1: "B", 2: "C", 3: "空列"}

# 3) 水平编码 -> 实际用量(%)
levels = {
    "A": {1: 0.5, 2: 1.0, 3: 1.5},
    "B": {1: 0.2, 2: 0.4, 3: 0.6},
    "C": {1: 0.05, 2: 0.10, 3: 0.15},
}

# 4) 固定种子随机化
SEED = 20240517
rng = random.Random(SEED)
order = list(range(9))          # 原试验号 0..8
rng.shuffle(order)              # 原地打乱,结果由 SEED 唯一决定

# 5) 输出方案表
print(f"随机化种子 seed = {SEED}")
print("执行序\t原试验号\tA编码\tA用量\tB编码\tB用量\tC编码\tC用量\t空列")
for exec_no, idx in enumerate(order, start=1):
    row = L9[idx]
    a, b, c, blank = row
    print(f"{exec_no}\t{idx+1}\t{a}\t{levels['A'][a]}\t"
          f"{b}\t{levels['B'][b]}\t{c}\t{levels['C'][c]}\t{blank}")

运行后得到的执行顺序为原试验号 7, 3, 9, 1, 5, 2, 8, 4, 6,与上方 SVG 右侧表格一致。注意:random.Random(SEED).shuffle() 在同一 Python 大版本下结果稳定;若换语言或换版本,应把生成的排列直接写入方案表存档,而不是只存种子。

随机化后的三项校验

  1. 组合完整性:9 个执行序对应的 (A,B,C) 组合必须与标准表 9 行一一对应,不重不漏。可用 set(tuple(r[:3]) for r in L9) 与方案表组合集合比对。
  2. 水平均衡性:每个因素的 1/2/3 水平各出现 3 次。随机化只换顺序,不破坏均衡,若统计结果不是 3/3/3 说明表被改错。
  3. 顺序无系统偏差:检查执行序中是否出现“同一因素同一水平连续扎堆”。本例执行序前三个为 7、3、9,A 水平依次是 3、1、3,未形成单调或成块模式,可接受。
把种子、随机化后的排列、方案表三者放在同一份记录里。复现时优先用存档排列,种子作为二次核对手段。若实验中途设备漂移需要重排,应重新生成新种子并注明“第几次随机化”,旧表保留不覆盖。
常见错误:只对试验号排序却忘了同步更新用量列,导致执行序与配方错位;或把空列当作无用列删除,后续极差分析时失去误差估计依据。方案表下发前务必逐行核对编码与用量的一致性。