3. 多目标优化数学模型
搞多目标优化,第一步不是写代码,而是把实际问题翻译成数学语言。说白了,就是建立数学模型。
我个人习惯把这个过程拆成四块:决策变量、目标函数、约束条件和优化目标。这四块搞清楚了,后面求解才有方向。我今天就跟大伙儿聊聊这四块到底怎么搭。
3.1 决策变量:你能改的东西
决策变量,就是你手里能调节的旋钮。在数学上,我们用一组向量来表示:
x = (x₁, x₂, …, xₙ)
每个维度代表一个可调参数。可以是连续的,也可以是离散的。
| 类型 | 说明 | 举例 |
|---|---|---|
| 连续变量 | 值可在区间内任意取值 | 温度、压力、尺寸 |
| 离散变量 | 只能取有限个特定值 | 材料种类、档位选择 |
| 整数变量 | 必须是整数 | 拧螺丝的个数、工人数量 |
选变量要注意的事:
- 能独立调节 — 变量之间别互相绑定太久
- 有物理意义 — 别搞出“负长度”这种荒唐事
- 别太多 — 曾经我接过一个项目,用户一口气列出了50个变量。结果跑一次优化得三天。后来压缩到15个关键变量,效果反而更好。变量多了不一定是好事
3.2 目标函数:你想优化的东西
目标函数就是你想让它变好或变差的那个东西。多目标优化里,我们有多个这样的函数:
f(x) = (f₁(x), f₂(x), …, fₘ(x))
这 m 个函数可能是互相冲突的。比如发动机设计,你想功率大,又想油耗小。你看,这两件事往往就拧巴。
常见的分组方式:
- 最小化目标 — 成本、重量、排放、时间,越小越好
- 最大化目标 — 效率、强度、寿命、收益,越大越好
我在项目里经常遇到的坑,是同一个问题里既有最小化又有最大化。嗯,这里要注意:标准化处理。把所有目标统一成“越小越好”或“越大越好”,免得后面排序时搞混。
# 统一成最小化问题
f₁(x) = 体积 (越小越好)
f₂(x) = 成本 (越小越好)
f₃(x) = 压降 (越小越好)
f₄(x) = -散热量 (取负,原越大越好变越小越好)
f₅(x) = -可靠性 (取负)
3.3 约束条件:你不能越过的线
约束条件,就是给决策变量划定活动范围。没有约束的优化,那叫放飞自我。实际上只要有约束,问题才真实。
形式上分成三类:
- 等式约束:g(x) = 0 — 必须严格满足,比如能量守恒方程
- 不等式约束:h(x) ≤ 0 — 允许一定的范围,比如应力不能超过许用值
- 边界约束: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 前沿
- 我的决策变量能独立调节吗?
- 我的目标函数之间真的有冲突吗?
- 我的约束条件描述清楚了吗?
下面这张图展示了我刚才说的四个要素之间的关系:
嗯,到这为止,数学模型的核心骨架已经讲清楚了。我们归纳一下:
- 决策变量 — 你手里能调的参数,x = (x₁, …, xₙ)
- 目标函数 — 你想优化的指标,f(x) = (f₁, …, fₘ)
- 约束条件 — 问题本身的物理/工程限制,g(x)=0, h(x)≤0
- 优化目标 — 在可行域中找到 Pareto 最优解集
- 列出所有可调参数 → 决策变量
- 列出所有关心的性能 → 目标函数
- 列出所有必须满足的限制 → 约束条件
- 确认目标之间是否存在冲突
- 写出完整的数学模型表达式
- 试跑一次简单版本验证模型合理性
数学建模是一个反复迭代的过程。别指望一次到位,边跑边改是常态。