【数模修炼之旅】02 多目标规划 深度解析(教程+代码)

news2024/9/24 9:24:20

【数模修炼之旅】02 多目标规划 深度解析(教程+代码)

接下来 C君将会用至少30个小节来为大家深度解析数模领域常用的算法,大家可以关注这个专栏,持续学习哦,对于大家的能力提高会有极大的帮助。

1 多目标规划介绍及应用

求解多目标线性规划的基本思想大都是将多目标问题转化为单目标规划,在比赛中经常会用到。本文只介绍一种最常用方法。大家可以去搜搜一些其他的多目标规划方法:理想点法、线性加权和法、最大最小法、目标规划法。

具体的,多目标规划是数学规划的一个分支。研究多于一个的目标函数在给定区域上的最优化。又称多目标最优化。通常记为 MOP(multi-objective programming)。

多目标规划的概念是 1961年由美国数学家查尔斯和库柏首先提出的。多目标最优化思想,最早是在1896年由法国经济学家V.帕雷托提出来的。他从政治经济学的角度考虑把本质上是不可比较的许多目标化成单个目标的最优化问题,从而涉及了多目标规划问题和多目标的概念。

模型具体为:

多目标线性规划有着两个和两个以上的目标函数,且目标函数和约束条件全是线性函数,其数学模型表示为:

约束条件为:

2 多目标规划的过程详解

2.1 分析和计算步骤

多目标规划(Multi-Objective Optimization)涉及同时优化多个目标函数,这些目标函数通常是相互矛盾的。分析和计算步骤可以分为几个主要阶段:

1. 问题定义

  • 确定目标函数:识别需要优化的多个目标函数。例如,最大化利润和最小化成本。
  • 确定决策变量:识别影响目标函数的变量。这些变量是可以控制的因素。
  • 设定约束条件:定义决策变量必须满足的约束条件,如资源限制、技术限制等。

2. 建立数学模型

  • 目标函数:设定目标函数的数学形式,通常是目标函数的集合,例如

  • 约束条件:设定约束条件的数学形式,通常是线性或非线性的约束,例如



3. 选择优化方法

  • 权重法:将多个目标函数转化为一个单一的目标函数,通过给每个目标函数分配权重。例如:
     
  • ε-约束法:选择一个目标函数进行优化,将其他目标函数作为约束条件。例如:
     
  • Pareto优化:寻找 Pareto 最优解,这是一种不可以在某个目标上改进而不在其他目标上恶化的解。常用的方法有遗传算法、多目标粒子群优化等。

4. 求解优化问题

  • 求解算法:选择合适的优化算法(如线性规划、整数规划、遗传算法、模拟退火等)来求解多目标规划问题。
  • 计算Pareto前沿:使用算法计算所有的 Pareto 最优解,得到 Pareto 前沿,显示不同目标之间的权衡。

5. 分析和选择

  • Pareto前沿分析:分析 Pareto 前沿中的解,理解不同解决方案之间的权衡关系。
  • 决策:根据实际需求选择一个最合适的解决方案,可能需要考虑非技术因素,如成本、时间、资源等。

6. 验证和实施

  • 验证:验证所选择的解决方案是否满足所有的约束条件,并且在实践中是否可行。
  • 实施:将最终选择的解决方案付诸实践,并进行必要的调整和优化。

7. 反馈和调整

  • 监控:实施过程中监控解决方案的实际表现。
  • 调整:根据实际情况对模型和方案进行必要的调整和改进。

这些步骤为多目标规划提供了一个系统的分析框架,帮助决策者在多个目标之间做出平衡和优化决策。

3 多目标规划代码(lingo+matlab+python)

现在给一个例子,然后用两种代码进行求解:

例子:

3.1 lingo代码:

序贯算法中每个单目标问题都是一个线性规划问题, 可以使用Lingo软件进行求解。

以上例为例,利用lingo求解如下:

第一级:

 model:
 sets:
 variable/1,2/:x;
 s_con_num/1..4/:g,dplus,dminus; !目标约束项数;
 s_con(s_con_num,variable):c;
 !dplus=d+,dminus=d-,目标约束系数c=c(i,j);
 endsets
 data:
 g=1500 0 16 15;c=200 300 2 -1 4 0 0 5; !默认按行赋值;
 enddata
 min=dminus(1); !一级目标函数;
 2*x(1)+2*x(2)<=12;
 @for(s_con_num(i):@sum(variable(j):c(i,j)*x(j)+dminus(i)-dplus(i))=g(i););
 @for(variable:@gin(x)); !变量取整约束;
 end

