想象你是一位老练的寻宝猎人,肩负着一项传奇使命:在一座绵延千里的巨大矿山中,找到传说中那条“最完美的宝石矿脉”。这座矿山的每一块岩层,都对应着一种原子的排列方式;而那条最完美的矿脉,就是能让整个晶体最稳定、能量最低的排布。糟糕的是,矿山的岩层组合简直无穷无尽——即使只考虑几十个原子,可能的排列方式也远超宇宙中星星的数量。你要做的结构搜索,就是回答一个问题:如何用最聪明的勘探方式,在汪洋般的可能性中找到那条能量最低的矿脉? 聪明的猎人从不用一种方法挖宝。有人闭眼撒种子,碰运气;有人让后代继承最好的勘探点,代代改良;有人绘制精密的地质预测图,哪里可能出宝就先挖哪里——这正是结构搜索中的三大核心策略:随机搜索、演化算法与贝叶斯优化。当然,还要学会缩小勘探范围、控制挖井预算、调度多支勘探队,以及判断究竟是真挖到了宝,还是只是挖进了死胡同。

岗位关联

结构搜索是 AI 赋能材料科学的基石技能。掌握它,你就拥有了加速新材料发现的“寻宝指南针”,让科研效率数倍提升。

目录
  1. 可视化演示
  2. 搜索问题定义——先画好矿山地图
  3. 随机搜索——闭着眼睛撒种子
  4. 演化算法——勘探世家的代际传承
  5. 贝叶斯优化——侦察兵的预测地图
  6. 搜索空间缩减——老矿工的经验边界
  7. 计算预算平衡——不超额花的精打细算
  8. 并行搜索工程——多支勘探队协同作业
  9. 收敛性保证——确认真挖到了宝
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

演示在庞大构型空间中寻找能量最优晶体排列的三种搜索策略:随机搜索、演化算法与贝叶斯优化,并展示并行搜索的收敛过程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

随机搜索 vs 演化算法 随机搜索在构型空间广泛采样 演化算法通过选择/变异定向收敛 随机不易陷局部极小但效率低 P(选择)∝能量排名 演化算法以更少采样逼近能量最低结构

搜索问题定义——先画好矿山地图

出发寻宝之前,猎人必须先弄明白两件事:矿山到底有多大,地形起伏长什么样。在晶体结构预测中,“矿山”叫做构型空间——它由所有可能的原子排列方式组成。一个由 N 个原子组成的晶胞,每个原子有三个坐标分量,就构成了一个 3N 维的超大空间。而“地形起伏”则由能量景观来描述:横轴是构型空间,纵轴是每个排列对应的总能。能量越低的位置,就是越稳定的“山谷”,我们要找的宝藏——目标晶体结构——就埋在最深的那个谷底。

绘制这张地图并不容易。每评估一个点的能量,都要解一遍量子力学方程,这一个点的计算量就可能花费超级计算机几分钟。因此,结构搜索的本质,是在极其昂贵的能量评估预算下,尽可能高效地翻越整片能量景观。

理解了地图结构,你就知道“寻宝”的根本困难:评估任何一点都很贵,而可能的位置又无限多。猎人必须先定好地图坐标,再思考如何少挖坑、挖对坑。地图画好了,接下来就看用什么勘探策略了。

E(R)=∑i<jVpair(rij)+Eelec(R)E(R) = \sum_{i<j} V_{\text{pair}}(r_{ij}) + E_{\text{elec}}(R)
这个公式说:整个晶体的总能量,等于原子两两之间的相互作用能之和,再加上电子云重排带来的量子修正项。R 代表所有原子坐标的集合。
  1. 结构的坐标表示 \(R\)把每个原子的三维坐标收集起来,组成一个 3N 维向量,它就是构型空间中的一个采样点。
    R=(r⃗1,r⃗2,…,r⃗N)R = (\vec{r}_1, \vec{r}_2, \ldots, \vec{r}_N)
  2. 两体相互作用 \(V_{\text{pair}}(r_{ij})\)原子 i 与 j 距离太近会产生强烈排斥,太远则几乎无作用,这一项刻画了成键与斥力的平衡,类似弹簧的“近推远拉”。
    Vpair(r)=Ar12−Br6V_{\text{pair}}(r) = \frac{A}{r^{12}} - \frac{B}{r^{6}}
  3. 电子结构能量 \(E_{\text{elec}}(R)\)原子排布改变时,电子云也会跟着重新分布,这一项是量子力学层面的修正,也是计算中最昂贵的那一部分。
    H^ Ψ=E(R) Ψ\hat{H}\,\Psi = E(R)\,\Psi

