当前位置: 首页 > news >正文

【学习笔记】Matlab和python双语言的学习(整数规划和0-1规划)

文章目录

  • 前言
  • 一、整数规划和0-1规划
  • 二、典型示例
    • 1.背包问题
    • 2.指派问题
  • 三、代码实现----Matlab
    • 1.Matlab 的 `intlinprog` 函数
    • 2.Matlab 代码
      • 背包问题
      • 指派问题
  • 四、代码实现----python
      • 背包问题
      • 指派问题
  • 总结


前言

通过模型算法,熟练对Matlab和python的应用。
学习视频链接:
https://www.bilibili.com/video/BV1EK41187QF?p=26&vd_source=67471d3a1b4f517b7a7964093e62f7e6

一、整数规划和0-1规划

  • 在规划问题中,有些最优解可能是分数或小数,但对于某些具体问题,常要求某些变量(全部或部分)的解必须是整数。例如,当变量代表的是机器的台数,工作的人数或装货的车数等。为了满足整数的要求,初看起来似乎只要把已得的非整数解舍入化整就可以了。实际上化整后的数不见得是可行解和最优解,所以应该有特殊的方法来求解整数规划。在整数规划中,如果所有变量都限制为整数,则称为纯整数规划;如果仅一部分变量限制为整数,则称为混合整数规划。整数规划的一种特殊情形是0-1规划,它的变数仅限于0或1
  • 本文讨论的整数规划和0-1规划都在线性规划的范畴

二、典型示例