第二级:

 model:
 sets:
 variable/1,2/:x;
 s_con_num/1..4/:g,dplus,dminus;
 s_con(s_con_num,variable):c;
 endsets
 data:
 g=1500 0 16 15;c=200 300 2 -1 4 0 0 5;
 enddata
 min=dplus(2)+dminus(2); !二级目标函数;
 2*x(1)+2*x(2)<=12;
 @for(s_con_num(i):@sum(variable(j):c(i,j)*x(j)+dminus(i)-dplus(i))=g(i););
 dminus(1)=0; !一级目标约束;
 @for(variable:@gin(x));
 end
 ​

第三级:

 model:
 sets:
 variable/1,2/:x;
 s_con_num/1..4/:g,dplus,dminus;
 s_con(s_con_num,variable):c;
 endsets
 data:
 g=1500 0 16 15;c=200 300 2 -1 4 0 0 5;
 enddata
 min=3*dplus(3)+3*dminus(3)+dplus(4); !三级目标函数;
 2*x(1)+2*x(2)<=12;
 @for(s_con_num(i):@sum(variable(j):c(i,j)*x(j))+dminus(i)-dplus(i)=g(i););
 dminus(1)=0;dplus(2)+dminus(2)=0; !一、二级目标约束;
 @for(variable:@gin(x));
 end
 ​

三个阶段一起:

 model:
 sets:
 level/1..3/:p,z,goal; !三个目标;
 variable/1,2/:x;
 s_con_num/1..4/:g,dplus,dminus;
 s_con(s_con_num,variable):c;
 h_con_num/1/:b;
 h_con(h_con_num,variable):a;
 obj(level,s_con_num)/1 1,2 2,3 3,3 4/:wplus,wminus; !权重;
 endsets
 data:
 ctr=?;
 goal=? ? 0;
 b=12;
 a=2 2;
 g=1500 0 16 15;
 c=200 300 2 -1 4 0 0 5;
 wplus=0 1 3 1;
 wminus=1 1 3 0;
 enddata
 min=@sum(level:p*z);
 @for(level(i)|i#ne#ctr:p(i)=0);
 @for(level(i):z(i)=@sum(obj(i,j):wplus(i,j)*dplus(j)+wminus(i,j)*dminus(j)););
 @for(h_con_num(i):@sum(variable(j):a(i,j)*x(j))<=b(i););
 @for(s_con_num(i):@sum(variable(j):c(i,j)*x(j))+dminus(i)-dplus(i)=g(i););
 @for(level(i)|i#lt#@size(level):@bnd(0,z(i),goal(i)));
 @for(variable:@gin(x));
 end
 ​

3.2 matlab代码:

fgoalattain()函数的用法: x = fgoalattain(fun,x0,goal,weight) x = fgoalattain(fun,x0,goal,weight,A,b) x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq) x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub) x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon) x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon,options) x = fgoalattain(problem) [x,fval] = fgoalattain() [x,fval,attainfactor,exitflag,output] = fgoalattain() [x,fval,attainfactor,exitflag,output,lambda] = fgoalattain(___)

例:求解多目标线性规划问题

定义目标函数:

 function F=Fun16_5(x)
 F=[-100*x(1)-90*x(2)-80*x(3)-70*x(4);3*x(2)+2*x(4)];
 end
 ​

goal由两个目标函数分别求出目标值合并而成;weight由abs(goal)取定

 a=[-1 -1 0 0;0 0 -1 -1;3 0 2 0;0 3 0 2]
 b=[-30,-30,120,48].'
 c1=-[100,90,80,70]
 c2=[0,3,0,2]
 [x1,goal1]=linprog(c1,a,b,[],[],zeros(4,1))
 [x2,goal2]=linprog(c2,a,b,[],[],zeros(4,1))
 goal=[goal1;goal2]
 [x,fval]=fgoalattain('Fun16_5',rand(4,1),goal,abs(goal),a,b,[],[],zeros(4,1))
 ​

3.3 python代码

在 Python 中实现多目标规划可以使用一些优化库,如 scipy.optimizepyomopymoo等。以下是一些示例代码,展示了如何使用不同的库来处理多目标规划问题。

示例 1: 使用 pymoo 库

pymoo 是一个专门用于多目标优化的库。以下代码展示了如何使用 pymoo 解决一个简单的多目标优化问题:

 from pymoo.optimize import minimize
 from pymoo.core.problem import Problem
 from pymoo.core.variable import Real
 from pymoo.algorithms.moo.nsga2 import NSGA2
 from pymoo.visualization.scatter import Scatter
 import numpy as np
 ​
 # 定义问题
 class MyProblem(Problem):
     def __init__(self):
         super().__init__(n_var=2, n_obj=2, n_constr=0, xl=np.array([0, 0]), xu=np.array([5, 5]))
         
     def _evaluate(self, x, out, *args, **kwargs):
         f1 = x[:, 0]**2 + x[:, 1]**2
         f2 = (x[:, 0] - 1)**2 + (x[:, 1] - 1)**2
         out["F"] = np.column_stack([f1, f2])
 ​
 # 创建问题实例
 problem = MyProblem()
 ​
 # 使用 NSGA-II 算法
 algorithm = NSGA2(pop_size=100)
 ​
 # 进行优化
 result = minimize(problem,
                   algorithm,
                  ('n_gen', 50),
                   seed=1,
                   verbose=True)
 ​
 # 可视化 Pareto 前沿
 Scatter().add(result.F).show()
 ​