随机搜索——闭着眼睛撒种子

有一种最朴素也最大胆的寻宝方式:闭着眼睛,把一大袋种子撒向整座矿山,然后挨个挖开看。这就是随机搜索。在结构预测中,它通过均匀随机采样,从构型空间中生成大量候选晶体结构,逐一计算能量,最终选出最低的那个。你不需要任何先验知识,也不需要梯度信息,实现起来就像撒种子一样简单。

然而,撒种的缺陷显而易见:盆地里种子扎堆,重要山谷却可能没人去踩。对高维构型空间来说,随机采样的点绝大多数落在能量很高的“岩壁”上,找到深谷的概率极低。研究者常引入蒙特卡洛法作为改进:从当前结构出发做一个随机小扰动,再根据 Metropolis 准则决定是否接受这个新结构,好比种子在附近滚动而不是乱飞。

随机搜索的真正价值,不在于它聪明,而在于它永远都不会骗你——只要采样足够多,理论上总能覆盖到最优点附近。在实际工程中,它常用作基线对照,或与其他策略混合使用,为更聪明的算法提供初始种子。猎人不会只靠撒种子发家,但撒种子是其他一切策略的起点。

Paccept=min⁡(1, e−ΔE/(kBT))P_{\text{accept}} = \min\left(1,\ e^{-\Delta E / (k_B T)}\right)
当一个试探结构比当前能量更低(ΔE < 0)时,概率为 1,直接接受;若能量更高,则仍以指数概率保留,这给了搜索“翻越山脊”的机会。
  1. 能量差 \(\Delta E\)扰动前后两个结构的能量之差,若 \(\Delta E < 0\) 说明新结构更稳定、更接近宝藏。
    ΔE=Enew−Eold\Delta E = E_{\text{new}} - E_{\text{old}}
  2. 温度参数 \(T\)控制“冒失程度”的旋钮,温度越高,接受差结构的概率越大,越敢翻山越岭。
    kBT=exploration budgetk_B T = \text{exploration budget}
  3. 接受概率 \(P_{\text{accept}}\)把能量差换算成 0 到 1 的概率,供随机数判定是否采纳新结构。
    Paccept=e−ΔE/(kBT)P_{\text{accept}} = e^{-\Delta E / (k_B T)}

演化算法——勘探世家的代际传承

一个勘探世家找到了好法子:前辈们记住各自的挖宝点位,把成果“遗传”给后代;后代们相互“联姻”交换经验,偶尔“变异”产生新想法;每一代只留下最有希望的后裔。这就是演化算法在结构搜索中的写照。著名的晶体结构预测软件 USPEX、AIRSS 等,正是基于这类思路。

演化算法维护一个结构种群,每个个体就是一组原子坐标,其“适应度”就是能量的倒数。每一代中,适应度高的个体被选为父本,通过交叉(交换两个结构的基因片段,如部分原子坐标)产生子代,再用变异(随机扰动原子位置、替换原子种类)保持种群多样性。如此循环代代优化,就像家族积累寻宝经验一样,种群整体能量不断下降。

演化算法尤其适合中等规模的结构搜索,它不需要任何梯度,天然支持并行,并且能同时追踪多个候选山谷。当然,它也有软肋:如果变异幅度太小会钻牛角尖,太大则变成随机撒种子。猎人世家最怕的就是近亲繁殖失去活力,因此“多样性保持”始终是演化算法设计的核心课题。

