3. 多目标优化数学模型

搞多目标优化,第一步不是写代码,而是把实际问题翻译成数学语言。说白了,就是建立数学模型。

我个人习惯把这个过程拆成四块:决策变量、目标函数、约束条件和优化目标。这四块搞清楚了,后面求解才有方向。我今天就跟大伙儿聊聊这四块到底怎么搭。

3.1 决策变量:你能改的东西

决策变量,就是你手里能调节的旋钮。在数学上,我们用一组向量来表示:

x = (x₁, x₂, …, xₙ)

每个维度代表一个可调参数。可以是连续的,也可以是离散的。

类型 说明 举例
连续变量 值可在区间内任意取值 温度、压力、尺寸
离散变量 只能取有限个特定值 材料种类、档位选择
整数变量 必须是整数 拧螺丝的个数、工人数量

选变量要注意的事:

  • 能独立调节 — 变量之间别互相绑定太久
  • 有物理意义 — 别搞出“负长度”这种荒唐事
  • 别太多 — 曾经我接过一个项目,用户一口气列出了50个变量。结果跑一次优化得三天。后来压缩到15个关键变量,效果反而更好。变量多了不一定是好事
我的小习惯:先列所有候选变量,再跟领域专家过一遍。砍掉那些对目标影响小于5%的变量。模型越精简,求解越快。

3.2 目标函数:你想优化的东西

目标函数就是你想让它变好或变差的那个东西。多目标优化里,我们有多个这样的函数:

f(x) = (f₁(x), f₂(x), …, fₘ(x))

这 m 个函数可能是互相冲突的。比如发动机设计,你想功率大,又想油耗小。你看,这两件事往往就拧巴。

常见的分组方式:

  • 最小化目标 — 成本、重量、排放、时间,越小越好
  • 最大化目标 — 效率、强度、寿命、收益,越大越好

我在项目里经常遇到的坑,是同一个问题里既有最小化又有最大化。嗯,这里要注意:标准化处理。把所有目标统一成“越小越好”或“越大越好”,免得后面排序时搞混。

举个例子: 设计一个散热器。我们要最小化:体积、成本、压降。同时要最大化:散热量、可靠性。 建模时我会把最大化目标取个负号,全转成最小化问题。
# 统一成最小化问题
f₁(x) = 体积     (越小越好)
f₂(x) = 成本     (越小越好)
f₃(x) = 压降     (越小越好)
f₄(x) = -散热量  (取负,原越大越好变越小越好)
f₅(x) = -可靠性 (取负)

3.3 约束条件:你不能越过的线

约束条件,就是给决策变量划定活动范围。没有约束的优化,那叫放飞自我。实际上只要有约束,问题才真实。

形式上分成三类:

  1. 等式约束:g(x) = 0 — 必须严格满足,比如能量守恒方程
  2. 不等式约束:h(x) ≤ 0 — 允许一定的范围,比如应力不能超过许用值
  3. 边界约束:a ≤ x ≤ b — 每个变量的上下限

完整模型长这样:

Minimize:  f(x) = (f₁(x), f₂(x), …, fₘ(x))

Subject to:
  gᵢ(x) = 0,      i = 1, 2, …, p
  hⱼ(x) ≤ 0,      j = 1, 2, …, q
  a ≤ x ≤ b

我踩过的坑:有一次仿真老是收敛不了。查了三天,发现是某个约束条件写得太严了 — 把“小于等于”写成了“等于”。改成小于等于后,问题立刻有解了。约束条件不要拍脑袋写,要跟物理现实对一下。

特别注意: 约束太多会导致可行域变成空集,也就是无解。 建议先跑一次不带约束的优化,看看理想点在哪。再加约束慢慢收紧。

3.4 优化目标:你要找到什么样的解

有了决策变量、目标函数和约束条件,优化目标其实已经明确了 — 找到一组决策变量 x,让各个目标函数尽可能好,同时不违反任何约束。

不过这里有个微妙的地方:多目标优化的“最优”不是唯一的。因为目标之间有冲突,所以通常不存在一个解能让所有目标同时达到最好。

我们真正要找的,是Pareto 最优解集。这个下一章会细讲,我先简单说一句:

  • Pareto 最优解:任何一个目标都不能再变好,除非以恶化其他目标为代价
  • 所有 Pareto 最优解构成的集合,就是 Pareto 前沿
建模时要问自己三个问题:
  1. 我的决策变量能独立调节吗?
  2. 我的目标函数之间真的有冲突吗?
  3. 我的约束条件描述清楚了吗?
这三个问题能帮你避免走弯路。

下面这张图展示了我刚才说的四个要素之间的关系:

多目标优化数学模型核心要素 决策变量 可调参数 / 旋钮 目标函数 待优化的指标 约束条件 可行的范围 输入 输入 优化目标 找到 Pareto 最优解集 最终的数学模型形式 Minimize f(x) subject to g(x)=0, h(x) ≤ 0
给新人的建议: 第一次建模别求完美。先搭一个最简单的版本跑通流程,再一步步加细节。 我见过太多人一上来就搞复杂的约束,最后连问题都定义不清楚。

嗯,到这为止,数学模型的核心骨架已经讲清楚了。我们归纳一下:

  • 决策变量 — 你手里能调的参数,x = (x₁, …, xₙ)
  • 目标函数 — 你想优化的指标,f(x) = (f₁, …, fₘ)
  • 约束条件 — 问题本身的物理/工程限制,g(x)=0, h(x)≤0
  • 优化目标 — 在可行域中找到 Pareto 最优解集
建模六步法(我自己总结的):
  1. 列出所有可调参数 → 决策变量
  2. 列出所有关心的性能 → 目标函数
  3. 列出所有必须满足的限制 → 约束条件
  4. 确认目标之间是否存在冲突
  5. 写出完整的数学模型表达式
  6. 试跑一次简单版本验证模型合理性

数学建模是一个反复迭代的过程。别指望一次到位,边跑边改是常态。