示例 2: 使用 scipy.optimize 进行加权和的方法

虽然 scipy.optimize 主要用于单目标优化,但你可以通过加权和的方法将多目标问题转化为单目标问题:

 from scipy.optimize import minimize
 ​
 # 目标函数
 def objective(x, weights):
    f1 = x[0]**2 + x[1]**2
    f2 = (x[0] - 1)**2 + (x[1] - 1)**2
    return weights[0] * f1 + weights[1] * f2
 ​
 # 初始点
 x0 = [0, 0]
 ​
 # 权重
 weights = [0.5, 0.5]
 ​
 # 约束条件
 def constraint(x):
    return 5 - (x[0] + x[1])
 ​
 cons = [{'type': 'ineq', 'fun': constraint}]
 ​
 # 最优化
 result = minimize(objective, x0, args=(weights,), constraints=cons, method='SLSQP')
 ​
 print("Optimal solution:", result.x)
 print("Objective function value:", result.fun)
 ​

需要参加数模竞赛的同学,可以看我的这个名片,会有最新的助攻哦:(大型比赛前会对名片进行更新)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2033757.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

百度智能云发布3款轻量级+2款场景大模型

文心大模型ERNIE 3.5是目前百度智能云千帆大模型平台上最受欢迎的基础大模型之一。针对用户的常见通用的对话场景&#xff0c;ERNIE 3.5 在指令遵循、上下文学习和逻辑推理能力三方面分别进行了能力增强。 ERNIE Speed作为三款轻量级大模型中的“大个子”&#xff0c;推理场景…

解决连接不上Linux和服务器中的Nacos(Windows中能连接但是Linux中却不行)