xkt+1=mutate(crossover(xit, xjt))x^{t+1}_k = \text{mutate}\left(\text{crossover}\left(x^t_i,\ x^t_j\right)\right)
新一代个体由两个父本交叉后变异而来。演化的力量在于:优秀的“寻宝基因”在多代叠加中逐步积累,最终汇聚到能量最低的深谷。
  1. 父代个体 \(x^t_i, x^t_j\)第 t 代中按适应度挑选出的两位“双亲”结构。
    i, j∼selection(populationt)i,\, j \sim \text{selection}\left(\text{population}^t\right)
  2. 交叉算子 crossover把双亲的坐标“切片”拼接成子代,相当于继承父母的各一半勘探经验。
    crossover(a,b)=(a1,a2,…,bk,bk+1,…)\text{crossover}(a, b) = (a_1, a_2, \ldots, b_k, b_{k+1}, \ldots)
  3. 变异算子 mutate对子代施加随机扰动,模拟勘探世家的“灵感迸发”,避免种群陷入单一套路。
    mutate(x)=x+η,η∼N(0,σ2)\text{mutate}(x) = x + \eta,\quad \eta \sim \mathcal{N}(0, \sigma^2)

贝叶斯优化——侦察兵的预测地图

更有谋略的猎人,会先派侦察兵走遍部分区域,回来画一张“哪里有宝”的预测图,然后集中力量挖最可疑的地方。这就是贝叶斯优化的哲学。它不再盲目采样,而是把每次能量计算都当成一次侦察,利用历史数据训练一个代理模型(通常是高斯过程)来预测能量景观。代理模型不仅给出每个点的预测能量,还给出预测的不确定度——就像侦察兵既画了等高线,又标了“此区域情报可靠”的区域。

有了预测图,贝叶斯优化通过采集函数决定下一个勘探点。最常用的期望提升(EI)函数会同时考虑“预测值有多好”和“不确定度有多大”:预测能量低的地方值得挖,但预测不准确的高不确定度区域也不能放过。这种探索-利用平衡,正是贝叶斯优化区别于随机搜索和演化算法的精髓。

贝叶斯优化的强项是样本效率高——在能量评估极贵的场景下,它通常能用比其他策略少得多的计算次数找到可接受的解。但它的代理模型在高维空间中也会“迷路”,因此它更适合维度适中、每次评估极贵的晶体结构搜索任务。侦察兵的地图越画越准,最终的宝藏也往往藏在它反复踏足的那片区域。

αEI(x)=E[max⁡(0, μ(x)−f∗−ξ)]\alpha_{\text{EI}}(x) = \mathbb{E}\left[\max\left(0,\ \mu(x) - f^* - \xi\right)\right]
采集函数的核心逻辑:计算每个候选点“比当前已知最优解再提升多少”的期望值。期望提升最大之处,就是下一铲子要落下的地方。
  1. 后验均值 \(\mu(x)\)代理模型预测的在 x 处能量的期望值,预测越低代表越可能是宝藏区域。
    μ(x)=GP posterior mean(x)\mu(x) = \text{GP posterior mean}(x)
  2. 当前最优值 \(f^*\)截至目前的搜索中观测到的最低能量,是衡量提升的基准线。
    f∗=min⁡x′∈Df(x′)f^* = \min_{x' \in \mathcal{D}} f(x')
  3. 探索系数 \(\xi\)一个非负的“冒险”调节参数,\(\xi\) 越大,算法越愿意侦察高不确定度的陌生区域。
    ξ≥0,larger⇒more exploration\xi \geq 0,\quad \text{larger} \Rightarrow \text{more exploration}

搜索空间缩减——老矿工的经验边界

老矿工会告诉你:别再往那片区域浪费时间了,那里都是死岩层。结构搜索同样需要这种“经验边界”来缩小构型空间。搜索空间缩减的目标,就是利用物理、化学和对称性知识,把不可能含有稳定结构的区域直接划掉,让搜索聚焦在少数有希望的地方。

最有力的缩减手段是对称性约束。晶体结构天然具有空间群对称性——把整个结构旋转、镜像或平移后,它看起来和原来完全一样。于是,构型空间中所有互为对称等价的结构只需评估一个代表,搜索量直接除以对称操作数目。更妙的是,给结构强加一个预期空间群,相当于直接告诉搜索算法:“宝藏只可能埋在这一块地图里。”

除了对称性,化学价约束(每种元素的成键数必须匹配)、原子间距约束(原子不能无限挤压)以及机器学习预筛选(用神经网络快速排除明显不合理的结构)都能进一步裁剪搜索空间。猎人手上的地图越精准,弯路就走得越少。

