跳转到内容

求解器模式

SunSolve Power 提供三种求解模式:

  1. 单次求解(Single solution),
  2. 扫描(Sweep),
  3. 优化(Optimisation)。

在单次求解模式下,结果基于各个输入标签页上当前的输入值计算,一次仿真只包含单个求解运行。

在扫描模式下,用户选择若干输入作为“扫描”变量。这些输入会从初值步进到终值,在同一仿真下产生多次运行的结果。几乎所有输入——甚至材料——都可以作为扫描变量。

在优化模式下,用户选择若干需要优化的输入以及一个优化目标,该目标由“输出指标”和“最大化/最小化”要求组成。SunSolve 会在同一仿真下执行多次运行,以找到满足优化目标的输入组合。

需要注意的是,SunSolve 的优化器采用遗传算法,非常适合包含多个输入的复杂优化问题。对于只有单个输入的简单优化,用扫描模式往往更高效。

切换到扫描模式: 在 Solver 标签页中选择 sweep。

启用扫帚工具: 点击工具栏上的扫帚图标。当图标高亮时,表示可以添加或移除扫描输入。

选择扫描输入: 可选的扫描输入会以黄色高亮显示。点击这些输入即可将其添加到或移出扫描输入列表。

定义扫描参数: 在 Solver 标签页中:

  • 选择步数;
  • 为每个扫描输入设置起始值和结束值,并选择步长为线性或对数;或者勾选 ‘fix’ 复选框并手动输入一组离散值;
  • 通过点击行首的 ↓ 箭头启用二维扫描(需要至少两个扫描输入)。

运行扫描: 点击播放按钮 ▶。

下载结果: 点击下载图标。除非勾选了“Select run”或“Download into separate files”复选框,否则下载文件将包含该次扫描中的所有运行结果。

切换到优化模式: 在 Solver 标签页中选择 optimisation。

启用魔杖工具: 点击工具栏上的魔杖图标。当图标高亮时,表示可以添加或移除优化输入。

选择优化输入: 可作为优化变量的输入会以黄色高亮显示。点击这些输入即可将其添加到或移出优化输入列表。最多可选择三个输入。与扫描模式不同,材料不能作为优化输入。

设置优化输入参数: 在 Solver 标签页的输入区域中,为每个优化输入设置上下边界、最佳猜测值和分辨率。求解器将把输入的最优值精确到用户指定的分辨率范围内。

设置优化目标: 在 Solver 标签页的目标区域中,选择输出指标,并指定是要最大化还是最小化该指标。

输出指标可以是:

  • 一个或多个层中的光学吸收(在入射光谱上积分);
  • 电池或组件的电流;
  • 电池或组件的电功率。

当输出指标为光学吸收时,需要选择对应的光学层。输出指标等于所选层中等效光子电流之和。如果某一层包含自由载流子吸收(FCA),需要选择电流是表示该层的总吸收电流(包含 FCA),还是只表示产生电流(不包含 FCA)。

设置优化选项: 在 Solver 标签页的 options 区域中,为优化过程设置限制条件,并为遗传算法设置相关参数。具体说明见下文。

运行优化求解器: 点击播放按钮 ▶。求解器将应用遗传算法,在给定输入边界和优化选项约束下,寻找满足优化目标的最优输入组合。

下载结果: 在 Solver 标签页中点击“Download optimisation results”即可下载仿真中所有运行的输入和输出指标;点击下载图标则可下载最优运行对应的各类输出文件。

本节介绍优化流程,其中带下划线的术语对应用户可设置的选项。

优化求解器采用遗传算法来寻找最优输入值。该算法基于“进化”思想,通过多代迭代寻找“最适应”的基因组合(即优化输入)。

用户首先设置每一代的runs per generation NGN_G。每次运行都包含各个输入标签页上定义的全部输入,唯独优化输入(基因)由优化流程自动赋值。

在第一代中,运行次数取 NGN_G3n+13^n + 1 中的较大者,其中 nn 为被优化输入的个数。基因取值会在用户设定的上下边界范围内均匀覆盖整个空间,且第一代中包含用户给出的最佳猜测。

第一代的所有运行会并行求解,随后汇总其输出指标。输出指标最优的运行(即“适应度最高”的运行)将被加入“基因库”(gene pool)。随着迭代进行,基因库始终只保留适应度最高的一部分运行,其大小不超过 runs in gene pool NGPN_{\text{GP}}

