9. 多目标优化概念#

备注

本页介绍多目标优化的基本概念以及它们如何应用于材料设计问题。

9.1. 什么是多目标优化?#

多目标优化(MOO)处理需要同时优化多个通常相互冲突的目标的问题。与寻求一个最优解的单目标优化不同,MOO 通常会产生一组称为帕累托前沿的权衡解。

实际示例

考虑设计一种新合金:

  • 目标 1:最大化强度(越高越好)

  • 目标 2:最大化延展性(越高越好)

  • 目标 3:最小化成本(越低越好)

这些目标经常冲突:更强的合金可能更脆(延展性更低)且更昂贵。

9.2. 关键概念#

9.2.1. 帕累托支配#

如果一个解在至少一个目标上更好,并且在所有其他目标上不差,则该解支配另一个解。

# Example: Two alloy compositions
Alloy_A = [Strength=250, Ductility=15, Cost=100]
Alloy_B = [Strength=240, Ductility=15, Cost=100]

# Alloy A dominates Alloy B because:
# - Strength: 250 > 240 (better)
# - Ductility: 15 = 15 (equal)
# - Cost: 100 = 100 (equal)

9.2.2. 帕累托前沿#

帕累托前沿(或帕累托边界)是所有非支配解的集合。这些代表目标之间最佳可能的权衡。

强度 vs. 延展性权衡:

延展性
    ^
    |     * (帕累托最优)
    |   *   * (帕累托最优)
    | *       * (帕累托最优)
    |           * (帕累托最优)
    |             *
    +----------------> 强度

曲线上的点是帕累托最优的。
曲线下方的点被支配。

9.2.3. 帕累托最优性#

如果没有其他解支配它,则该解是帕累托最优的。多目标优化的目标是找到帕累托前沿。

9.3. 数学表述#

9.3.1. 一般多目标问题#

minimize/maximize: f(x) = [f₁(x), f₂(x), ..., fₘ(x)]
subject to: g(x) ≤ 0
           h(x) = 0
           x ∈ X

其中:

  • f(x):m 个目标函数的向量

  • g(x):不等式约束

  • h(x):等式约束

  • X:决策变量空间

9.3.2. 材料设计示例#

对于合金优化:

maximize: f₁(x) = Strength(Cu, Mg, Si, T_aging)
maximize: f₂(x) = Ductility(Cu, Mg, Si, T_aging)
minimize: f₃(x) = Cost(Cu, Mg, Si, T_aging)

subject to: Cu + Mg + Si ≤ 10%  (composition constraint)
           150 ≤ T_aging ≤ 200   (temperature constraint)
           Cu, Mg, Si ≥ 0        (non-negativity)

9.4. 多目标 vs. 单目标#

表 9.1 比较#

方面

单目标

多目标

一个最优点

一组权衡解(帕累托前沿)

决策制定

自动

需要偏好信息

复杂性

较低

较高(维度诅咒)

可视化

容易(1D 或 2D)

困难(高维)

算法

成熟

更复杂,较新的领域

9.5. 多目标优化中的挑战#

9.5.1. 1. 冲突目标#

大多数实际问题涉及权衡:

# Materials examples
conflicts = {
    "Strength vs. Ductility": "Stronger materials are often more brittle",
    "Performance vs. Cost": "Better performance usually costs more",
    "Conductivity vs. Stability": "High conductivity may reduce thermal stability",
    "Hardness vs. Toughness": "Harder materials may be less tough"
}

9.5.2. 2. 维度诅咒#

随着目标数量的增加,问题变得指数级复杂:

  • 2-3 个目标:可管理,良好的可视化

  • 4-6 个目标:具有挑战性,有限的可视化

  • >6 个目标:非常困难,多目标优化

9.5.3. 3. 解的选择#

帕累托前沿提供多个解,但我们通常需要选择一个:

  • 先验:在优化之前定义偏好

  • 后验:在优化之后从帕累托前沿中选择

  • 交互式:在优化过程中迭代地细化偏好

9.6. 多目标贝叶斯优化 (MOBO)#

MOBO 通过以下方式扩展贝叶斯优化以处理多个目标:

  1. 代理模型:为每个目标构建单独的模型

  2. 多目标采集:使用考虑所有目标的采集函数

  3. 帕累托前沿近似:迭代改进帕累托前沿估计

9.6.1. 主要优势#

为什么材料需要 MOBO?

  • 昂贵的实验:材料测试成本高且耗时

  • 多个性能:材料具有许多重要性能

  • 权衡理解:需要理解性能之间的关系

  • 高效探索:用最少的实验找到帕累托前沿

9.7. MOBO 采集函数#

9.7.1. 期望超体积提升 (EHVI)#

EHVI 最大化超体积(支配目标空间的体积)的期望提升:

EHVI(x) = E[HV(F ∪ {f(x)}) - HV(F)]

其中:

  • F:当前帕累托前沿近似

  • HV:超体积指标

  • f(x):点 x 处的目标向量

最适合:2-4 个目标,平衡探索

9.7.2. q-噪声期望超体积提升 (qNEHVI)#

qNEHVI 扩展 EHVI 以处理噪声观测和批量采集,使其适用于具有测量不确定性和并行实验的实际场景:

qNEHVI(x) = E_y[E[HV(F ∪ {f(x)}) - HV(F)]]

其中:

  • y:噪声观测

  • HV:超体积指标

  • f(x):点 x 处的目标向量

最适合:测量具有显著的观测噪声

9.7.3. 改进概率 (PI)#

多目标 PI 考虑每个目标的改进概率:

PI(x) = P(f(x) dominates at least one point in F)

最适合:保守优化,以利用为重点

9.7.4. 上置信界 (UCB)#

多目标 UCB 平衡均值预测和不确定性:

UCB(x) = μ(x) + β·σ(x)

分别应用于每个目标或组合应用。

最适合:有噪声的目标,以探索为重点

9.8. 超体积指标#

超体积是帕累托前沿的关键质量指标:

HV(F) = Volume of space dominated by F

9.8.1. 性质#

  • 单调性:更大的超体积 = 更好的帕累托前沿

  • 帕累托兼容:尊重帕累托支配

  • 参考点依赖:需要参考点

9.8.2. 计算示例#

对于 2D 目标(两者都最大化):

# Pareto front points
pareto_points = [(3, 1), (2, 2), (1, 3)]
reference_point = (0, 0)

# Hypervolume = sum of dominated rectangles
# Rectangle 1: (3-0) × (1-0) = 3
# Rectangle 2: (2-0) × (2-1) = 2
# Rectangle 3: (1-0) × (3-2) = 1
# Total HV = 3 + 2 + 1 = 6

9.9. 实际考虑#

9.9.1. 目标缩放#

不同的目标可能具有不同的尺度:

# Before scaling
objectives = {
    "Strength": [200, 300, 250],      # MPa
    "Ductility": [10, 20, 15],       # %
    "Cost": [50, 100, 75]            # $/kg
}

# After normalization (0-1 scale)
normalized = {
    "Strength": [0.0, 1.0, 0.5],
    "Ductility": [0.0, 1.0, 0.5],
    "Cost": [0.0, 1.0, 0.5]
}

9.9.2. 参考点选择#

对于超体积计算,仔细选择参考点:

# Good reference point (slightly worse than worst known values)
reference_point = [min_strength - 0.1*range_strength,
                  min_ductility - 0.1*range_ductility,
                  max_cost + 0.1*range_cost]  # Note: max for minimization

9.9.3. 目标转换#

将最小化转换为最大化:

# Original objectives
strength = 250      # maximize
ductility = 15      # maximize
cost = 100          # minimize

# Transformed for maximization
objectives = [strength, ductility, -cost]  # Negate cost

9.10. 材料设计应用#

9.10.1. 合金成分优化#

# Objectives for structural alloys
objectives = [
    "Yield Strength",     # Maximize
    "Ultimate Strength",  # Maximize
    "Elongation",        # Maximize
    "Fatigue Life",      # Maximize
    "Cost",              # Minimize
    "Density"            # Minimize (for aerospace)
]

9.10.2. 加工参数优化#

# Heat treatment optimization
objectives = [
    "Hardness",          # Maximize
    "Toughness",         # Maximize
    "Residual Stress",   # Minimize
    "Energy Cost",       # Minimize
    "Processing Time"    # Minimize
]

9.10.3. 多功能材料#

# Electronic materials
objectives = [
    "Electrical Conductivity",  # Maximize
    "Thermal Conductivity",     # Maximize/Minimize (depends on application)
    "Mechanical Strength",      # Maximize
    "Corrosion Resistance",     # Maximize
    "Manufacturing Cost"        # Minimize
]

9.11. 可视化技术#

9.11.1. 2D 帕累托前沿#

import matplotlib.pyplot as plt

# Plot Pareto front
plt.scatter(strength_values, ductility_values, c='red', label='Pareto Front')
plt.xlabel('Strength (MPa)')
plt.ylabel('Ductility (%)')
plt.title('Strength vs. Ductility Trade-off')

9.11.2. 3D 帕累托前沿#

from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(strength, ductility, cost, c='red')
ax.set_xlabel('Strength')
ax.set_ylabel('Ductility')
ax.set_zlabel('Cost')

9.11.3. 平行坐标#

对于 >3 个目标,使用平行坐标图:

import pandas as pd
from pandas.plotting import parallel_coordinates

# Create DataFrame with objectives
df = pd.DataFrame({
    'Strength': strength_values,
    'Ductility': ductility_values,
    'Cost': cost_values,
    'Corrosion': corrosion_values,
    'Type': 'Pareto'
})

parallel_coordinates(df, 'Type')

9.12. 决策制定#

9.12.1. 基于偏好的选择#

找到帕累托前沿后,根据偏好选择解:

# Weight-based selection
weights = [0.4, 0.3, 0.3]  # [strength, ductility, cost]

# Calculate weighted sum for each Pareto solution
scores = []
for solution in pareto_front:
    score = sum(w * obj for w, obj in zip(weights, solution))
    scores.append(score)

# Select solution with highest score
best_index = np.argmax(scores)
selected_solution = pareto_front[best_index]

9.12.2. 膝点选择#

“膝点”代表最佳折衷:

# Find knee point (maximum distance from line connecting extremes)
def find_knee_point(pareto_front):
    # Implementation depends on specific algorithm
    # Common approaches: maximum perpendicular distance, angle-based
    pass

9.13. 下一步#

现在您了解了多目标概念:

  1. 学习 MOBO 算法MultiBgolearn 中的 MOBO 算法

  2. 尝试 MultiBgolearnMultiBgolearn:多目标贝叶斯全局优化

  3. 通过示例练习多目标优化示例

  4. 探索帕累托优化帕累托优化和权衡分析

参见

更深入的理解:

  • Deb, K. “Multi-Objective Optimization using Evolutionary Algorithms”

  • Coello, C.A.C. “Evolutionary Algorithms for Solving Multi-Objective Problems”

  • Miettinen, K. “Nonlinear Multiobjective Optimization”