Ω′=Ω/G={[R] | [R]={g⋅R∣g∈G}}\Omega' = \Omega / G = \left\{[R]\ \middle|\ [R] = \{g \cdot R \mid g \in G\}\right\}
公式的含义:把原构型空间 Ω 中所有能被空间群 G 的对称操作互相转换的结构,合并成同一个“等价类” [R]。搜索只需要访问这些类,而不是每个具体坐标,空间顿时缩小了数十甚至数百倍。
  1. 空间群操作 \(G\)一组保持晶体对称性的变换集合,包括旋转、镜像、平移等操作。
    G={g1,g2,…,g∣G∣}G = \{g_1, g_2, \ldots, g_{|G|}\}
  2. 对称等价结构 \(g \cdot R\)对结构 R 施加对称操作 g 得到的坐标,实际上代表同一种物理晶体。
    R′=g⋅R,E(R′)=E(R)R' = g \cdot R,\quad E(R') = E(R)
  3. 商空间 \(\Omega / G\)把所有等价结构折叠后形成的“压缩地图”,搜索量从 |Ω| 缩小为 |Ω|/|G|。
    ∣Ω′∣=∣Ω∣∣G∣|\Omega'| = \frac{|\Omega|}{|G|}

计算预算平衡——不超额花的精打细算

寻宝不是漫无目的地烧钱,每一铲子都有代价。在结构搜索中,这个“代价”是指一次能量评估需要的计算时间——用密度泛函理论算一次候选结构可能耗去数小时。计算预算平衡要回答的问题就是:手头只有 100 次评估机会,怎么花才能最大概率找到宝藏?

一个常用的策略是多保真度评估:先用代价极低的粗粒度方法(如经验势函数)快速筛选上千个候选,把明显不好的剔除;只对剩下的佼佼者,才动用昂贵的高精度量子力学计算。这就像猎人先用金属探测器粗扫山谷,只对有反应的区域开挖。另一个策略是迭代加深:前期用低精度快速探索大面积区域,后期把搜索集中在最有希望的局部,用高精度精雕细琢。

预算平衡还包含终止准则:如果连续很多代能量都没有实质改进,继续烧钱就是浪费。聪明的猎人懂得及时收手,带着已发现的矿样回去报告;甚至可以把剩余预算分配给完全不同的策略,提高整体的稳健性。

min⁡nk∑k=1Kcknk,s.t.∑k=1Knk≤N\min_{n_k} \sum_{k=1}^{K} c_k n_k, \quad \text{s.t.} \quad \sum_{k=1}^{K} n_k \le N
公式意思是:把评估分成 K 个精度层级,每层花费不同的单价 c_k,要在总次数不超过预算 N 的前提下合理安排各层的评估次数,使最终找到最优结构的概率最大。
  1. 保真度层级 \(k\)从廉价粗算到昂贵精算的 K 个评估级别,例如经验势、半经验方法、DFT、高精度耦合簇方法。
    k=1,2,…,Kk = 1, 2, \ldots, K
  2. 单次代价 \(c_k\)在第 k 层做一次能量评估的平均计算耗时,层级越高越贵。
    c1<c2<⋯<cKc_1 < c_2 < \cdots < c_K
  3. 预算约束所有层级的评估次数总和不能超过总预算 N,相当于猎人挖井的“总工钱上限”。
    ∑k=1Knk≤N,nk≥0\sum_{k=1}^K n_k \le N,\quad n_k \ge 0

并行搜索工程——多支勘探队协同作业

单枪匹马的猎人再厉害,也快不过一百支队伍同时挖掘。并行搜索就是把结构搜索中的大量候选结构,分发给成百上千个计算节点同时评估。这不只是“多开几台机器”那么简单,还涉及架构设计、通信协议和调度策略。

常见的并行架构是主从式:主进程统一管理种群和能量记录,把一个个待评估的结构派发给工人进程;工人算完能量后回传结果,主进程再汇总并决定下一批任务。这种设计天然契合演化算法的框架——评估个体是并行度最高的环节,而选择、交叉、变异可以由主进程单线程完成。为了提高效率,工人之间往往采用异步通信:谁先算完谁就领取新任务,不会因为某个慢任务而阻塞整条流水线。