之后会生成第二代运行,其中基因取值通过对基因库中的运行进行“配对”(mating)得到。该过程依赖 mix fraction ssmaximum mutation Mmax,具体见下文。

第二代(及后续各代)完成后,基因库会更新为截至当前所有代中适应度最高的 NGPN_{\text{GP}} 个运行。

迭代会持续进行,直到满足以下任一终止条件:

  1. 用户点击停止键 ■ 中止仿真;
  2. 达到 maximum runs
  3. 达到 maximum total rays
  4. 达到 time limit
  5. 超过 run failure threshold ff
  6. 算法收敛(定义见下文)。

达到终止条件时,输出指标最大的运行被视为“最适应”个体,其基因输入会被加载用于最终运行,以得到优化后的结果。

前四个终止条件直观易懂。

第五个终止条件出现在基因库中的失败运行数量超过 ff 时。一次“失败运行”指在光线追迹或电学求解过程中发生异常的运行。如果遇到这种情况,你可以将导致问题的 SIM 文件发送给 PV Lighthouse,我们会协助排查原因。

第六个终止条件——收敛——是最理想的情况,表明求解器在给定约束下找到了最优输入。

由于光线追迹基于蒙特卡罗方法,具有随机性,我们希望最优输入的不确定度相对于单次运行中随机性的影响足够小。

具体来说,我们将收敛定义为:

extCIGP<kCIBR, ext{CI}_{\text{GP}} < k \cdot \text{CI}_{\text{BR}},

其中 CIGP 为基因库中各运行输出指标的 95% 置信区间,CIBR 为最优运行输出指标的 95% 置信区间,kk 为用户定义的常数,称为 convergence tolerance(收敛容差)。

下面通过两幅示意图说明该收敛条件的含义。

Solver example case 1 Solver example case 2

这两幅图展示了两个独立示例的结果。每个示例对应一个只有单个输入变量的简单仿真,基因库中包含 8 个运行,每个运行使用不同的输入值。

图中的橙色圆点表示基因库中每个运行的输出指标,橙色误差条(及其标注)表示各运行的 95% 置信区间,该区间反映光线追迹随机性带来的不确定度。其中最优运行的置信区间即为 CIBR

红色方块表示基因库中输出指标的平均值,红色误差条(及其标注)表示基因库整体输出指标的 95% 置信区间,这一数值为 CIGP,用于刻画基因库内部输出指标的离散程度。(CIGP 的计算并不依赖各运行自身的 95% 置信区间。)

在 Case 1 中,基因库中各运行的输出指标差异较大,CIGP = 1.9,明显大于最优运行的置信区间 CIBR = 1.4。因此,当 k=1k = 1 时,仿真尚未收敛。下一代将用更接近 8(最优运行对应输入值)的输入填充基因库,求解继续。

在 Case 2 中,基因库中各运行的输出指标彼此接近,CIGP = 0.6,明显小于最优运行的置信区间 CIBR = 1.7。因此,当 k=1k = 1 时,仿真已收敛。此时最优输入为 8,对应的最大输出指标为 34 ± 1.7。

适应度最高的 NGN_G 个运行分别与基因库中随机选取的另一个运行“配对”,生成 NGN_G 个子代,其基因为双亲基因的混合。子代基因(即输入)按如下方式计算:

X=X2+ΔXs±RΔXMmax,X = X_2 + \Delta X \cdot s \pm R \cdot \Delta X \cdot M_{\max},

其中 R 为 0 至 1 之间的随机数,X 为某一输入变量,ΔX = X1 - X2X1X2 分别是两位父本中适应度更高者和更低者对应的输入值。

下图以二维优化(具有输入 XY)为例示意这一过程。图中两个灰点表示 X–Y 参数空间中的两位父本,其中 (X1Y1) 为适应度较高者,(X2Y2) 为适应度较低者。新生成的子代会随机落在红色方框所示的区域内。

Genetic algorithm

因此,较大的 Mmax 会使下一代子代的多样性更强,从而得到更“鲁棒”但收敛更慢的优化算法。sMmax 的最佳取值高度依赖于具体问题。

最后需要说明的是,算法会对红色方框进行裁剪,确保其不超出用户为各输入设置的上下边界。