优化器
Optimizer 用于自动搜索更优参数组合。你在本页定义“什么结果算更优”(目标)、“哪些输入允许被修改”(变量),以及“搜索预算和精细度”(算法参数),然后通过顶部工具栏执行 Run Optimizer。
本页负责建立优化任务,不负责解释最终结果。运行完成后,应到结果区的 Optimization Report 查看最优解、搜索历史和阶段结果。
页面职责与推荐操作顺序
进入 Optimizer 之前,通常应先满足:
Structure已通过验证。Optics已通过验证。- 若使用
Sweep,你已经理解哪些参数最敏感,知道哪些变量值得优先优化。 - 你已经明确“优化目标”是什么,而不是只想让软件随机搜索。
从工程角度,推荐按以下顺序配置:
- 先定义
Objectives,再定义Variables。 - 变量边界先给保守、物理可行的范围。
- 最后再调整算法参数。
- 先用较小预算做第一次试跑,确认方向正确后再增加预算。
如果先给变量、后想目标,最常见的问题是:你很难判断“结果不收敛”究竟是目标冲突,还是搜索空间过大。
页面结构与全局入口
当前 Optimizer 页面分为三个纵向区域:
Optimization ObjectivesOptimization VariablesAlgorithm Parameters
顶部仍使用全局工具栏:
Run Optimizer:仅当整份模型验证通过时可执行。- 运行开始后,本页输入会锁定。
- 若本页存在错误,Footer 会把错误归类到
Optimizer,并保持运行入口禁用。

本页的工程重点是:目标清晰、变量可控、预算合理。
优化目标(Objectives)
目标表定义“什么结果算更优”。当前实现支持多目标;所有启用目标会按权重组合成总适应度。
目标表的配置逻辑
目标表上方支持 Add / Insert / Duplicate / Move Up / Move Down / Delete,这些操作只影响目标列表本身,不改变底层求解逻辑。
默认目标来自 createDefaultOptimizationObjective(),其起始值为:
target = Rdirection = maximizeangle = 0°pRatio = 0.5wavelengthMode = singlewavelengthSingle = 550 nmwavelengthFrom / To / Step = 400 / 700 / 10wavelengthAggregation = averageweight = 1targetValue初始为空
默认值的意义是“先给出一个可编辑模板”,不是推荐的工程目标。实际使用时通常应立即改成与你的设计任务一致的目标定义。
目标字段与约束
| 字段 | 作用 | 当前规则 |
|---|---|---|
| 启用 | 该目标是否参与总适应度 | 禁用后保留配置,但不参与优化 |
Target | 目标量 | 当前仅支持 R / T / A |
Direction | 优化方向 | minimize / maximize / approach |
Target Value | 目标值 | 仅在 approach 时启用,范围 0~1 |
Angle | 目标入射角 | 0° ~ 89.9° |
Wavelength Mode | 波长模式 | single / range |
Wavelength | 单点波长或范围 | 单点 >= 1 nm;范围要求 From < To 且 Step > 0 |
Aggregation | 范围聚合方式 | 仅在 range 模式下有效,支持 average / sum |
pRatio | p 偏振比例 | 0 ~ 1 |
Weight | 目标权重 | 必须 > 0 |

三种优化方向的工程含义
| 方向 | 求解器在做什么 | 适合场景 |
|---|---|---|
maximize | 尽量提高该量 | 提高透射、提高吸收、提高反射 |
minimize | 尽量压低该量 | 压低反射、压低吸收 |
approach | 尽量逼近指定数值 | 设计点需要逼近特定目标值 |
其中 approach 有一个硬性约束:必须填写 Target Value。如果为空,Schema 校验立即失败。
波长模式的选择原则
| 模式 | 行为 | 适用任务 |
|---|---|---|
single | 只评估单一波长点 | 单点设计,例如 550 nm 增透 |
range | 在一段波长区间逐点计算,再聚合为一个评分 | 宽带增透、宽带反射控制、宽带吸收 |
当你切换到 range:
- 必须补齐
From / To / Step。 To必须大于From。Step必须大于0。Aggregation才会生效。
Aggregation 的工程差异也很明确:
average更适合控制区间平均表现。sum更适合强调区间总量,而不是平均值。
目标配置建议
第一次优化建议使用 1~2 个目标:
- 先定义一个主目标,例如“550 nm、0°、最大化
T”。 - 如需加入第二约束,再增加一个低权重目标,例如“同一条件下最小化
R”。 - 当多个目标冲突时,优先调整
Weight,而不是立刻扩大变量范围。
优化变量(Variables)
变量表定义“算法被允许修改哪些输入”。没有变量,目标再清楚也无法执行优化。
变量表的配置逻辑
变量表同样支持 Add / Insert / Duplicate / Move / Delete,但有一个实现细节必须注意:
Add创建的新行默认启用。- 新行初始路径和边界为空,因此 Footer 会立即报错,直到你补齐配置或先禁用该行。
Insert创建的新行默认禁用,更适合作为占位草稿。
如果你只是想先占位,不希望当前页面立即报错,优先使用 Insert。
当前界面暴露的路径范围
当前 Optimizer 页面的路径选择器复用扫描页的路径结构,但界面实际只暴露两类:
structuresurroundings
底层校验函数仍支持 optics > incidentAngle / pRatio,但当前页面的可视路径选择器没有暴露 optics 分类。因此在正常 UI 操作下,你不能直接把 incidentAngle 或 pRatio 加入优化变量表。
当前常用变量路径
| 分类 | 路径格式 | 当前限制 |
|---|---|---|
| 普通层厚度 | structure / {LayerName} / thickness | 最常用、最稳定 |
| 普通层折射率参数 | structure / {LayerName} / {n, k, nExt, kExt} | 受 indexType 限制 |
| 层组重复次数 | structure / {GroupName} / repeatCount | min/max 必须为正整数 |
| 层组内部层参数 | structure / {GroupName} / layers / {LayerName} / ... | 必须精确匹配内部层名称 |
| 入射侧介质 | surroundings / incidence / n | 只支持 n |
| 透射侧介质 | surroundings / transmission / {n, k} | File 模式下折射率变量被拦截 |