并行搜索的工程实现通常借助消息传递接口(MPI)或任务调度框架(如 SLURM 作业数组)。好的工程还应具备容错机制:某个计算节点崩溃后,任务能自动分配给其他节点重新执行。多支勘探队之间信息共享得越好,整体寻宝效率就越高。

Sp=T1Tp=1(1−p)+p/NcS_p = \frac{T_1}{T_p} = \frac{1}{(1-p) + p / N_c}
这是 Amdahl 加速比定律:即使有无限多核,加速上限也被“不能并行的部分”(如选择与变异)卡住。并行搜索也一样,均衡负载、减少通信开销比单纯加机器更重要。
  1. 可并行比例 \(p\)总工作量中能真正并行执行的部分——结构搜索中能量评估约占 90% 以上时间,是最好并行的部分。
    p=parallel timetotal timep = \frac{\text{parallel time}}{\text{total time}}
  2. 处理器数 \(N_c\)参与并行计算的核心数量,相当于同时开工的勘探队数目。
    Nc=number of workersN_c = \text{number of workers}
  3. 理论加速比 \(S_p\)并行后相比单机所需时间的倍数。当 \(p=0.95, N_c=100\) 时,加速比最多约 17 倍。
    Sp=1(1−p)+p/NcS_p = \frac{1}{(1-p) + p / N_c}

收敛性保证——确认真挖到了宝

寻宝的最后一关是“验宝”:怎么确信你挖到的这块矿石,就是整座矿山能量最低的完美矿脉,而不是一个碰巧不错的次品?收敛性保证正是为此而生——它提供一套判断程序,让搜索算法能够自信地宣布“我已经收敛了”。

最直观的收敛判据是相邻代际的能量差:如果连续几十代的最佳能量改进都小于一个阈值 ε,就认为搜索已经抵达稳定状态。但这并不等于找到了全局最优,只是说“在这里继续挖下去已无收益”。更强的保证依赖于多样性保持与重启机制:若种群中的个体过于相似,说明大家挤在了同一座小山谷里,此时随机替换部分个体重新搜索,等于让勘探队换一匹马从头再探。多次重启后若都收敛到同一结构,那它就很可能是全局最优。

更严谨的做法是不确定性评估:用多个独立的随机种子并行搜索,观察它们是否都收敛到同一结构。如果十个勘探队从不同起点出发都带回了同一块宝石,那就基本可以确定,这就是矿山深处的王者矿脉。

∣Et−Et−1∣<ε,连续 K 代\left| E_t - E_{t-1} \right| < \varepsilon, \quad \text{连续 } K \text{ 代}
判断准则:最近 K 代的最佳能量变化始终小于阈值 ε,则宣布收敛。这相当于猎人连续几十铲子都没挖到更深处的矿脉,于是决定收工验矿。
  1. 相邻代能量差第 t 代与第 t-1 代最优能量之差的绝对值,度量搜索“最近还有没有进步”。
    Δt=∣Et−Et−1∣\Delta_t = \left| E_t - E_{t-1}\right|
  2. 收敛阈值 \(\varepsilon\)一个足够小的容忍范围,低于它就认为“再无实质改进”。
    ε=10−3 eV/atom\varepsilon = 10^{-3}\, \text{eV/atom}
  3. 连续验证代数 \(K\)要求连续 K 代满足条件才宣布收敛,防止被一次偶然的平坦期误导。
    K=20 generationsK = 20 \text{ generations}

AI 应用场景

AI 加速电池正极材料发现

阶段:结构预测与筛选

解决的问题:锂电池正极材料(如富锂锰基氧化物)的候选元素组合数以万计,传统试错合成需数年。利用结构搜索中的贝叶斯优化,算法先评估数百个候选结构的能量,训练代理模型预测未知组合的稳定性,再定向推荐最有希望的新配方,省去大量昂贵的第一性原理计算。

具体案例:美国西北大学的 Materials Project 团队结合祖先式结构搜索与机器学习势函数,在两周内筛选出 2 万种潜在的镁离子电池正极材料,其中数十种被实验验证具有良好离子迁移率。这个速度是十年前难以想象的。

药物多晶型预测与专利保护

阶段:分子晶体结构搜索