1.背包问题

  • 有10件货物要从甲地运送到乙地,每件货物的重量(单位: 吨)和利润(单位: 元)如下表所示在这里插入图片描述

  • 由于只有一辆最大载重为30t的货车能用来运送货物,所以只能选择部分货物进行运送。

  • 要求确定运送哪些货物,使得运送这些货物的总利润最大。

    记 x i = { 1 , 运送了第 i 件货物 0 , 没有运送第 i 件货物 , i = 1 , 2 , … , 10 \left.\text{记}\quad x_{i}=\begin{cases}1,\text{运送了第}i\text{件货物}\\0,\text{没有运送第}i\text{件货物}\end{cases}\right.,i=1,2,\ldots,10 xi={1,运送了第i件货物0,没有运送第i件货物,i=1,2,,10

    w i w_i wi 表示第 i 件物品的重量, p i p_i pi 表示第 i 件物品的利润

    模型建立:
    m a x ∑ i = 1 10 p i x i s . t . { ∑ i = 1 10 w i x i ≤ 30 x i ∈ { 0 , 1 } \begin{aligned}max\sum_{i=1}^{10}p_ix_i\end{aligned}\\s.t.\begin{cases}\sum_{i=1}^{10}w_ix_i\leq30\\x_i\in\{0,1\}\end{cases} maxi=110pixis.t.{i=110wixi30xi{0,1}

2.指派问题

  • 已知5名游泳候选人的百米成绩,怎么选拔队员组成 4×100 米混合泳接力队伍
    在这里插入图片描述
    (表中的数据是各运动员百米游泳的耗时)

  • 候选人: i = 1 , 2 , 3 , 4 , 5 i = 1,2,3,4,5 i=1,2,3,4,5

  • 泳姿: j = 1 , 2 , 3 , 4 j = 1,2,3,4 j=1,2,3,4

  • x i j = { 1 , 队员 i 参加第 j 种泳姿 0 , 队员 i 不参加第 j 种泳姿 x_{ij}=\begin{cases}&1 ,\text{队员} i\text{参加第}j\text{种泳姿}\\&0 ,\text{队员} i\text{不参加第}j\text{种泳姿}\end{cases} xij={1,队员i参加第j种泳姿0,队员i不参加第j种泳姿

  • t i j t_{ij} tij:队员 i 参加第 j 种泳姿的耗时

    模型建立:
    m i n ∑ j = 1 4 ∑ i = 1 5 t i j x i j s . I . { ∑ j = 1 4 x i j ≤ 1 , i = 1 , 2 , 3 , 4 , 5 (每个人只能入选4种泳姿之一) ∑ i = 1 5 x i j = 1 , 2 , 3 , 4 (每种泳姿有且仅有1人参加) x i j ∈ { 0 , 1 } \begin{aligned}min\quad\sum_{j=1}^{4}\sum_{i=1}^{5}t_{ij}x_{ij}\end{aligned}\\[1em]\\s.I.\begin{cases}\sum_{j=1}^{4}x_{ij}\leq1,i=1,2,3,4,5&\text{(每个人只能入选4种泳姿之一)}\\[0em]\\\sum_{i=1}^{5}x_{ij}=1,2,3,4&\text{(每种泳姿有且仅有1人参加)}\\[0em]\\x_{ij}\in\{0,1\}\end{cases} minj=14i=15tijxijs.I. j=14xij1,i=1,2,3,4,5i=15xij=1,2,3,4xij{0,1}(每个人只能入选4种泳姿之一)(每种泳姿有且仅有1人参加)

三、代码实现----Matlab

1.Matlab 的 intlinprog 函数

intlinprog 是 MATLAB 中用于求解混合整数线性规划(MILP)问题的函数。混合整数线性规划问题是指在线性约束条件下,求解线性目标函数的最优解,其中部分或全部决策变量被限制为整数。

线性整数规划
intlinprog 函数的基本语法如下:

[x, fval] = intlinprog(f, intcon, A, b, Aeq, beq, lb, ub, options)

各参数的含义如下:

  • f:目标函数的系数向量。
  • intcon:一个向量,指定哪些决策变量是整数变量。例如,如果 intcon = [1, 3],则表示第一个和第三个决策变量是整数变量。
  • A:不等式约束矩阵。
  • b:不等式约束向量。
  • Aeq:等式约束矩阵。
  • beq:等式约束向量。
  • lb:决策变量的下界。
  • ub:决策变量的上界。
  • options:一个结构体,包含求解器的选项。

返回值的含义如下:

  • x:最优解。
  • fval:目标函数在最优解处的值。

线性0-1规划

  • 仍然使用intlinprog函数求解,只需要限定 lbub 即可
  • 例如: 三个决策变量: x1,x2,x3, x1 和 x3 是0-1变量,x2 不限制,则 intcon=[1,3],lb=[0;-inf;0],ub =[1;+inf;1]

2.Matlab 代码

背包问题

%% 背包问题% 线性整数规划
% [x,fval] = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub,x0)
% f :目标函数的系数向量(最小值形式下)
% intcon :intcon中的值指示决策变量x中应取整数值的分量
% A,b :不等式约束条件的变量系数矩阵和常数项矩阵(必须是≤形式)
% Aeq,beq :等式约束条件的系数矩阵和常数项矩阵
% lb,ub :决策变量的最小取值和最大取值
% intcon 的用法:决策变量如果有三个:x1,x2,x3;若x1和x3是整数,则intcon = [1,3]% 线性0-1规划
% 仍然使用intlinprog函数求解,只需限定lb和ub即可
% 决策变量如果有三个:x1,x2,x3;若x1和x3是0-1变量,x2不限制,则intcon = [1,3],lb = [0;-inf;0],ub = [1;+inf;1]
clc;clear
f = [-540 -200 -180 -350 -60 -150 -280 -450 -320 -120];
A = [6 3 4 5 1 2 3 5 4 2];
b = 30;
intcon = [1:10];
lb = zeros(10,1);
ub = ones(10,1);
[x,fval] = intlinprog(f,intcon,A,b,[],[],lb,ub)
res = -fval

运行结果:

在这里插入图片描述
在这里插入图片描述
即:运送1、2、4、6、7、8、9、10货物,运送这些货物的总利润最大为 2410 元

指派问题

%% 指派问题% 线性整数规划
% [x,fval] = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub,x0)
% f :目标函数的系数向量(最小值形式下)
% intcon :intcon中的值指示决策变量x中应取整数值的分量
% A,b :不等式约束条件的变量系数矩阵和常数项矩阵(必须是≤形式)
% Aeq,beq :等式约束条件的系数矩阵和常数项矩阵
% lb,ub :决策变量的最小取值和最大取值
% intcon 的用法:决策变量如果有三个:x1,x2,x3;若x1和x3是整数,则intcon = [1,3]% 线性0-1规划
% 仍然使用intlinprog函数求解,只需限定lb和ub即可
% 决策变量如果有三个:x1,x2,x3;若x1和x3是0-1变量,x2不限制,则intcon = [1,3],lb = [0;-inf;0],ub = [1;+inf;1]clc;clear
f = [66.8 75.6 87 58.6 57.2 66 66.4 53 78 67.8 84.6 59.4 70 74.2 69.6 57.2 67.4 71 83.8 62.4];
A = zeros(5,20);
for i = 1:5A(i,4*i-3:4*i) = 1;
end
b = ones(5,1);
Aeq = [eye(4), eye(4), eye(4), eye(4), eye(4)];
beq = ones(4,1);
intcon = [1:20];
lb = zeros(20,1);
ub = ones(20,1);
[x,fval] = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)
reshape(x,4,5)'

运行结果:

在这里插入图片描述
在这里插入图片描述
即:甲自由泳;乙蝶泳;丙仰泳;丁蛙泳;戊不参加

四、代码实现----python

在Python中,虽然没有直接对应于MATLAB中intlinprog函数的内置函数,但可以使用以下第三方库来解决混合整数线性规划(MILP)问题,这些库提供了类似的功能:

  1. PuLP
  2. ORTools
  3. Gurobi
  4. CVXPY

本文选用 PuLP 库求解

背包问题

# 背包问题
import pulp
import numpy as np# 定义问题规模
# 变量数
n_variables = 10
# 限制条件数
n_constraints = 1# 创建问题实例
prob = pulp.LpProblem("BinaryVectorLP", pulp.LpMaximize)# 创建0-1变量(向量)
x = [pulp.LpVariable(f'x{i}', cat='Binary') for i in range(n_variables)]# 定义目标函数向量
c = np.array([540, 200, 180, 350, 60, 150, 280, 450, 320, 120])  # 目标函数系数# 定义约束矩阵和向量
A = np.array([6, 3, 4, 5, 1, 2, 3, 5, 4, 2])  # 约束矩阵
b = np.array([30])     # 约束向量# 设置目标函数
prob += pulp.lpSum([c[i] * x[i] for i in range(n_variables)]), "Objective"# 添加约束条件
prob += (pulp.lpSum([A[j] * x[j] for j in range(n_variables)]) <= b[0]), f"Constraint_{0+1}"# 求解
prob.solve()# 输出结果
print("Status:", pulp.LpStatus[prob.status])
for i in range(n_variables):print(f"x{i} =", pulp.value(x[i]))
print("Objective =", pulp.value(prob.objective))

运行结果:

在这里插入图片描述

指派问题

# 指派问题import pulp
import numpy as np# 定义问题规模
# 变量数
n_variables = 20
# 限制条件数
n_constraints_1 = 5
n_constraints_2 = 4# 创建问题实例
prob = pulp.LpProblem("BinaryVectorLP", pulp.LpMinimize)# 创建0-1变量(向量)
x = [pulp.LpVariable(f'x{i}', cat='Binary') for i in range(n_variables)]# 定义目标函数向量
c = np.array([66.8, 75.6, 87, 58.6, 57.2, 66, 66.4, 53, 78, 67.8, 84.6, 59.4, 70, 74.2, 69.6, 57.2, 67.4, 71, 83.8, 62.4])# 定义约束矩阵和向量
A_1 = np.zeros((5,20))
for i in range(1,6):A_1[i-1,4*i-4:4*i] = 1 # 约束矩阵
b_1 = np.ones((5,))     # 约束向量# 定义约束矩阵和向量
A_2 = np.hstack([np.eye(4), np.eye(4), np.eye(4), np.eye(4), np.eye(4)])# 约束矩阵
b_2 = np.ones((4,))     # 约束向量# 设置目标函数
prob += pulp.lpSum([c[i] * x[i] for i in range(n_variables)]), "Objective"# 添加约束条件
for i in range(n_constraints_1):prob += (pulp.lpSum([A_1[i, j] * x[j] for j in range(n_variables)]) <= b_1[i]), f"Constraint_{i+1}"for i in range(n_constraints_2):prob += (pulp.lpSum([A_2[i, j] * x[j] for j in range(n_variables)]) == b_2[i]), f"Constraint_{i+6}"# 求解
prob.solve()# 输出结果
res = np.zeros((20,1))
print("Status:", pulp.LpStatus[prob.status])
for i in range(n_variables):res[i] = pulp.value(x[i])print(f"x{i} =", pulp.value(x[i]))
print("Objective =", pulp.value(prob.objective))
res = res.reshape((5,4))
print(res)

运行结果:

在这里插入图片描述

总结

本文介绍了整数规划和0-1规划,并通过背包问题和指派问题两个典型示例建立模型,分别使用Matlab和python进行代码编写。

相关文章:

【学习笔记】Matlab和python双语言的学习(整数规划和0-1规划)

文章目录 前言一、整数规划和0-1规划二、典型示例1.背包问题2.指派问题 三、代码实现----Matlab1.Matlab 的 intlinprog 函数2.Matlab 代码背包问题指派问题 四、代码实现----python背包问题指派问题 总结 前言 通过模型算法&#xff0c;熟练对Matlab和python的应用。 学习视频…...

【连续4届EI检索,SPIE 出版】第五届信号处理与计算机科学国际学术会议(SPCS 2024,8月23-25)

第五届信号处理与计算机科学国际学术会议&#xff08;SPCS 2024) 将于2024年8月23-25日在中国哈尔滨举行。会议主要围绕信号处理与计算机科学等研究领域展开讨论。 会议旨在为从事信号处理与计算机科学研究的专家学者、工程技术人员、技术研发人员提供一个共享科研成果和前沿技…...

Vue屏蔽Console.Log打印信息

Vue屏蔽打印信息 安装 npm install uglifyjs-webpack-plugin --save-dev 在vue.config.js文件或者webpack.prod.conf.js中配置 vue.config中 const UglifyJsPlugin require(uglifyjs-webpack-plugin) // 屏蔽打印数据 module.exports {optimization: {minimizer: [new Ugl…...

数据结构之《二叉树》(下)

在二叉树(中)了解了堆的相关概念后还实现了堆&#xff0c;并且还实现了堆排序&#xff0c;以及解决了TOP-K问题。接下来在本篇中将继续学习二叉树中的链式结构&#xff0c;会学习二叉树中的前、中、后三种遍历并实现链式结构的二叉树&#xff0c;接下来就开始本篇的学习吧&…...

用Python打造精彩动画与视频,9.3 项目案例分享与反思

第九章&#xff1a;综合项目 9.3 项目案例分享与反思 在本节中&#xff0c;我们将分享几个成功的项目案例&#xff0c;并进行反思总结。这些案例将展示如何将前面所学的Python技术运用于实际项目中&#xff0c;同时我们将讨论项目中的挑战和解决方案&#xff0c;以及从中得到…...

分布式主键 详解

文章目录 雪花算法结合分库分表的问题问题出现原因分析解决思路 分布式主键要考虑的问题主键生成策略雪花算法详解时间戳位问题工作进程位问题序列号位问题根据雪花算法扩展基因分片法 雪花算法结合分库分表的问题 问题出现 使用ShardingSphere框架自带的雪花算法生成分布式主…...

synchronzed为什么要升级为重量级锁,轻量级锁不好吗?

轻量级锁和重量级锁各有其适用场景和优缺点。轻量级锁旨在减少在无竞争情况下的同步开销&#xff0c;而重量级锁则在竞争激烈的情况下确保线程的同步。以下是为什么在某些情况下需要将轻量级锁升级为重量级锁的原因&#xff0c;以及轻量级锁的不足之处&#xff1a; 为什么需要…...

.NET 项目中发送电子邮件异步处理和错误机制的解决方案

在 .NET 中处理电子邮件&#xff0c;可以使用多种技术和库来实现高效的电子邮件发送、接收和管理。以下是一些常见的解决方案和最佳实践&#xff1a; 目录 1. 使用 SMTP 发送电子邮件 2. 使用 IMAP/POP3 接收电子邮件 3. 异步处理电子邮件 4. 处理大型邮件队列 5. 错误处…...

如何在银河麒麟操作系统上搭建 Electron (含 Electron 打包指南)

本次教程所用版本 Eletron版本&#xff1a;31.3.1 Electron-packager版本&#xff1a;17.1.2 VScode版本&#xff1a;1.92.0 Node版本&#xff1a;18.19.0 npm版本&#xff1a;10.2.3 前言&#xff1a; 随着跨平台应用开发的需求日益增长&#xff0c;Electron 和 Qt 成为…...

小怡分享之数据结构基础知识准备

前言&#xff1a; &#x1f308;✨之前小怡给大家分享了JavaSE的知识&#xff0c;今天小怡要给大家分享一下数据结构基础知识。 一、初识集合框架 1.什么是集合框架 Java集合框架Java Collection Framework&#xff0c; 又称为容器container&#xff0c;是定义在Java.util 包…...

Linux安全与高级应用(三)深入探索MySQL数据库:安装、管理与安全实践

文章目录 深入探索MySQL数据库&#xff1a;安装、管理与安全实践MySQL数据库简介MySQL的安装与配置编译安装MySQL配置MySQL服务 MySQL数据库的基本操作数据库的创建与删除表的创建与管理数据记录的增删改查 MySQL用户管理与权限设置MySQL数据库的备份与恢复数据库备份数据库恢复…...

基于jsp的宠物领养与服务管理系统(源码+论文+部署讲解等)

博主介绍&#xff1a;✌全网粉丝10W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术栈介绍&#xff1a;我是程序员阿龙&#xff…...

基于STM32F407+NBIOT+华为云IOT平台设计的环境检测系统

基于STM32F407NBIOT华为云IOT平台设计的环境检测系统实现的功能&#xff1a; 【1】能够采集本地环境的温度、湿度、烟雾浓度&#xff0c;火光信息&#xff0c;在OLED显示屏上显示。 如果检测到烟雾、温度、火光超过阀值会触发蜂鸣器报警。 【2】能够通过NBIOT将本地设备采集的信…...

工具方法 - 如何表扬小孩子

赞扬小朋友的表现可以通过多种方法来进行&#xff0c;以鼓励他们的积极行为和努力&#xff0c;增强他们的自信心和动力。以下是一些有效的赞扬方法&#xff1a; 1. 具体表扬&#xff1a;指出具体的行为或成就&#xff0c;而不是泛泛地说“你很棒”。例如&#xff0c;“你今天很…...

【扒模块】DySample

逐行注释 import torch import torch.nn as nn import torch.nn.functional as F import warnings# 忽略警告信息&#xff0c;这通常用于开发过程中&#xff0c;避免警告干扰输出结果 warnings.filterwarnings(ignore)# 定义一个函数&#xff0c;用于对神经网络模块的权重进行…...

数学建模之数据分析【四】:变量及其分析

文章目录 一、单变量数据1.1 单变量数据1.2 单变量分析的要点&#xff1a; 二、双变量数据2.1 双变量数据2.2 双变量分析的要点 三、多元数据3.1 多元数据3.2 多元分析的要点 四、单变量&#xff0c;双变量和多变量数据之间的区别 公众号/小红书: 快乐数模 CSDN: 清上尘 本文&a…...

iOS ------ UIKit相关

UIView和CALayer UIView UIView表示屏幕上的一块矩形区域&#xff0c;它是基本上iOS中所有可视化控件的父类。UIView可以管理矩形区域里的内容&#xff0c;处理矩形区域的事件&#xff0c;包括子视图的管理以及动画的实现。 UIKit相关类的继承关系 UIView继承自UIResponde…...

24/8/9算法笔记 随机森林

"极限森林"&#xff08;Extremely Randomized Trees&#xff0c;简称ERT&#xff09;是一种集成学习方法&#xff0c;它属于决策树的变体&#xff0c;通常被归类为随机森林&#xff08;Random Forest&#xff09;的一种。极限森林的核心思想是在构建决策树时引入极端…...

如何在前后端分离项目中,使用Spring Security

使用 WebSecurityConfigurationAdapter 在前后端分离的架构中&#xff0c;通常使用 Token 进行认证和授权是一种常见的做法。Token 可以是 JSON Web Token&#xff08;JWT&#xff09;&#xff0c;用于在客户端和服务器之间传递身份信息和访问控制信息。下面我将详细介绍如何在…...

c#怎么折叠代码快捷

在C#中&#xff0c;‌你可以使用快捷键来折叠或展开代码&#xff0c;‌以便更好地管理和浏览代码。‌以下是一些常用的快捷键&#xff1a;‌ 折叠所有方法&#xff1a;‌使用Ctrl M O。‌折叠或展开当前方法&#xff1a;‌使用Ctrl M M。‌展开所有方法&#xff1a;‌使用…...

数据库篇--八股文学习第十七天| 什么是慢查询?原因是什么?可以怎么优化?;undo log、redo log、binlog 有什么用?

1、什么是慢查询&#xff1f;原因是什么&#xff1f;可以怎么优化&#xff1f; 答&#xff1a; 数据库查询的执行时间超过指定的超时时间时&#xff0c;就被称为慢查询。 原因&#xff1a; 查询语句比较复杂&#xff1a;查询涉及多个表&#xff0c;包含复杂的连接和子查询&…...

插件、cookie存储,json,ajax详解

1.插件 下载地址&#xff1a;http://github.com/carhartl/jquery-cookie/zipball/v1.4.1 使用文档&#xff1a;jquery-cookie(github.com) 2.存储 初学前端用的是localStorage和sessionStorage&#xff0c;后来又引入了cookie进行存储。 localStorage使用如下 sessionStor…...

快速上手Spring Boot

快速上手Spring Boot (qq.com)...

思路超清晰的 LVS-NAT 模式实验部署

目录 一、实验原理 1、实验基础配置图 2、实验原理 二、实验环境准备 1、准备四台红帽9的主机 2、四台主机的基础配置 &#xff08;1&#xff09;client 1&#xff09;配置主机名&#xff1a;client 2&#xff09;配置ip:172.25.254.200 &#xff08;2&#xff09;lv…...

Android实时通信:WebSocket与WebRTC的应用与优化

文章目录 一、WebSocket在Android中的应用1.1 简介1.2 示例 二、WebRTC在Android中的应用2.1 简介2.2 示例 三、Android实时通信的优化策略3.1 网络优化3.2 延迟降低 四、Android实时通信的安全问题五、实时通信协议的比较六、总结 在现代移动应用中&#xff0c;实时通信已经成…...

力扣刷题之3131.找出与数组相加的整数I

题干描述 给你两个长度相等的数组 nums1 和 nums2。 数组 nums1 中的每个元素都与变量 x 所表示的整数相加。如果 x 为负数&#xff0c;则表现为元素值的减少。 在与 x 相加后&#xff0c;nums1 和 nums2 相等 。当两个数组中包含相同的整数&#xff0c;并且这些整数出现的频…...

非线性表之堆的实际应用和二叉树的遍历

目录 前言&#xff1a;前一篇我已经介绍过了二叉树和堆的介绍和相关代码的实现 一、堆的实现 1.1堆向上调整算法 1.2堆向下调整算法 二、堆的应用 2.1堆的排序 2.2TOP-K问题 三、二叉树的遍历 3.1 二叉树的创建 3.2遍历介绍 3.3前序遍历 3.4中序遍历 3.5后序遍历 …...

os.path库学习之splitext函数

os.path库学习之splitext函数 一、简介 os.path.splitext 是 Python 标准库 os.path 模块中的一个函数&#xff0c;用于将文件名分割成两部分&#xff1a;文件名和扩展名。这个函数非常有用&#xff0c;特别是在处理文件路径和文件扩展名时。 二、语法和参数 语法: os.path…...

Python知识点:如何使用Sqlmap进行SQL注入测试

使用 Sqlmap 进行 SQL 注入测试是一个非常有效的方法&#xff0c;它可以帮助你自动化地检测和利用 SQL 注入漏洞。以下是使用 Sqlmap 进行 SQL 注入测试的详细步骤&#xff1a; 1. 安装 Sqlmap 首先&#xff0c;你需要安装 Sqlmap。Sqlmap 是一个 Python 工具&#xff0c;因此…...

Android Gradle开发与应用 (一) : Gradle基础

Gradle基础 Gradle 是一个基于 Apache Ant 和 Apache Maven 概念的项目自动化构建工具。它使用一种基于 Groovy 的特定领域语言&#xff08;DSL&#xff09;来声明项目设置&#xff0c;而不是传统的 XML。Gradle 提供了灵活的构建脚本和强大的依赖管理功能&#xff0c;使其成为…...