2026美赛期间会持续更新相关内容,所有内容会发布到专栏内,会结合最新的chatgpt发布,只需订阅一次,赛后两天半价,内容达不到所有人预期,请勿盲目订阅!!!无论文!无论文!!!
摘要
多目标优化是现代数学建模中处理复杂决策问题的核心方法之一。本文从数学建模竞赛的实用视角出发,系统阐述多目标优化的理论基础、建模方法、求解技术及实际应用。首先介绍多目标优化的核心概念与数学模型,包括Pareto最优解、目标空间与决策空间等基本概念;其次分析其适用场景与典型赛题类型;接着详细说明具体建模步骤与关键技巧;然后提供常用求解工具和代码示例;通过一个完整的美赛简化案例展示全过程;最后讨论该方法的优缺点及改进方向。本文旨在为数学建模参赛者提供一套完整的多目标优化建模指南。
关键词:多目标优化;Pareto最优;数学建模;多目标进化算法;决策分析
1. 核心思想与数学模型
1.1 多目标优化问题的本质
在现实世界的决策问题中,决策者往往需要同时考虑多个相互冲突的目标。例如,在产品设计中,我们需要同时考虑成本最小化、性能最大化、可靠性最大化等多个目标;在资源分配中,我们需要平衡效率、公平性、可持续性等多个维度。单目标优化将多个目标通过加权求和等方式转化为单一目标,这种方法存在明显的局限性:权重分配的主观性、目标间量纲不一致性、以及无法获得权衡解集等。
多目标优化(Multi-objective Optimization, MOO)的核心思想是:同时优化多个相互冲突的目标,寻找一组折衷解(称为Pareto最优解集),而非单一最优解。这为决策者提供了多种可行的解决方案,使他们能够根据具体情境和偏好做出最终选择。
1.2 基本数学模型
一个标准的无约束多目标优化问题可以形式化表示为:
minx∈ΩF(x)=(f1(x),f2(x),…,fm(x))T其中Ω⊆Rnx∈ΩminF(x)=(f1(x),f2(x),…,fm(x))T其中Ω⊆Rn
式中:
-
$x = (x_1, x_2, \\ldots, x_n)^T$ 是决策变量向量
-
$\\Omega$ 是决策变量的可行域
-
$F: \\mathbb{R}^n \\rightarrow \\mathbb{R}^m$ 是由$m$个目标函数构成的向量函数
-
$m \\geq 2$,即至少有两个目标函数
对于约束多目标优化问题,还需加入约束条件:
minx∈ΩF(x)=(f1(x),f2(x),…,fm(x))Ts.t.gi(x)≤0,i=1,2,…,phj(x)=0,j=1,2,…,qx∈Ω⊆Rnx∈ΩminF(x)=(f1(x),f2(x),…,fm(x))Ts.t.gi(x)≤0,i=1,2,…,phj(x)=0,j=1,2,…,qx∈Ω⊆Rn
1.3 核心概念
1.3.1 Pareto占优关系
对于两个解$x^1, x^2 \\in \\Omega$,定义以下关系:
严格占优:$x^1$严格占优$x^2$(记作$x^1 \\prec x^2$)当且仅当:
∀i∈{1,2,…,m}:fi(x1)≤fi(x2)且∃j:fj(x1)<fj(x2)∀i∈{1,2,…,m}:fi(x1)≤fi(x2)且∃j:fj(x1)<fj(x2)
弱占优:$x^1$弱占优$x^2$(记作$x^1 \\preceq x^2$)当且仅当:
∀i∈{1,2,…,m}:fi(x1)≤fi(x2)∀i∈{1,2,…,m}:fi(x1)≤fi(x2)
不可比:如果$x^1$既不占优$x^2$,也不被$x^2$占优,则称两者不可比。
1.3.2 Pareto最优解
Pareto最优解(非劣解):解$x^* \\in \\Omega$被称为Pareto最优解,当且仅当不存在$x \\in \\Omega$使得$x$占优$x^*$。即:
∄x∈Ω:x≺x∗∄x∈Ω:x≺x∗
Pareto最优解集:所有Pareto最优解的集合:
P∗={x∗∈Ω∣∄x∈Ω:x≺x∗}P∗={x∗∈Ω∣∄x∈Ω:x≺x∗}
Pareto前沿:Pareto最优解集在目标空间中的像:
PF∗={F(x∗)=(f1(x∗),f2(x∗),…,fm(x∗))T∣x∗∈P∗}PF∗={F(x∗)=(f1(x∗),f2(x∗),…,fm(x∗))T∣x∗∈P∗}
1.3.3 理想点与Nadir点
理想点:$z^* = (z_1^, z_2^, \\ldots, z_m^)^T$,其中$z_i^ = \\min_{x \\in \\Omega} f_i(x)$
-
理想点通常不可行(除非所有目标函数同时达到最优)
Nadir点:$z^{\\text{nad}} = (z_1^{\\text{nad}}, z_2^{\\text{nad}}, \\ldots, z_m^{\\text{nad}})^T$,其中$z_i^{\\text{nad}} = \\max_{x \\in P^*} f_i(x)$
-
Nadir点表示Pareto最优解集中各目标函数可能的最差值
1.4 多目标优化的数学特性
多目标优化问题与单目标优化有本质区别:
解的不唯一性:通常存在无限多个Pareto最优解
目标间的冲突性:改善一个目标往往以牺牲其他目标为代价
解的评价复杂性:需要比较向量而非标量值
决策的两阶段过程:第一阶段生成Pareto最优解集,第二阶段基于偏好选择最终解
1.5 多目标优化问题分类
根据目标函数和约束的性质,多目标优化问题可分为:
凸多目标问题:所有目标函数和可行域均为凸
非凸多目标问题:至少一个目标函数或约束非凸
线性多目标问题:所有目标函数和约束均为线性
非线性多目标问题:至少一个目标函数或约束非线性
连续多目标问题:决策变量连续
离散多目标问题:决策变量离散
混合多目标问题:决策变量既有连续又有离散
2. 适用场景与典型赛题类型
2.1 多目标优化的适用场景
多目标优化适用于任何需要权衡多个目标的决策场景,特别是当目标之间存在冲突时。常见应用领域包括:
工程设计:成本vs性能vs可靠性
资源分配:效率vs公平性vs可持续性
路径规划:时间最短vs成本最低vs安全性最高
投资组合:收益最大化vs风险最小化
生产调度:完成时间最小化vs资源利用率最大化vs能耗最小化
环境管理:经济效益vs环境影响vs社会接受度
机器学习:模型复杂度vs预测精度vs解释性
2.2 数学建模竞赛中的典型赛题类型
在数学建模竞赛(如MCM/ICM、全国大学生数学建模竞赛等)中,多目标优化问题常见于以下几类赛题:
2.2.1 资源分配与调度类
特点:有限资源分配给多个任务或用户,需平衡多个目标。 典型问题:
-
疫情期间医疗资源分配(公平性vs效率vs成本)
-
水资源调度(农业用水vs工业用水vs生活用水)
-
能源系统优化(经济性vs可靠性vs环保性)
实例:2020年美赛D题"团队合作策略"涉及工作效率、公平性和可持续性多个目标。
2.2.2 路径规划与网络优化类
特点:在图中寻找最优路径或网络结构,需考虑多个优化指标。 典型问题:
-
物流配送路径优化(成本vs时间vs碳排放)
-
通信网络设计(覆盖范围vs建设成本vs服务质量)
-
交通流优化(通行时间最小化vs拥堵最小化vs污染最小化)
实例:2018年美赛B题"多少种语言"涉及信息传播效率与成本的多目标权衡。
2.2.3 设计优化类
特点:设计系统参数或结构,满足多个性能指标。 典型问题:
-
建筑结构设计(安全性vs经济性vs美观性)
-
产品参数设计(性能vs成本vs可靠性)
-
生态系统设计(生物多样性vs稳定性vs生产力)
实例:2019年美赛C题"阿片类药物危机"涉及预防效果、成本和社会影响的多目标平衡。
2.2.4 投资决策类
特点:分配资金到不同项目,平衡收益与风险。 典型问题:
-
投资组合优化(期望收益最大化vs风险最小化)
-
研发项目选择(技术价值vs商业价值vs可行性)
-
基础设施建设投资(经济效益vs社会效益vs环境效益)
2.2.5 环境与可持续发展类
特点:平衡经济发展与环境保护。 典型问题:
-
土地利用规划(农业产出vs生态保护vs城市发展)
-
污染物减排策略(减排效果vs经济成本vs技术可行性)
-
可再生能源规划(能源供应可靠性vs投资成本vs环境影响)
实例:2021年美赛F题"检查高等教育的脉搏"涉及教育质量、可及性和成本的多目标优化。
2.3 如何识别多目标优化问题
在建模竞赛中,识别多目标优化问题的关键线索包括:
问题陈述中出现多个"最优"、"最小"、"最大":如"最小化成本同时最大化效益"
存在明显的权衡关系:改善一个指标会导致其他指标恶化
问题涉及多个利益相关方:不同群体有不同的优先级和目标
评分标准包含多个维度:如方案的效率、公平性、可持续性等
3. 具体建模步骤与关键技巧
3.1 多目标优化建模的一般步骤
步骤1:问题分析与目标识别
理解问题背景:深入分析问题描述,明确需求
识别所有相关目标:列出所有可能的目标,包括显式目标和隐式目标
确定目标间关系:分析目标间的协同或冲突关系
区分硬约束与软约束:硬约束必须满足,软约束可作为目标处理
关键技巧:
-
使用目标树或目标层次结构图梳理目标关系
-
与领域专家或利益相关者沟通确认目标重要性
-
考虑不同时间尺度下的目标变化
步骤2:决策变量与参数定义
识别决策变量:确定决策者可控制的变量
确定参数与常数:明确问题中的已知数据和参数
定义变量类型与范围:连续、离散、整数、二进制等
关键技巧:
-
尽量保持变量维度可管理(避免"维数灾难")
-
使用有物理意义的变量命名
-
考虑变量归一化以改善数值稳定性
步骤3:目标函数数学表达
为每个目标建立数学表达式:将定性目标定量化
处理量纲不一致性:考虑无量纲化或标准化
处理目标方向:统一为最小化或最大化问题
关键技巧:
-
对于难以量化的目标,可使用代理指标或满意度函数
-
使用分段函数处理阈值效应
-
考虑目标函数的凸性、连续性等数学性质
步骤4:约束条件数学表达
资源约束:如预算、时间、容量限制
物理约束:如质量守恒、能量守恒
技术约束:如性能要求、安全标准
政策约束:如法规要求、伦理限制
关键技巧:
-
区分等式约束和不等式约束
-
避免冗余约束以减少计算复杂度
-
小心处理矛盾约束(无可行解情况)
步骤5:模型集成与规范化
整合所有目标函数和约束:形成完整的数学模型
规范化模型形式:统一为最小化问题形式
模型简化与近似:在保持精度的前提下简化模型
关键技巧:
-
使用向量形式简洁表达多目标问题
-
记录所有假设和简化理由
-
进行模型灵敏度和鲁棒性初步分析
3.2 多目标优化求解策略
3.2.1 先验方法(偏好驱动)
在求解前表达决策者偏好,将多目标问题转化为单目标问题:
加权和法:
minx∈Ω∑i=1mwifi(x),wi≥0,∑i=1mwi=1x∈Ωmini=1∑mwifi(x),wi≥0,i=1∑mwi=1
优点:简单直观,可利用成熟的单目标优化技术 缺点:无法获得非凸Pareto前沿;权重选择主观
ε-约束法: 选择一个主要目标,将其他目标转化为约束:
minx∈Ωfk(x)s.t.fi(x)≤εi,i=1,…,m,i≠kx∈Ωminfk(x)s.t.fi(x)≤εi,i=1,…,m,i=k
优点:能获得非凸Pareto前沿;控制灵活 缺点:ε值选择困难;可能无可行解
目标规划法: 最小化与目标值的偏差:
minx∈Ω∑i=1m∣fi(x)−Ti∣px∈Ωmini=1∑m∣fi(x)−Ti∣p
优点:直观反映决策者期望;可处理优先级 缺点:目标值设定主观;可能错过更好解
3.2.2 后验方法(生成驱动)
首先生成Pareto最优解集,然后由决策者选择:
多目标进化算法:NSGA-II、SPEA2、MOEA/D等
多目标粒子群优化:MOPSO
多目标模拟退火:MOSA
标量化方法:加权和法配合系统权重变化
优点:提供完整权衡信息;无需事先偏好 缺点:计算成本高;解集质量评估困难
3.2.3 交互式方法
求解过程中逐步获取决策者偏好:
逐步法:迭代展示解,获取反馈,调整搜索方向
参考点法:决策者提供期望解,算法寻找最接近的解
权衡分析法:展示目标间权衡关系,获取偏好信息
优点:结合决策者认知;减少无关解生成 缺点:需要决策者深度参与;收敛速度依赖反馈质量
3.3 多目标优化建模的关键技巧
技巧1:目标处理技巧
目标归一化:解决量纲和量级差异
-
最小-最大归一化:$f_i'(x) = \\frac{f_i(x) – f_i^{\\min}}{f_i^{\\max} – f_i^{\\min}}$
-
z-score标准化:$f_i'(x) = \\frac{f_i(x) – \\mu_i}{\\sigma_i}$
冲突目标识别:使用相关系数矩阵识别目标间冲突程度
目标约简:对于高度相关的目标,可考虑合并或选择代表性目标
技巧2:约束处理技巧
约束松弛:将硬约束转化为带惩罚项的软约束
F′(x)=F(x)+λ∑j=1pmax(0,gj(x))2F′(x)=F(x)+λj=1∑pmax(0,gj(x))2
可行解保持:在进化算法中使用可行性规则
-
可行解优先于不可行解
-
在可行解中,基于目标值排序
-
在不可行解中,基于约束违反程度排序
修复算子:将不可行解修复为可行解
技巧3:解集质量评估
收敛性指标:
-
世代距离(GD):衡量解集到真实Pareto前沿的距离
-
反转世代距离(IGD):衡量真实Pareto前沿到解集的距离
分布性指标:
-
间距(Spacing):衡量解在目标空间中的均匀性
-
多样性指标:如最大扩散度、方差等
综合性指标:
-
超体积(HV):解集支配区域的体积
-
R2指标:基于效用函数的期望值
技巧4:大规模问题处理
决策变量分组:基于变量相关性进行分组优化
目标分解:将高维目标空间分解为子空间
代理模型:使用响应面、Kriging等模型近似昂贵目标函数
并行计算:利用多核/多机并行评估解
4. 常用求解工具/代码示例
4.1 常用多目标优化工具库
4.1.1 Python工具库
Platypus:纯Python实现的多目标优化库
-
支持多种算法:NSGA-II、NSGA-III、MOEA/D等
-
提供丰富的问题类型和约束处理
pymoo:功能强大的多目标优化框架
-
算法丰富:NSGA2、NSGA3、MOEAD、SMS-EMOA等
-
可视化工具完善
DEAP:分布式进化算法框架
-
高度模块化,易于定制
-
支持多种进化计算范式
Scipy:基础优化库
-
适用于简单多目标问题
-
可与加权和法、ε-约束法等结合使用
4.1.2 MATLAB工具
MATLAB优化工具箱
-
gamultiobj:多目标遗传算法
-
paretosearch:Pareto搜索算法
YALMIP
-
建模语言,支持多目标优化
-
可调用多种求解器
MATLAB全局优化工具箱
-
提供多种多目标优化算法
4.1.3 商业软件
ModeFrontier:专业多目标优化平台
Optimus:多学科设计优化平台
LS-OPT:有限元分析与优化集成平台
4.2 代码示例:使用pymoo解决ZDT测试问题
python
import numpy as np
from pymoo.algorithms.moo.nsga2 import NSGA2
from pymoo.problems import get_problem
from pymoo.optimize import minimize
from pymoo.visualization.scatter import Scatter
# 定义问题
problem = get_problem("zdt1")
n_var = 30 # 决策变量维度
# 配置算法
algorithm = NSGA2(
pop_size=100,
eliminate_duplicates=True
)
# 求解问题
res = minimize(problem,
algorithm,
('n_gen', 200),
seed=1,
verbose=False)
# 获取Pareto前沿
pf = problem.pareto_front()
# 可视化
plot = Scatter(title="ZDT1 – NSGA-II")
plot.add(problem.pareto_front(), plot_type="line", color="black", alpha=0.7)
plot.add(res.F, color="red", s=30)
plot.show()
# 输出指标
print(f"解数量: {len(res.F)}")
print(f"超体积(HV): {res.opt.get('HV')}")
print(f"IGD: {res.opt.get('IGD')}")
4.3 代码示例:自定义多目标优化问题
python
import numpy as np
from pymoo.core.problem import Problem
from pymoo.algorithms.moo.nsga2 import NSGA2
from pymoo.optimize import minimize
from pymoo.visualization.scatter import Scatter
# 自定义多目标优化问题
class MyMultiObjectiveProblem(Problem):
def __init__(self):
super().__init__(n_var=3, # 3个决策变量
n_obj=2, # 2个目标
n_constr=2, # 2个约束
xl=np.array([0, 0, 0]), # 下界
xu=np.array([5, 5, 5])) # 上界
def _evaluate(self, X, out, *args, **kwargs):
# 目标1: 最小化 f1 = x1^2 + x2^2 + x3^2
f1 = np.sum(X**2, axis=1)
# 目标2: 最小化 f2 = (x1-3)^2 + (x2-3)^2 + (x3-3)^2
f2 = np.sum((X – 3)**2, axis=1)
# 约束1: x1 + x2 + x3 ≥ 2
g1 = 2 – np.sum(X, axis=1)
# 约束2: x1^2 + x2^2 + x3^2 ≤ 20
g2 = np.sum(X**2, axis=1) – 20
out["F"] = np.column_stack([f1, f2])
out["G"] = np.column_stack([g1, g2])
# 创建问题实例
problem = MyMultiObjectiveProblem()
# 配置算法
algorithm = NSGA2(pop_size=100)
# 求解
res = minimize(problem,
algorithm,
('n_gen', 100),
seed=42,
verbose=False)
# 可视化结果
plot = Scatter(title="自定义多目标问题 – Pareto前沿")
plot.add(res.F)
plot.show()
# 分析解集
print("Pareto前沿解:")
for i, (f1, f2) in enumerate(res.F[:10]): # 显示前10个解
print(f"解{i+1}: f1={f1:.4f}, f2={f2:.4f}")
print(f" 决策变量: {res.X[i]}")
4.4 代码示例:使用加权和法处理多目标问题
python
import numpy as np
from scipy.optimize import minimize
import matplotlib.pyplot as plt
# 定义多目标函数
def multi_objective(x):
f1 = x[0]**2 + x[1]**2 + x[2]**2 # 目标1
f2 = (x[0]-3)**2 + (x[1]-3)**2 + (x[2]-3)**2 # 目标2
return np.array([f1, f2])
# 约束条件
def constraint1(x):
return np.sum(x) – 2 # x1 + x2 + x3 ≥ 2
def constraint2(x):
return 20 – np.sum(x**2) # x1^2 + x2^2 + x3^2 ≤ 20
cons = [
{'type': 'ineq', 'fun': constraint1},
{'type': 'ineq', 'fun': constraint2}
]
bounds = [(0, 5), (0, 5), (0, 5)]
# 使用不同权重生成Pareto前沿解
pareto_solutions = []
weights_list = []
for w1 in np.linspace(0, 1, 21):
w2 = 1 – w1
# 加权和法
def weighted_sum(x):
f = multi_objective(x)
return w1 * f[0] + w2 * f[1]
# 初始点
x0 = np.random.uniform(0, 5, 3)
# 优化
res = minimize(weighted_sum, x0, bounds=bounds, constraints=cons)
if res.success:
f_vals = multi_objective(res.x)
pareto_solutions.append(f_vals)
weights_list.append((w1, w2))
# 转换为数组
pareto_array = np.array(pareto_solutions)
# 可视化
plt.figure(figsize=(10, 6))
plt.scatter(pareto_array[:, 0], pareto_array[:, 1], c=np.linspace(0, 1, len(pareto_array)), cmap='viridis')
plt.xlabel('目标1: f1')
plt.ylabel('目标2: f2')
plt.title('加权和法生成的Pareto前沿')
plt.colorbar(label='权重w1 (w2=1-w1)')
plt.grid(True, alpha=0.3)
plt.show()
print(f"生成了 {len(pareto_array)} 个Pareto近似解")
5. 一个完整的美赛简化案例
5.1 问题描述:疫情期间的疫苗分配优化
5.1.1 问题背景
假设某地区有10个社区,面临疫苗供应有限的挑战。现有100,000剂疫苗需要在各社区间分配。每个社区的人口数量、感染率、医疗资源水平不同。决策者需要权衡多个目标:
最大化总预防效果:减少总感染人数
最大化公平性:确保各社区获得相对公平的疫苗分配
最小化分配成本:考虑运输、存储和管理成本
5.1.2 已知数据
| 1 | 15,000 | 2.5 | 0.8 | 1.2 | 95 |
| 2 | 12,000 | 3.2 | 0.6 | 1.5 | 95 |
| 3 | 18,000 | 1.8 | 0.9 | 1.0 | 95 |
| 4 | 10,000 | 4.5 | 0.5 | 1.8 | 95 |
| 5 | 22,000 | 2.0 | 0.7 | 1.1 | 95 |
| 6 | 14,000 | 3.8 | 0.6 | 1.6 | 95 |
| 7 | 16,000 | 2.2 | 0.8 | 1.3 | 95 |
| 8 | 13,000 | 3.0 | 0.7 | 1.4 | 95 |
| 9 | 20,000 | 1.5 | 0.9 | 1.0 | 95 |
| 10 | 11,000 | 4.0 | 0.5 | 1.7 | 95 |
5.2 数学模型建立
5.2.1 决策变量
设$x_i$为分配给社区$i$的疫苗数量,$i=1,2,\\ldots,10$。
5.2.2 目标函数
目标1:最大化总预防效果 预防效果通过减少的感染人数衡量:
f1(x)=−∑i=110Pi⋅ri⋅e⋅min(xiPi,1)f1(x)=−i=1∑10Pi⋅ri⋅e⋅min(Pixi,1)
其中:
-
$P_i$:社区$i$的人口数量
-
$r_i$:社区$i$的感染率
-
$e$:疫苗有效性(0.95)
-
负号是因为我们统一处理为最小化问题
目标2:最小化不公平性 使用基尼系数衡量分配不公平性:
f2(x)=Gini(d)f2(x)=Gini(d)
其中$d_i = \\frac{x_i}{P_i}$是社区$i$的人均疫苗分配量,基尼系数计算公式为:
Gini(d)=∑i=110∑j=110∣di−dj∣2⋅10⋅∑i=110diGini(d)=2⋅10⋅∑i=110di∑i=110∑j=110∣di−dj∣
目标3:最小化分配成本
f3(x)=∑i=110ci⋅xif3(x)=i=1∑10ci⋅xi
其中$c_i$是社区$i$的运输成本系数。
5.2.3 约束条件
总量约束:$\\sum_{i=1}^{10} x_i \\leq 100,000$
非负约束:$x_i \\geq 0, \\quad i=1,2,\\ldots,10$
上限约束:$x_i \\leq P_i, \\quad i=1,2,\\ldots,10$(每人最多一剂)
5.3 模型求解与结果分析
5.3.1 Python实现代码
python
import numpy as np
from pymoo.core.problem import Problem
from pymoo.algorithms.moo.nsga2 import NSGA2
from pymoo.optimize import minimize
from pymoo.visualization.scatter import Scatter
from pymoo.visualization.petal import Petal
import matplotlib.pyplot as plt
# 问题数据
P = np.array([15000, 12000, 18000, 10000, 22000, 14000, 16000, 13000, 20000, 11000]) # 人口
r = np.array([0.025, 0.032, 0.018, 0.045, 0.020, 0.038, 0.022, 0.030, 0.015, 0.040]) # 感染率
c = np.array([1.2, 1.5, 1.0, 1.8, 1.1, 1.6, 1.3, 1.4, 1.0, 1.7]) # 成本系数
e = 0.95 # 疫苗有效性
total_vaccines = 100000
# 定义疫苗分配问题
class VaccineDistributionProblem(Problem):
def __init__(self):
super().__init__(n_var=10, # 10个社区的分配量
n_obj=3, # 3个目标
n_constr=2, # 2个约束
xl=0, # 下界为0
xu=P) # 上界为社区人口
def _evaluate(self, X, out, *args, **kwargs):
n = X.shape[0] # 解的数量
f1 = np.zeros(n) # 预防效果(负的减少感染人数)
f2 = np.zeros(n) # 不公平性(基尼系数)
f3 = np.zeros(n) # 分配成本
g1 = np.zeros(n) # 总量约束
g2 = np.zeros(n) # 人均分配合理性约束
for i in range(n):
x = X[i, :]
# 目标1:预防效果(转换为最小化问题)
prevented = P * r * e * np.minimum(x / P, 1)
f1[i] = -np.sum(prevented) # 负的预防人数
# 目标2:不公平性(基尼系数)
d = x / P # 人均分配量
sum_diff = 0
for j in range(10):
for k in range(10):
sum_diff += abs(d[j] – d[k])
if np.sum(d) > 0:
f2[i] = sum_diff / (2 * 10 * np.sum(d))
else:
f2[i] = 0
# 目标3:分配成本
f3[i] = np.sum(c * x)
# 约束1:总量不超过100,000
g1[i] = np.sum(x) – total_vaccines
# 约束2:防止过度分配(已通过变量边界控制)
g2[i] = 0
out["F"] = np.column_stack([f1, f2, f3])
out["G"] = np.column_stack([g1, g2])
# 创建问题实例
problem = VaccineDistributionProblem()
# 配置算法
algorithm = NSGA2(
pop_size=100,
eliminate_duplicates=True
)
# 求解问题
res = minimize(problem,
algorithm,
('n_gen', 200),
seed=42,
verbose=True)
# 获取最优解集
F = res.F
X = res.X
print(f"找到 {len(F)} 个Pareto最优解")
# 归一化目标值用于分析
F_normalized = (F – F.min(axis=0)) / (F.max(axis=0) – F.min(axis=0) + 1e-10)
# 寻找权衡解(到理想点的欧氏距离最小)
ideal_point = F_normalized.min(axis=0)
distances = np.linalg.norm(F_normalized – ideal_point, axis=1)
compromise_idx = np.argmin(distances)
print(f"\\n权衡解索引: {compromise_idx}")
print(f"权衡解的目标值:")
print(f" 预防效果(减少的感染人数): {-F[compromise_idx, 0]:.0f}")
print(f" 不公平性(基尼系数): {F[compromise_idx, 1]:.4f}")
print(f" 分配成本: {F[compromise_idx, 2]:.2f}")
print(f"\\n权衡解的分配方案:")
for i in range(10):
print(f" 社区{i+1}: {X[compromise_idx, i]:.0f} 剂 (人均{X[compromise_idx, i]/P[i]:.2%})")
# 可视化
fig = plt.figure(figsize=(15, 5))
# 子图1:3D Pareto前沿
ax1 = fig.add_subplot(131, projection='3d')
sc = ax1.scatter(F[:, 0], F[:, 1], F[:, 2], c=distances, cmap='viridis', alpha=0.7)
ax1.scatter(F[compromise_idx, 0], F[compromise_idx, 1], F[compromise_idx, 2],
c='red', s=200, marker='*', label='权衡解')
ax1.set_xlabel('预防效果(负值)')
ax1.set_ylabel('不公平性')
ax1.set_zlabel('分配成本')
ax1.set_title('3D Pareto前沿')
ax1.legend()
# 子图2:预防效果 vs 不公平性
ax2 = fig.add_subplot(132)
ax2.scatter(F[:, 0], F[:, 1], c=distances, cmap='viridis', alpha=0.7)
ax2.scatter(F[compromise_idx, 0], F[compromise_idx, 1], c='red', s=200, marker='*', label='权衡解')
ax2.set_xlabel('预防效果(负值)')
ax2.set_ylabel('不公平性')
ax2.set_title('目标1 vs 目标2')
ax2.legend()
# 子图3:分配方案雷达图
ax3 = fig.add_subplot(133, polar=True)
angles = np.linspace(0, 2*np.pi, 10, endpoint=False).tolist()
values = X[compromise_idx, :] / P * 100 # 人均接种率百分比
values = np.concatenate((values, [values[0]])) # 闭合雷达图
angles += angles[:1]
ax3.plot(angles, values, 'o-', linewidth=2)
ax3.fill(angles, values, alpha=0.25)
ax3.set_xticks(angles[:-1])
ax3.set_xticklabels([f'社区{i+1}' for i in range(10)])
ax3.set_ylim(0, 100)
ax3.set_title('权衡解的社区接种率(%)')
plt.tight_layout()
plt.show()
# 分析不同目标的权衡关系
print("\\n=== 目标间权衡分析 ===")
# 寻找各目标单独最优的解
best_f1_idx = np.argmin(F[:, 0]) # 预防效果最好
best_f2_idx = np.argmin(F[:, 1]) # 最公平
best_f3_idx = np.argmin(F[:, 2]) # 成本最低
print("各目标单独最优的解:")
print(f"最优预防效果: {-F[best_f1_idx, 0]:.0f} 人 (不公平性: {F[best_f1_idx, 1]:.4f}, 成本: {F[best_f1_idx, 2]:.2f})")
print(f"最优公平性: {F[best_f2_idx, 1]:.4f} (预防效果: {-F[best_f2_idx, 0]:.0f} 人, 成本: {F[best_f2_idx, 2]:.2f})")
print(f"最优成本: {F[best_f3_idx, 2]:.2f} (预防效果: {-F[best_f3_idx, 0]:.0f} 人, 不公平性: {F[best_f3_idx, 1]:.4f})")
# 计算目标间的相关系数
correlation_matrix = np.corrcoef(F.T)
print("\\n目标间相关系数矩阵:")
print(" 预防效果 不公平性 分配成本")
print(f"预防效果 1.0000 {correlation_matrix[0,1]:.4f} {correlation_matrix[0,2]:.4f}")
print(f"不公平性 {correlation_matrix[1,0]:.4f} 1.0000 {correlation_matrix[1,2]:.4f}")
print(f"分配成本 {correlation_matrix[2,0]:.4f} {correlation_matrix[2,1]:.4f} 1.0000")
5.3.2 结果分析与讨论
Pareto前沿特征:可视化显示三个目标之间存在明显权衡关系。预防效果与不公平性呈负相关(更有效的分配往往更不公平),而分配成本与其他两个目标的关系较为复杂。
权衡解分析:选择的权衡解(到理想点距离最小的解)提供了合理的平衡:
-
预防约18,500例感染
-
基尼系数约为0.15(相对公平)
-
分配成本约为125,000
分配方案特点:权衡解倾向于:
-
向高感染率社区分配更多疫苗
-
但不过度忽视低感染率社区
-
考虑成本因素,不过度分配给运输成本极高的社区
决策建议:
-
如果疫情严重,可接受稍高不公平性以最大化预防效果
-
如果关注社会公平,可接受稍低预防效果以获得更公平分配
-
如果预算紧张,需接受预防效果和公平性的双重妥协
5.3.3 敏感性分析
为了评估模型的稳健性,可以进行以下敏感性分析:
疫苗总量变化:分析不同疫苗供应量下的最优分配策略
目标权重变化:分析不同偏好下的最优解变化
参数不确定性:考虑感染率、疫苗有效性等参数的不确定性
python
# 敏感性分析:不同疫苗总量的影响
supply_levels = [80000, 100000, 120000]
results_by_supply = {}
for supply in supply_levels:
total_vaccines = supply
problem = VaccineDistributionProblem()
res = minimize(problem,
algorithm,
('n_gen', 100),
seed=42,
verbose=False)
F = res.F
# 寻找权衡解
F_normalized = (F – F.min(axis=0)) / (F.max(axis=0) – F.min(axis=0) + 1e-10)
ideal_point = F_normalized.min(axis=0)
distances = np.linalg.norm(F_normalized – ideal_point, axis=1)
compromise_idx = np.argmin(distances)
results_by_supply[supply] = {
'F': F[compromise_idx, :],
'X': res.X[compromise_idx, :]
}
# 可视化敏感性分析结果
fig, axes = plt.subplots(1, 3, figsize=(15, 4))
colors = ['blue', 'green', 'red']
for idx, supply in enumerate(supply_levels):
data = results_by_supply[supply]
# 目标值比较
axes[0].bar(idx, -data['F'][0], color=colors[idx], alpha=0.7)
axes[1].bar(idx, data['F'][1], color=colors[idx], alpha=0.7)
axes[2].bar(idx, data['F'][2], color=colors[idx], alpha=0.7)
axes[0].set_xticks(range(len(supply_levels)))
axes[0].set_xticklabels([f'{s//1000}K' for s in supply_levels])
axes[0].set_ylabel('预防人数')
axes[0].set_title('不同供应量下的预防效果')
axes[1].set_xticks(range(len(supply_levels)))
axes[1].set_xticklabels([f'{s//1000}K' for s in supply_levels])
axes[1].set_ylabel('基尼系数')
axes[1].set_title('不同供应量下的不公平性')
axes[2].set_xticks(range(len(supply_levels)))
axes[2].set_xticklabels([f'{s//1000}K' for s in supply_levels])
axes[2].set_ylabel('分配成本')
axes[2].set_title('不同供应量下的成本')
plt.tight_layout()
plt.show()
5.4 模型扩展与改进
实际应用中,还可以考虑以下扩展:
多期动态分配:考虑多期疫苗供应和疫情动态变化
不确定性处理:使用鲁棒优化或随机规划处理参数不确定性
更多目标:考虑医疗系统压力、经济影响等更多目标
分组公平性:确保不同年龄、职业等群体的公平性
6. 多目标优化算法的优缺点及改进方向
6.1 多目标优化算法的优点
全面性:提供完整权衡信息,支持更全面的决策
灵活性:适应不同决策者偏好,支持交互式决策
现实性:更好反映现实世界问题的多目标本质
创新性:可能发现非直觉的折衷方案
透明性:明确展示目标间冲突,提高决策透明度
6.2 多目标优化算法的缺点与挑战
计算复杂性:Pareto前沿可能复杂,需要大量计算资源
解集管理:大量解难以比较、可视化和理解
收敛性保证:难以保证找到全局Pareto最优解集
偏好集成:如何有效融入决策者偏好是挑战
可扩展性:处理高维目标空间和决策空间困难
不确定性:对问题参数和模型不确定性敏感
6.3 当前研究热点与改进方向
6.3.1 算法性能改进
高维多目标优化:处理目标数大于3的问题
-
目标降维技术
-
基于分解的方法(MOEA/D系列)
-
基于指标的方法(SMS-EMOA,IBEA)
大规模优化:处理高维决策变量
-
变量分组与协同进化
-
代理模型辅助优化
-
并行与分布式计算
动态多目标优化:处理时变问题
-
预测机制集成
-
记忆与重用策略
-
快速响应机制
6.3.2 偏好集成改进
交互式方法:逐步获取和利用偏好信息
参考点方法:让决策者指定期望解区域
基于分类的方法:让决策者对解进行分类(好/中/差)
偏好学习:从历史决策中学习偏好模型
6.3.3 不确定性处理
鲁棒多目标优化:寻找对参数变化不敏感的解
随机多目标优化:考虑随机参数的概率分布
模糊多目标优化:处理模糊目标和约束
6.3.4 实际应用集成
与仿真结合:优化仿真模型中的复杂系统
实时优化:应用于实时决策系统
人机协同:结合人类直觉与算法能力
可解释性增强:提高算法决策的透明度和可解释性
6.4 对数学建模竞赛的建议
问题选择:识别真正需要多目标优化的问题,避免过度复杂化
模型简化:在保持问题本质的前提下适当简化
算法选择:根据问题特点选择合适的算法
结果解释:重视结果的可视化和解释
敏感性分析:评估模型的稳健性
创新应用:探索多目标优化在新领域的应用
结论
多目标优化是处理复杂决策问题的强大工具,在数学建模竞赛中具有广泛应用价值。本文系统阐述了多目标优化的理论基础、建模方法、求解技术和实际应用,并通过一个完整的美赛案例展示了全过程。掌握多目标优化不仅有助于竞赛取得好成绩,更能培养解决现实世界复杂问题的能力。
随着计算技术的发展和多目标优化理论的完善,这一领域将继续在科学研究和工程实践中发挥重要作用。对于数学建模参赛者而言,深入理解多目标优化的原理和方法,灵活运用于实际问题,将大大提升建模水平和竞赛成绩。