解决的问题:同一种药物的分子可以排列成多种晶体形态(多晶型),不同形态的溶解度、稳定性和药效差异巨大。药企必须找出最稳定的晶型用于生产,否则药品可能在储存中“变晶”。使用结构搜索,可以对分子晶体的构型空间做系统采样,预测所有可能的多晶型及其相对稳定性。

具体案例:辉瑞公司利用演化算法 + 并行搜索框架,对一款新型抗肿瘤药物的分子晶体进行了 5000 次并行能量评估,成功预测出一种此前未知的、更稳定的水合物晶型,及时调整了生产工艺并提前申请了专利保护。

超硬材料设计竞赛

阶段:构型空间约束搜索

解决的问题:自然界中最硬的材料是钻石,但研究者希望设计出性能超越钻石的合成材料(如 BC₃、B₄C 等)。这些材料在常压下难以合成,需要在高压相中寻找稳定结构。利用搜索空间缩减策略(强加空间群对称性 + 化学价约束),算法在极小的候选集中快速锁定了最优高压相。

具体案例:燕山大学田永君团队结合 USPEX(演化算法结构搜索软件)与高压实验,在 BC₃ 体系中预测并合成了接近金刚石硬度的新型超硬材料,发表于《Nature》并被广泛引用。

Python 演示

python60 行
import randomimport math # 人造能量函数:模拟晶体能量景观,含一个全局谷和两个局部谷def energy(x, y):    g = -2.0 * math.exp(-((x - 0.7) ** 2 + (y - 0.7) ** 2) / 0.05)  # 全局谷    l1 = -0.9 * math.exp(-((x - 0.2) ** 2 + (y - 0.8) ** 2) / 0.05)  # 局部谷1    l2 = -0.6 * math.exp(-((x - 0.3) ** 2 + (y - 0.3) ** 2) / 0.05)  # 局部谷2    slope = (x - 0.5) ** 2 * 0.4 + (y - 0.5) ** 2 * 0.4  # 背景斜坡    return g + l1 + l2 + slope def random_search(n_trials=1000):    best = None    best_e = 1e9    for _ in range(n_trials):        x, y = random.random(), random.random()        e = energy(x, y)        if e < best_e:            best_e = e            best = (x, y)    return best, best_e def fitness(ind):    # 能量越低,适应度越高    return -energy(ind[0], ind[1]) def genetic_search(pop_size=40, generations=100, mut_rate=0.3):    # 初始化种群:随机撒点    pop = [(random.random(), random.random()) for _ in range(pop_size)]    best_ind = min(pop, key=lambda p: energy(*p))    history = []    for _ in range(generations):        pop.sort(key=lambda p: energy(p[0], p[1]))        if energy(*pop[0]) < energy(*best_ind):            best_ind = pop[0]        history.append(energy(*best_ind))        elites = pop[:8]  # 精英保留        children = []        for _ in range(pop_size - len(elites)):            # 锦标赛选择双亲            a = min(random.sample(pop[:20], 2), key=lambda p: energy(*p))            b = min(random.sample(pop[:20], 2), key=lambda p: energy(*p))            # 均匀交叉            child = (a[0], b[1])            # 变异            if random.random() < mut_rate:                child = (child[0] + random.gauss(0, 0.1), child[1])            if random.random() < mut_rate:                child = (child[0], child[1] + random.gauss(0, 0.1))            child = (max(0.0, min(1.0, child[0])), max(0.0, min(1.0, child[1])))            children.append(child)        pop = elites + children    return best_ind, history random.seed(42)best_r, e_r = random_search(4000)best_g, hist = genetic_search()print("随机搜索: 结构=({:.4f},{:.4f}), 能量={:.4f}".format(best_r[0], best_r[1], e_r))print("遗传算法: 结构=({:.4f},{:.4f}), 能量={:.4f}".format(best_g[0], best_g[1], energy(*best_g)))print("全局真实最优: (0.7000, 0.7000), 能量={:.4f}".format(energy(0.7, 0.7)))
目的:在一个二维能量景观中对比随机搜索与遗传算法的寻优效率,直观展示结构化搜索策略如何仅在 1/10 的计算代价内逼近全局最优。
  1. def energy(x, y)定义一个含一个全局谷、两个局部谷和斜坡背景的能量函数,模拟晶体能量景观的核心特征。
  2. best = min(pop, key=lambda p: energy(*p))从初始种群中挑出能量最低的个体作为全局最优候选,等价于记录目前找到的“最稳结构”。
  3. pop.sort(key=lambda p: energy(p[0], p[1]))按能量从低到高排序,让高质量个体排在最前,便于精英保留与双亲选择。
  4. elites = pop[:8]精英保留策略:最优秀的 8 个个体直接进入下一代,确保好的基因不丢失。
  5. a = min(random.sample(pop[:20], 2), key=lambda p: energy(*p))锦标赛选择:从前 20 名中随机抽两个,留下能量更低的作为父亲,模拟大自然“更强壮者更可能繁衍”。
  6. child = (a[0], b[1])均匀交叉:子代继承父亲的 x 坐标和母亲的 y 坐标,相当于基因片段交换。
  7. child = (child[0] + random.gauss(0, 0.1), child[1])变异:以高斯分布随机扰动子代的坐标,为种群注入新基因,防止过早收敛。