边界与重复路径规则
每个变量至少需要一组搜索边界:min 与 max。
当前校验逻辑要求:
- 至少存在一条变量记录。
- 至少存在一条启用变量,否则优化任务仍然无效。
- 启用变量必须有合法路径。
- 启用变量之间不能出现重复路径。
min和max不能同时为空。- 若两者都存在,必须满足
min < max。
这几条里,最常见的问题是“复制变量后忘记改路径”以及“新增变量后边界未填”。
路径何时会失效
变量路径按名称引用模型元素,因此在以下情况下会立即失效:
| 场景 | 结果 | 处理方式 |
|---|---|---|
| 层或层组被删除 | 路径找不到对应元素 | 重新选择路径 |
| 层或层组被禁用 | 路径被判定为无效引用 | 重新启用或改选路径 |
| 层名、组名或内部层名被重命名 | 旧路径不再匹配 | 重新选择路径 |
| 属性与当前模式不匹配 | 路径结构存在,但属性被拦截 | 调整模式或改选属性 |
Optimizer 的变量维护高度依赖结构命名稳定性。若结构尚未定型,不建议过早建立复杂变量表。
折射率模式与 repeatCount 的特殊限制
变量是否可用,还取决于对应层当前的模式。
indexType | 可优化属性 | 不可优化属性 |
|---|---|---|
Constant | thickness, n, k | nExt, kExt |
Const. Birefringence | thickness, n, k, nExt, kExt | 无额外折射率限制 |
File | thickness | 所有折射率属性 |
环境介质限制如下:
incidence只允许ntransmission允许n / k- 若介质是
File模式,折射率属性不可优化
当路径为 structure / {GroupName} / repeatCount 时,还要满足更严格的离散规则:
min和max都必须填写。min必须是正整数。max必须是正整数。- 仍需满足
min < max。
repeatCount 是离散周期数,因此必须使用整数边界。
算法参数与搜索阶段
当前界面只暴露三个算法参数,全部对应 simple-optimizer-FP.ts 中的三阶段网格搜索:
maxEvaluationsprecisionLevelcandidateCount
旧版 locale 中保留的 populationSize / mutationRate 等词条并不代表当前页面仍在使用遗传算法。当前实现是网格搜索,不是遗传算法。
三个参数的实际作用
| 参数 | 当前范围 | 直接作用 |
|---|---|---|
maxEvaluations | 20 ~ 1000 | 限制总评估预算 |
precisionLevel | 1 ~ 5 | 提高采样密度和局部细化强度 |
candidateCount | 2 ~ 8 | 决定多少个粗搜索候选点进入局部细化 |

超出范围时,字段下方会立即出现校验错误,因此这三个参数本身也可能成为 Run Optimizer 无法执行的原因。
当前优化器的搜索流程
当前实现是固定的三阶段搜索:
coarse:在全局变量范围内做粗网格采样。local:围绕粗搜索中表现较好的候选点做局部细化。fine:围绕当前最佳点做更小半径的精细搜索。
Optimization Report 中的搜索历史,也会按这三个阶段记录结果。
参数调节建议
第一次优化建议从较小预算开始:
maxEvaluations = 50 ~ 150precisionLevel = 1 ~ 2candidateCount = 3
确认以下三点后,再逐步增加预算:
- 目标方向正确。
- 变量边界在物理上合理。
- 第一轮最优解至少具备解释意义。
如果在目标和边界都不稳定时直接提高预算,只会更快地搜索错误空间。
运行前检查、常见错误与下一步
执行 Run Optimizer 之前,建议完成以下检查:
- 至少存在一个启用且有效的目标。
- 至少存在一个启用且有效的变量。
- 启用变量之间没有重复路径。
Structure与Optics当前本身已通过验证。- 变量范围在物理上合理,不是纯粹的盲目大范围搜索。
- 算法参数处于允许范围内。
常见错误与处理方式如下:
| 现象 | 常见原因 | 处理方式 |
|---|---|---|
Run Optimizer 灰掉 | 目标、变量或算法参数任一处仍有错误 | 查看 Footer,再逐表修正 |
| 新增变量后立刻报错 | Add 创建的空行默认启用 | 补齐路径和边界,或先禁用该行 |
approach 一直无效 | 未填写 Target Value | 补一个 0~1 的目标值 |
repeatCount 无法通过验证 | 边界不是正整数 | 改为正整数边界 |
想优化 incidentAngle 却找不到 | 当前 UI 不暴露 optics 分类 | 这是当前界面边界,不是使用错误 |
| 优化结果很差且波动大 | 范围过宽、目标冲突或预算不足 | 先缩小范围,再检查目标与预算 |
完成本页配置后,下一章请继续阅读:基本光学结果。先掌握普通结果的读取方式,再回到 Optimization Report 分析优化过程与最优解。