报错 com.alibaba.nacos.shaded.io.grpc.StatusRuntimeException: UNKNOWN: Uncaught exception in the SynchronizationContext. Re-thrown. at com.alibaba.nacos.shaded.io.grpc.Status.asRuntimeException(Status.jav 2024-08-13T10:21:52.93708:00 ERROR 27764 --- …

ArduPilot开源代码之FMU+IOMCU设计

ArduPilot开源代码之FMUIOMCU设计 1. 源由2. 设计概念3. FMU & IOMCU特点3.1 FMU&#xff08;Flight Management Unit&#xff09;的主要功能3.2 IOMCU&#xff08;Input/Output Microcontroller Unit&#xff09;的主要功能3.3 主要差异 4. 主/辅助(MAIN/AUX) PWM输出5. 软…

【北京仁爱堂】痉挛性斜颈的早期症状,你了解吗?

在日常生活中&#xff0c;您可能很少听到“痉挛性斜颈”这个名词&#xff0c;但它却是一种不容忽视的疾病。今天&#xff0c;就让我们一起来了解一下痉挛性斜颈的早期症状&#xff0c;以便能够及时发现并采取相应的措施。 痉挛性斜颈是一种局限性肌张力障碍疾病&#xff0c;主要…

Gitlab搭建服务器好做吗 Gitlab搭建服务器操作指南

GitLab是一个强大的开源代码托管和CI/CD工具&#xff0c;广泛用于软件开发的版本控制和自动化构建。对于许多公司和开发团队来说&#xff0c;自行搭建GitLab服务器是一个既具挑战性又有很多好处的选择。本文将详细讨论搭建GitLab服务器的难易程度&#xff0c;提供一份详尽的操作…

死信队列.

“死信”是指在RabbitMQ中那些因为某些原因无法被正常处理的消息。

OpenCV图像滤波(11)中值滤波medianBlur函数的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 功能描述 该函数使用中值滤波器对图像进行模糊处理。 该函数采用 ksizeksize 的窗口尺寸对图像进行平滑处理。对于多通道图像&#xff0c;每个通道将被独…

Linux发行版深度对比:Ubuntu、CentOS与Fedora

在Linux的广阔世界中&#xff0c;Ubuntu、CentOS和Fedora作为三大主流发行版&#xff0c;各自拥有独特的生态系统、用户基础和开发理念。它们不仅在技术架构上有着显著的差异&#xff0c;更在用户体验、社区支持、软件更新策略以及安全性能等方面展现出各自的特色。本文将对这三…

红黑树R-B Tree

文章目录 概述红黑树的特性红黑树的原理应用为什么设计红黑树红黑树左旋与右旋的区别 概述 红黑树&#xff08;Red Black Tree&#xff09;是一种自平衡的二叉查找树&#xff0c;在计算机科学中广泛使用&#xff0c;其典型的用途是实现关联数组。R-B Tree&#xff0c;全称是 R…

[C++][opencv]基于opencv实现photoshop算法亮度和对比度调整

【测试环境】 vs2019 opencv4.8.0 【效果演示】 【核心实现代码】 #include <iostream> #include "opencv2/core.hpp" #include "opencv2/imgproc.hpp" #include "opencv2/highgui.hpp"using namespace std; using namespace cv;#defi…

【区块链+食品安全】食药产业全流程可追溯平台 | FISCO BCOS应用案例

为响应国家强化食品安全追溯监管的号召&#xff0c;吉科软信息技术有限公司基于 FISCO BCOS 联盟链开源技术&#xff0c;推出了 食药产业全流程可追溯平台&#xff0c;并应用于吉林省白山市。该平台建立了从食药产品种养殖、生产加工、冷链运输、 流通到消费的全链条可追溯体系…

掌握Python eval()函数:解析动态代码执行的神奇之处

eval() 是 Python 提供的一个内置函数&#xff0c;用于动态执行字符串形式的表达式。 虽然它功能强大&#xff0c;但同时也伴随着一定的风险和局限性。在本文中&#xff0c;我们将详细介绍 eval() 的用法、注意事项以及一些常见的应用场景。 一、eval() 函数的基本用法 基本语…

SpringIOC和SpringAOC

lombok插件 XML<!-- 加载资源文件 --><context:property-placeholder location"classpath:jdbc.properties"></context:property-placeholder><!-- 注入数据源 --><bean id"dataSource" class"com.mchange.v2.c3p0.ComboP…

Supervision 计算机视觉工具

简介 Supervision库是Python计算机视觉低代码工具&#xff0c;旨在为用户提供便捷高效的接口&#xff0c;以便处理数据集并直观地展示检测结果。绘制检测结果&#xff0c;统计指定区域内检测目标数量Supervision都提供了相应的接口 安装库 要求Python版本>3.8 1.安装无图像…

【机器学习】反向传播算法的直观解释、微积分原理以及反向传播中的链式法则

引言 正如有句话说的好&#xff0c;neurons-that-fire-together-wire-together&#xff08;一同激活的神经元关联在一起&#xff09; 文章目录 引言一、反向传播算法的直观解释1.1 前向传播1.2 计算误差1.3 反向传播误差1.4 更新权重 二、微积分原理2.1 损失函数 L L L2.2 链式…

javaEE WebServlet、SpringWebMVC、SpringBoot实现跨域访问的4种方式及优先级

文章目录 1. 前置知识2. 原理和解决方案总结2.1. 跨域不通过原理流程图2.2. 实现原理&#xff1a;添加以下http响应头2.3. 四种跨域实现方式及优先级&#xff08;从高到低&#xff09; 3. 具体实现代码3.1. 跨域全局配置方式-Filter(全适用)3.2. 跨域全局配置方式-SpringMvc3.3…

数字孪生模型制作教程虚拟现实城市模型制作3dmax数字城市glb/gltf

需要做数字孪生可以QQ可以联系这里&#xff0c;谢谢 下面开始教程 1打开3dmax软件&#xff0c;和需要做的建筑图片 2 在3dmax安图片先建一个长方体框架 3先给长方体贴一个墙体贴图 4在ps做贴图 5 做好贴图贴到3dmax中 6 然后ps再做下一张贴图 7 做好贴图贴到3dma…

[Redis] Redisson分布式锁原理及源码分析

目录 基于 Redis 的分布式锁 Redisson实现分布 Redisson分布式锁原理图 RedissonLock实现分布式锁源码分析 RedissonLock构造方法 lock()加锁 获取锁 锁续命逻辑 tryLockInnerAsync加锁lua脚本分析 unlock()解锁 基于 Redis 的分布式锁 实现方式: 使用 Redis 的 SE…

Idea2023.3版本创建spring Initializr没有JDK8

解决方法&#xff1a; https://start.aliyun.com

SOMEIP_ETS_037:echoUINT8RELIABLE_client_closes_TCP_connection_automatically

测试目的&#xff1a; 验证当所有服务停止时&#xff0c;DUT不会关闭TCP连接。 描述 本测试用例旨在检验DUT在停止所有服务时&#xff0c;是否能够保持TCP连接的活跃状态&#xff0c;而不发送FIN,ACK以关闭连接。 测试拓扑&#xff1a; 具体步骤&#xff1a; TESTER&#…