问题建模基础:决策变量、目标函数、约束条件、可行域定义、数学表达式的规范化写法
好,咱们正式开始聊多目标优化的核心——问题建模。
说实话,我见过太多同学一上来就调算法、跑代码,结果模型建得稀里糊涂。最后跑出来的结果,自己都不敢信。嗯,这其实是个大坑。我个人习惯是,花 60% 的时间把模型定义清楚,剩下 40% 的时间去求解。模型对了,结果才有意义。
这一节,咱们就把建模的五个核心要素掰开揉碎讲清楚:决策变量、目标函数、约束条件、可行域、数学表达式规范。
1. 决策变量:你手里能动的「旋钮」
决策变量,说白了就是你能控制的东西。你想想看,一个优化问题里,哪些参数是你说了算的?
比如你要设计一辆车,那发动机功率、车身长度、轮胎尺寸,这些就是决策变量。你不能控制天气,也不能控制油价,那些不是变量。
数学上,我们通常用向量来表示:
x = (x₁, x₂, ..., xₙ)ᵀ
这里的 x 就是决策变量向量。每个 xᵢ 代表一个具体的可调参数。
- 这个变量我真的能控制吗?
- 它是否独立于其他变量?
- 它的取值范围是否明确?
2. 目标函数:你要优化的「指标」
目标函数就是你关心的东西。在多目标优化里,通常不止一个。
举个例子,我做过一个供应链优化的项目。老板说:「我要成本最低,同时交货速度最快。」你看,这就是两个目标,而且它们往往是冲突的——成本低了,可能速度就慢了。
数学上,我们写成:
minimize f(x) = (f₁(x), f₂(x), ..., fₘ(x))ᵀ
这里的 f₁(x) 是成本,f₂(x) 是交货时间。注意,所有目标函数放在一个向量里。
3. 约束条件:你不能越过的「红线」
约束条件就是限制。没有约束的优化,那叫「放飞自我」,现实中不存在。
约束分两种:
- 等式约束: h(x) = 0。比如预算必须花完,不能多不能少。
- 不等式约束: g(x) ≤ 0。比如重量不能超过 2 吨。
我曾经犯过一个错:把不等式约束写反了符号。结果跑出来的解全是不可行的。嗯,那感觉就像你导航设反了方向,开了一百公里才发现。从那以后,我每次写完约束都会手动检查一遍符号。
标准写法:
subject to:
gᵢ(x) ≤ 0, i = 1, 2, ..., p
hⱼ(x) = 0, j = 1, 2, ..., q
4. 可行域:你能「活动」的范围
可行域就是所有满足约束条件的决策变量组成的集合。说白了,就是你能「站」的地方。
数学定义:
Ω = { x ∈ ℝⁿ | gᵢ(x) ≤ 0, hⱼ(x) = 0 }
Ω 就是可行域。如果 Ω 是空集,那问题无解。我遇到过这种情况,当时排查了半天,发现是约束条件太苛刻,互相矛盾了。所以,定义完约束后,先检查一下可行域是否非空。
5. 数学表达式的规范化写法
这一块很多人不重视,但我觉得特别重要。规范的写法,不仅让别人看得懂,也能让自己少犯错。
我总结了一个标准模板:
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
x ∈ ℝⁿ
几点规范:
- 目标函数统一用
minimize,最大化问题可以加负号转成最小化 - 约束条件写在
subject to下面 - 所有变量和函数都要有明确的定义域
- 下标从 1 开始,不要从 0 开始(数学惯例)
知识体系结构图
下面这张图,帮你把这一节的核心逻辑串起来:
一个完整的例子
咱们来看一个实际案例。假设你要设计一个电池包,要求:
- 能量密度尽可能高
- 成本尽可能低
- 重量不超过 500 kg
- 体积不超过 0.3 m³
建模如下:
决策变量:
x₁ = 电池单体数量
x₂ = 单体容量 (Ah)
x₃ = 单体电压 (V)
目标函数:
minimize f₁(x) = -x₁ * x₂ * x₃ (最大化能量密度,取负号)
minimize f₂(x) = x₁ * 0.5 + x₂ * 2.0 (成本,单位:元)
约束条件:
g₁(x) = x₁ * x₂ * x₃ / 1000 - 500 ≤ 0 (重量约束)
g₂(x) = x₁ * 0.01 - 0.3 ≤ 0 (体积约束)
x₁ ∈ ℕ, x₂ ∈ [10, 100], x₃ ∈ [3.2, 3.7]
你看,这样写出来,清清楚楚。哪个是变量,哪个是目标,哪个是约束,一目了然。
好了,这一节的内容就到这里。记住,模型建好了,后面的事情就顺了。