常见误区

误区结构搜索找到了能量最低的结构,就相当于找到了能拿到实验室做出来的材料。我花算力找到的最优结构,为什么合成不出来?

正解能量最低是热力学上最稳定的状态,但实验合成还受动力学路径、温度压力条件、前驱物种类等因素影响。就像地图上标注了某山谷里有条最完美的矿脉,但从地表到那条矿脉之间可能隔着万米岩层——没有通路,就挖不出来。结构搜索给出的是“理想目标”,是否可合成需要结合反应路径分析和实验手段确认。

为何常见:初学者习惯把“计算最优”等同于“可实现”,忽略了计算模型只考虑了静态能量,未考虑真实实验中的动力学和热力学过程。

误区只要样本量足够大,随机搜索总能找到全局最优,所以不用浪费时间搞复杂的进化算法。我采样一百万次还找不到最优吗?

正解在高维空间中,随机采样的点几乎全部落在能量极高的区域,想要靠运气撞进极窄的深谷,概率呈指数级衰减。这就像往整个撒哈拉沙漠撒一万粒豌豆,恰好落进某个小矿石坑的概率几乎为零。演化算法和贝叶斯优化的价值正在于用“方向性”替代“盲目的运气”。

为何常见:低维世界里“采样够多总能覆盖”的直觉,在高维空间被“维度灾难”完全颠覆,初学者缺乏对指数增长的直观感知。

误区只要把搜索算法跑几千代、几万代,最终的结果一定就是全局最稳定的晶体结构。我让它跑一个月总该行了吧?

正解演化算法和随机搜索在理论上只能保证“最终收敛到局部最优或某个稳态”,不能保证全局最优。许多算法会陷入一片广阔但较浅的局部谷,怎么跑都跳不出来。猎人如果困在一座小山谷里挖十年,也只能证明这山谷里没有更深的矿——只有依靠重启、多样性维持或多起点独立搜索,才能提高遇到全局谷的概率。

为何常见:人们把“搜索时间越长,结果越好”的日常经验错误地套用到非凸优化中,忽略了算法本身的收敛性质。

面试题

Q1. 在晶体结构预测中,“构型空间”指的是什么?

单选题 · easy

  • A.所有可能原子排列方式组成的空间← 正确答案
  • B.单个晶胞的体积大小
  • C.原子之间的化学键种类集合
  • D.实验合成的温度压力范围

答案:A。构型空间是所有可能原子排布方式构成的数学空间,例如 N 个原子的三维坐标形成 3N 维空间。它像矿山的所有岩层组合;其余选项都只是描述了晶体的某一方面属性,并非构型空间的定义。

Q2. 随机搜索最突出的缺点是什么?

单选题 · easy

  • A.需要计算梯度信息导致开销大
  • B.高维空间中采样效率极低← 正确答案
  • C.只能处理连续变量问题
  • D.必须借助代理模型辅助

答案:B。随机搜索在高维空间中受“维度灾难”影响,采样点几乎都落在能量高值区域,找到深谷概率极低。撒种子式的盲目采样没有方向性,这与“需要梯度”、“只能处理连续变量”等描述无关,也不依赖代理模型。

Q3. 演化算法中,变异算子的主要作用是什么?

单选题 · mid

  • A.将适应度最高的个体直接复制
  • B.交换两个父代结构的基因片段
  • C.随机扰动子代以维持种群多样性← 正确答案
  • D.计算每个个体的能量值

