2. 实验计划的形式化建模

实验计划自动生成系统的核心难点,不在于“排出一张表”,而在于把实验意图翻译成机器可计算、可校验、可优化的形式化模型。如果实验对象、因素、水平、响应指标、约束条件和目标函数各自为政,后续的调度算法、冲突检测和方案评估就无从谈起。本节要解决的就是:如何用一套统一的表示方法,把实验计划从自然语言描述转化为结构化模型。

一、为什么需要统一表示

假设一位实验员说:“我想测试三种催化剂在不同温度和压力下对产率的影响,温度不能超过催化剂的分解点,压力受设备耐压限制,希望用尽量少的实验找到最高产率。”这句话里已经隐含了六类信息:实验对象是催化反应体系,因素是催化剂种类、温度、压力,水平是催化剂三种、温度若干档、压力若干档,响应指标是产率,约束是分解点和耐压上限,目标是产率最大化且实验次数尽量少。若不做形式化,自动生成系统只能靠人工逐条录入,既易遗漏,也无法判断两个实验是否冲突。

统一表示的价值在于:让实验计划成为可被算法直接操作的数据结构。因素、水平、约束、目标一旦被编码为统一字段,系统就能自动枚举可行组合、检测资源冲突、计算目标函数值,并输出排序后的实验方案。

二、六元组模型

推荐用六元组 EP = (O, F, L, R, C, G) 表示一个实验计划。其中 O 为实验对象,F 为因素集合,L 为水平集合,R 为响应指标集合,C 为约束条件集合,G 为目标函数。六者不是并列的六个列表,而是通过引用关系耦合在一起:因素属于对象,水平属于因素,响应指标由对象和因素共同决定,约束作用于因素取值或响应范围,目标函数则建立在响应指标之上。

以催化实验为例,对象可表示为 O = {id: "cat_reactor_01", type: "催化反应器", capacity: 1};因素集合 F = {f1: 催化剂种类, f2: 温度, f3: 压力};水平集合 L = {f1: [A, B, C], f2: [80, 100, 120, 140], f3: [1.0, 1.5, 2.0]};响应指标 R = {r1: 产率(%), r2: 选择性(%)};约束 C = {c1: 温度 ≤ 分解点(f1), c2: 压力 ≤ 2.5 MPa, c3: 同一时段仅能运行一个实验};目标 G = max(产率) 且 min(实验次数)。

实验计划六元组统一表示模型 EP = (O, F, L, R, C, G) O 实验对象 催化反应器 / 设备 / 样本 id · type · capacity F 因素集合 催化剂种类 · 温度 · 压力 f1 · f2 · f3 L 水平集合 A/B/C · 80~140 · 1.0~2.0 离散 / 连续取值 属于 取值域 R 响应指标 产率(%) · 选择性(%) r1 · r2 C 约束条件 温度≤分解点 · 压力≤2.5MPa c1 · c2 · c3 G 目标函数 max 产率 · min 实验次数 多目标加权 影响 限制 优化对象 可行域 实例化:催化实验计划 O: cat_reactor_01 催化反应器 F: 种类/温度/压力 3 因素 L: 3×4×3 36 组合 R: 产率/选择性 2 指标 C: 分解点/耐压 3 约束 G: max产率 min次数 可行组合筛选 → 目标排序 → 实验序列 自动生成输出

三、因素与水平的编码方式

因素分为定性因素和定量因素。定性因素如催化剂种类,水平是离散标签集合;定量因素如温度、压力,水平可以是离散档位,也可以是连续区间。统一表示时,建议为每个因素定义 type 字段(categorical / continuous)、levels 字段(离散取值列表或连续区间上下界)、unit 字段(单位)。例如温度可编码为 {name:"温度", type:"continuous", range:[80,140], unit:"℃", step:20},表示从 80 到 140、步长 20 的连续因素。这样系统在生成实验点时,既能处理离散枚举,也能处理连续采样。

水平编码还要考虑可执行性。如果某台设备只能设定整数温度,那么 step 必须与设备能力一致;如果催化剂只有三种市售规格,水平集合就不能随意扩展。形式化模型必须把“物理上可实现的取值”与“逻辑上想考察的取值”区分开,前者进入约束,后者进入水平集合。

四、约束条件的分类与表达

约束是实验计划可行性的边界。按作用对象可分为三类:因素取值约束(如温度 ≤ 催化剂分解点)、因素间耦合约束(如压力与温度不能同时取最高档)、资源与时间约束(如同一设备同一时段只能执行一个实验)。统一表示时,每条约束应包含 id、scope(作用域)、expression(表达式)、type(硬约束/软约束)。硬约束一旦违反,方案直接淘汰;软约束违反时扣减目标函数得分。

以“温度 ≤ 分解点”为例,可写成 {id:"c1", scope:["f2","f1"], expr:"f2.value <= decomp_point(f1.value)", type:"hard"}。系统在枚举组合时,对每个候选点代入表达式求值,不满足则剔除。资源约束则通常表达为时间区间不重叠:{id:"c3", scope:["schedule"], expr:"no_overlap(device_id, time_window)", type:"hard"}。

五、响应指标与目标函数的衔接

响应指标是实验的“输出变量”,目标函数是这些输出变量的评价函数。一个实验计划可能有多个响应指标,如产率和选择性,二者可能同向也可能冲突。统一表示时,目标函数应写成 G = w1·norm(r1) + w2·norm(r2) - w3·cost 的形式,其中 w 为权重,norm 为归一化函数,cost 可表示实验次数、时间或物料消耗。权重由实验者根据优先级设定,系统据此对可行方案排序。

需要强调的是,目标函数不是简单的“越大越好”。在多指标场景下,应明确是加权求和、分层优化还是帕累托前沿。例如产率优先、选择性次之,可写成字典序目标:先按产率降序,产率相同再按选择性降序。这种表达方式比单一权重更贴近实际决策逻辑。

六、从模型到可执行计划

六元组模型建立后,自动生成流程通常分三步:第一步,根据因素和水平枚举全部组合,得到候选集;第二步,代入硬约束逐条过滤,得到可行集;第三步,对可行集计算目标函数值并排序,结合资源约束生成时间序列。以催化实验为例,3×4×3 共 36 个组合,若温度约束剔除 8 个、压力约束剔除 4 个、耦合约束再剔除 3 个,可行集为 21 个;按产率目标排序后,取前 10 个进入实验排程,即可在有限资源下优先验证高潜力条件。

建模检查清单:① 每个因素是否有明确的类型、单位和取值域?② 每条约束是否标注了硬/软属性?③ 响应指标是否可量化、可观测?④ 目标函数是否明确了权重或优先级?⑤ 实验对象的能力边界(容量、精度、时段)是否已进入约束?五项齐备,六元组模型才算完整。

统一表示方法的最终检验标准是:把模型交给一个不了解实验背景的调度程序,它能否在不追问的情况下枚举出可行方案并给出排序。如果能,说明形式化建模已经到位;如果不能,说明还有隐含信息未被编码,需要回到六元组中补齐。