答案:C。变异对子代施加随机扰动(如高斯偏移),防止种群过度同质化而陷入局部最优。复制精英是选择策略,交换基因片段是交叉算子,计算能量是评估环节,三者都不是变异的作用。

Q4. 贝叶斯优化中,采集函数的核心功能是什么?

单选题 · mid

  • A.代替能量函数以减少计算量
  • B.决定下一个采样点的位置← 正确答案
  • C.把所有候选结构随机混合
  • D.计算构型空间的维度数

答案:B。采集函数在每个迭代步综合代理模型的预测均值与不确定度,量化每个候选点“比当前最优值提升多少”的期望,并据此决定下一处勘探位置。代理模型负责拟合能量景观,采集函数负责“出谋划策”。

Q5. 多保真度预算分配策略的核心理念是什么?

单选题 · mid

  • A.只用高精度方法计算所有候选结构
  • B.用粗算快速初筛,精算复核候选← 正确答案
  • C.让所有计算任务同时并行执行
  • D.使用固定精度计算直到预算耗尽

答案:B。多保真度策略像漏斗一样,先用廉价粗算过滤大量候选,只对少量有希望的进行高精度验证。这比“全用高精度”省钱得多,也不同于“固定精度算到底”的朴素做法,与并行执行无关。

Q6. 搜索空间缩减中,“对称性商空间”直接利用了晶体的哪种性质?

单选题 · mid

  • A.元素化学价守恒
  • B.空间群对称操作← 正确答案
  • C.原子间距最小化
  • D.电子自旋极化

答案:B。空间群对称操作(旋转、镜像、平移等)会把一个结构映射为能量完全相同的等效结构,把所有等效结构合并为一个等价类,就能把搜索范围除以对称操作数。化学价、原子间距是多保真度筛选的经验约束,与商空间约化无关。

Q7. 以下哪些方法属于搜索空间缩减的常用手段?

多选题 · mid

  • A.施加空间群对称性约束← 正确答案
  • B.用机器学习模型排除不合理候选← 正确答案
  • C.增加温度参数提高随机性
  • D.基于化学价限制成键配位数← 正确答案

答案:ABD。对称性约束、机器学习预筛选和化学价约束都直接缩小了候选结构集合。而“增加温度参数”属于 Metropolis 搜索中的探索策略,目的是提高跳出的概率,并不会缩减搜索空间,反而会让采样更发散。

Q8. 关于并行搜索的 Amdahl 加速比,以下说法正确的有?

多选题 · mid

  • A.加速比上限由不可并行部分决定← 正确答案
  • B.核数越多加速比可以无限增长
  • C.能量评估占比越高加速效果越好← 正确答案
  • D.通信开销不影响实际加速比

答案:AC。Amdahl 定律指出,加速比上限为 1/(1-p),核数增加无法突破该上限,因此 B 错;能量评估是并行度最高的部分,占比越高可并行的 p 越大,加速效果越好;通信与同步开销会降低实际加速比,D 错。

Q9. 判断结构搜索已收敛的最稳妥标准是?

单选题 · hard

  • A.当前能量绝对值已低于某个常数
  • B.连续 K 代能量改进小于阈值 ε← 正确答案
  • C.种群中所有个体完全相同
  • D.已跑满预设的世代数上限

答案:B。连续多代能量改进极小,意味着继续搜索无实质收益,是标准的收敛判据。能量绝对值低只能说明当前结构好,不保证稳定;种群完全相同是“早熟”而非收敛;跑满代数只是预算用尽,与收敛无关。

Q10. 贝叶斯优化相比演化算法,以下说法正确的有?

多选题 · hard

  • A.通常具有更高的样本效率← 正确答案
  • B.在高维空间中更容易“迷路”← 正确答案
  • C.需要梯度信息才能建模
  • D.代理模型提供不确定度估计← 正确答案

答案:ABD。贝叶斯优化用代理模型捕捉能量景观,能以更少评估找到好解(样本效率高),但高斯过程等模型在高维下会退化“迷路”;代理模型不仅给预测均值还给不确定度,这是它擅长“探索-利用平衡”的根源。它不依赖梯度信息,C 错。