电力系统强大的Gurobi 求解器的学习(PythonMatlab)

news2025/7/19 16:17:09

 

到底有多强大,看看就知道,必须👍👍👍: 

目录

1 概述 

 2 算例理解【Python】

2.1 算例1——详细入门

 2.2 算例2——一般线性规划问题

 2.3 算例3——非凸问题

  3 算例升级【Matlab】

3.1 模型

3.2 电力系统经济调度(Matlab代码实现)[Yalmip + Gurobi] 

4 致谢 

1 概述 

我们经常提到优化模型的。具有线性目标函数、线性约束和连续变量的模型是线性程序 (LP)。如果目标是二次型,则模型是二次程序 (QP)。如果任何约束是二次的,则模型是二次约束程序 (QCP)。我们有时会提到QCP的一些特殊情况:具有凸约束的QCP,具有非凸约束的QCP,双线性程序二阶锥程序(SOCP)。如果模型包含任何整数变量、半连续变量、半整数变量、特殊有序集 (SOS) 约束或常规约束,则该模型是混合整数程序 (MIP)。我们有时还会讨论MIP的特殊情况,包括混合整数线性程序(MILP),混合整数二次程序(MIQP),混合整数二次约束程序(MIQCP)混合整数二阶锥程序(MISOCP)。Gurobi Optimizer 处理所有这些模型类。

Gurobi Python接口中的大多数操作都是通过在Gurobi对象上调用方法来执行的。最常用的对象是模型。模型由一组决策变量(类 Var 或 MVar 的对象)、这些变量上的线性或二次目标函数(使用 Model.setObjective 指定)和这些变量上的一组约束(类 Constr、MConstr、QConstr、SOS 或 GenConstr 的对象)组成).每个变量都有关联的下限、上限和类型(连续、二进制等)。每个线性或二次约束都有一个关联的意义(小于或等于、大于或等于或等于)和右侧值。有关变量、约束和目标的详细信息,请参阅本节。

优化模型可以通过从文件加载模型(使用前面提到的读取函数)一次性全部指定,也可以增量构建,方法是首先构造类 Model 的空对象,然后调用 Model.addVar、Model.addVars 或 Model.addMVar 来添加其他变量,以及 Model.addConstr、Model.addConstrs、Model.addLConstr、Model.addQConstr、 Model.addSOS,或任何 Model.addGenConstrXxx 方法来添加其他约束。

生成模型后,可以调用 Model.optimize 来计算解决方案。默认情况下,optimize 将使用并发优化器求解 LP 模型,使用势垒算法求解具有凸目标的 QP 模型和具有凸约束的 QCP 模型,否则将使用分支和切割算法。该解决方案存储在模型的一组属性中,可以随后查询这些属性(我们稍后将返回到本主题)。

Gurobi 算法会仔细跟踪模型的状态,因此,如果自上次优化模型以来相关数据已更改,则对 Model.optimize 的调用才会执行进一步的优化。如果要放弃以前计算的解决方案信息,并在不更改模型的情况下从头开始优化,可以调用 Model.reset。

求解 MIP 模型后,可以调用 Model.fixed 来计算关联的固定模型。此模型与原始模型相同,只是整数变量固定在 MIP 解决方案中的值。如果模型包含 SOS 约束,则这些约束中出现的一些连续变量也可能是固定的。在某些应用程序中,计算此固定模型上的信息(例如,对偶变量、灵敏度信息等)可能很有用,尽管在解释此信息时应小心谨慎。

 2 算例理解【Python】

2.1 算例1——详细入门

2.1.1 算例

为了清晰明了,公式得纯手打:

                          \begin{array}{ll} \min & w \\ \text { s.t. } & (x-1)^{2}+(y-1)^{2}-1 \leqslant 0 \\ & z+y-2 \leqslant 0 \\ & z=|x| \\ & u=y+4 \\ & w=\max \{z, u\} \\ & w, z \geqslant 0 \end{array}

2.1.2 Python代码实现

这里为了方便讲解,这样安排:

'''======1.导入相关库========'''
from gurobipy import *

'''======2.创建模型=========='''
#MODEL = gurobipy.Model("Model_name")
#或者 model = Model('name_')也可以这样。
model = Model('nonlinear example')  #非线性规划

'''======3.创建变量============='''
#    (1)lb=0.0,变量的下界,默认为0;
#    (2)ub=GRB.INFINITY,变量的上界,默认为无穷;
#    (3)vtype,变量的类型,默认为连续型,可改为 GRB.BINARY 0-1变量;GRB.INTEGER 整型;name=”“,变量名,默认为空。
w = model.addVar(lb=0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name='w')
z = model.addVar(lb=0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name='z')
x = model.addVar(lb=-GRB.INFINITY, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name='x')
y = model.addVar(lb=-GRB.INFINITY, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name='y')
u = model.addVar(lb=-GRB.INFINITY, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name='u')

'''=====4..更新变量空间========='''
model.update()

'''=======5.目标函数============'''
# 单目标: MODEL.setObjective(expression, sense=None) sense可用选择:GRB.MINIMIZE/GRB.MAXIMIZE
# 多目标:MODEL.setObjectiveN(expression, index, priority=0, weight=1.0, abstol=0, reltol=0, name="")
# expression: 表达式,可以是一次或二次函数类型,目标函数
# index: 目标函数对应的序号 (默认 0,1,2,…), 以 index=0 作为目标函数的值, 其余值需要另外设置参数
# priority: 分层序列法多目标决策优先级(整数值), 值越大优先级越高
# weight: 线性加权多目标决策权重(在优先级相同时发挥作用)
# abstol: 分层序列法多目标决策时允许的目标函数值最大的降低量
# reltol: 分层序列法多目标决策时允许的目标函数值最大的降低比率 reltol*|目标函数值|
model.setObjective(w, GRB.MINIMIZE)

'''========6.约束条件================='''
# 表达式约束: model.addConstr(expression, name="")
# 范围约束:model .addRange(expression, min_value, max_value, name="")
# 指示变量约束,指示变量 binvar 的值取 binval 时, 进行约束 expression: MODEL.addGenConstrIndicator(binvar, binval, expression, name="")
# addQConstr: 添加二次约束
# addGenConstrAbs: 添加绝对值约束,也可以用abs_(x)
# addGenConstrMax:添加max ⁡ \maxmax约束,也可以用max_(z, u)

model.addQConstr(x*x - 2 * x + 1 + y*y - 2*y + 1 - 1 <= 0)
# 或者可以是 model.addConstr(x*x - 2 * x + 1 + y*y - 2*y + 1 - 1 <= 0)
model.addConstr(z + y - 2 <= 0)
model.addGenConstrAbs(z, x)
# 或者可以是 model.addConstr(z == abs_(x))
model.addConstr(u == y + 4)
model.addGenConstrMax(w, (z, u))
# 或者可以是 model.addConstr(w == max_(z, u))
# 或者可以是 model.addConstr(z == max_([z, u]))

'''======7.求解优化问题========'''
# 输出:model.write('VRPTW1.lp')
# 求解:model.optimize()
model.optimize()

'''=======8.输出结果============='''
print('Optimal Obj: {}'.format(model.ObjVal))
print('x = {}'.format(x.x))
print('z = {}'.format(z.x))
print('y = {}'.format(y.x))
print('u = {}'.format(u.x))
print('w = {}'.format(w.x))
'''======1.导入相关库========'''
from gurobipy import *

'''======2.创建模型=========='''
#MODEL = gurobipy.Model("Model_name")
#或者 model = Model('name_')也可以这样。
model = Model('nonlinear example')  #非线性规划

'''======3.创建变量============='''
#    (1)lb=0.0,变量的下界,默认为0;
#    (2)ub=GRB.INFINITY,变量的上界,默认为无穷;
#    (3)vtype,变量的类型,默认为连续型,可改为 GRB.BINARY 0-1变量;GRB.INTEGER 整型;name=”“,变量名,默认为空。
w = model.addVar(lb=0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name='w')
z = model.addVar(lb=0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name='z')
x = model.addVar(lb=-GRB.INFINITY, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name='x')
y = model.addVar(lb=-GRB.INFINITY, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name='y')
u = model.addVar(lb=-GRB.INFINITY, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name='u')

'''=====4..更新变量空间========='''
model.update()

'''=======5.目标函数============'''
# 单目标: MODEL.setObjective(expression, sense=None) sense可用选择:GRB.MINIMIZE/GRB.MAXIMIZE
# 多目标:MODEL.setObjectiveN(expression, index, priority=0, weight=1.0, abstol=0, reltol=0, name="")
# expression: 表达式,可以是一次或二次函数类型,目标函数
# index: 目标函数对应的序号 (默认 0,1,2,…), 以 index=0 作为目标函数的值, 其余值需要另外设置参数
# priority: 分层序列法多目标决策优先级(整数值), 值越大优先级越高
# weight: 线性加权多目标决策权重(在优先级相同时发挥作用)
# abstol: 分层序列法多目标决策时允许的目标函数值最大的降低量
# reltol: 分层序列法多目标决策时允许的目标函数值最大的降低比率 reltol*|目标函数值|
model.setObjective(w, GRB.MINIMIZE)

'''========6.约束条件================='''
# 表达式约束: model.addConstr(expression, name="")
# 范围约束:model .addRange(expression, min_value, max_value, name="")
# 指示变量约束,指示变量 binvar 的值取 binval 时, 进行约束 expression: MODEL.addGenConstrIndicator(binvar, binval, expression, name="")
# addQConstr: 添加二次约束
# addGenConstrAbs: 添加绝对值约束,也可以用abs_(x)
# addGenConstrMax:添加max ⁡ \maxmax约束,也可以用max_(z, u)

model.addQConstr(x*x - 2 * x + 1 + y*y - 2*y + 1 - 1 <= 0)
# 或者可以是 model.addConstr(x*x - 2 * x + 1 + y*y - 2*y + 1 - 1 <= 0)
model.addConstr(z + y - 2 <= 0)
model.addGenConstrAbs(z, x)
# 或者可以是 model.addConstr(z == abs_(x))
model.addConstr(u == y + 4)
model.addGenConstrMax(w, (z, u))
# 或者可以是 model.addConstr(w == max_(z, u))
# 或者可以是 model.addConstr(z == max_([z, u]))

'''======7.求解优化问题========'''
# 输出:model.write('VRPTW1.lp')
# 求解:model.optimize()
model.optimize()

'''=======8.输出结果============='''
print('Optimal Obj: {}'.format(model.ObjVal))
print('x = {}'.format(x.x))
print('z = {}'.format(z.x))
print('y = {}'.format(y.x))
print('u = {}'.format(u.x))
print('w = {}'.format(w.x))

 2.1.3 结果:

 2.2 算例2——一般线性规划问题

2.2.1 算例

                      \begin{array}{cl} \min & Z=8 x_{1}+10 x_{2}+7 x_{3}+6 x_{4}+11 x_{5}+9 x_{6} \\ \mathrm{s.t.} & 12 x_{1}+9 x+25 x_{3}+20 x_{4}+17 x_{5}+13 x_{6} \geq 60 \\ & 35 x_{1}+42 x_{2}+18 x_{3}+31 x_{4}+56 x_{5}+49 x_{6} \geq 150 \\ & 37 x_{1}+53 x_{2}+28 x_{3}+24 x_{4}+29 x_{5}+20 x_{6} \geq 125 \\ & 0 \leq x_{j} \leq 1, j=1,2, \cdots, 6 \end{array}

2.2.2 Python代码实现

#====导入相关库=======
import gurobipy

#====创建模型=======
c = [8, 10, 7, 6, 11, 9]
p = [[12, 9, 25, 20, 17, 13],
	[35, 42, 18, 31, 56, 49],
	[37, 53, 28, 24, 29, 20]]
r = [60, 150, 125]
MODEL = gurobipy.Model("Example")

#=====创建变量===========
x = MODEL.addVars(6, lb=0, ub=1, name='x')

#====更新变量环境=====
MODEL.update()

#========创建目标函数============
MODEL.setObjective(x.prod(c), gurobipy.GRB.MINIMIZE)

#=======创建约束条件=============
MODEL.addConstrs(x.prod(p[i]) >= r[i] for i in range(3))

#======执行线性规划模型=================
MODEL.optimize()
print("Obj:", MODEL.objVal)
for v in MODEL.getVars():
	print(f"{v.varName}:{round(v.x,3)}")  # 查看变量取值,格式模板

2.2.3 结果

 2.3 算例3——非凸问题

估计您有点疲倦了,欣赏几个小图:

🚀🚀🚀🍉🍉🍉🌟🌟🌟✨✨✨🍒🍒🍒🏆🏆🏆😜😜😜🌈🌈🌈💕💕💕💓💓

2.3.1 算例

                           \begin{array}{ll} \min & 1 \\ s . t . & m_{1}+m_{2}+m_{3}=4 \\ & x_{1}=m_{1}\left(x_{2}+x_{3}\right) \\ & x_{2}=m_{2}\left(x_{1}+x_{3}\right) \\ & x_{3}=m_{2}\left(x_{1}+x_{2}\right) \\ & m_{i} \geqslant 0, \quad \forall i=1,2,3 \\ & x_{i} \geqslant 1, \quad \forall i=1,2,3 \\ & x_{i} \in \mathbb{Z}, \quad \forall i \in 1,2,3 \end{array}

2.3.2 python代码实现

#===导入相关库==========
from gurobipy import *

#===创建模型============
m = Model("feitu")
m.setParam('NonConvex', 2) #非凸模型求解参数

#====创建变量=============
x1  = m.addVar(lb=0, vtype=GRB.INTEGER, name="x1")
x2  = m.addVar(lb=0, vtype=GRB.INTEGER, name="x2")
x3  = m.addVar(lb=0, vtype=GRB.INTEGER, name="x3")
m1 = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="m1")
m2 = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="m2")
m3 = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="m3")

#==========约束条件============
m.addConstr(x1 >= 1, "c1")  #x1,x2,c为正整数
m.addConstr(x2 >= 1, "c1")
m.addConstr(x3 >= 1, "c1")
m.addConstr(x1 == m1 * (x2 + x3))
m.addConstr(x2 == m2 * (x1 + x3))
m.addConstr(x3 == m3 * (x1 + x2))
m.addConstr(m1 + m2 + m3 - 4 == 0)

#=========目标函数===========
m.setObjective(1, GRB.MINIMIZE)
m.optimize()

#======结果输出===========
print('x1={} '.format(x1.x))
print('x2={} '.format(x2.x))
print('x3={} '.format(x3.x))

2.3.3 结果


  3 算例升级【Matlab】

3.1 模型

我们的 Gurobi MATLAB 界面使您能够表达以下形式的问题:

    

模型存储为结构变量,每个变量由多个字段组成。这些字段捕获上面列出的不同模型组件。其中许多模型组件是可选的。例如,可以省略完整性约束。

优化模型可以从文件加载(使用gurobi_read函数),也可以通过填充模型变量的相应字段(使用标准 MATLAB 构造)来构建。我们将在模型参数部分中讨论如何表示模型的详细信息。

我们经常提到优化模型的。具有线性目标函数、线性约束和连续变量的模型是线性程序 (LP)。如果目标是二次型,则模型是二次程序 (QP)。如果任何约束是二次的,则模型是二次约束程序 (QCP)。我们有时会提到QCP的一些特殊情况:具有凸约束的QCP,具有非凸约束的QCP,双线性程序二阶锥程序(SOCP)。如果模型包含任何整数变量、半连续变量、半整数变量、特殊有序集 (SOS) 约束或常规约束,则该模型是混合整数程序 (MIP)。我们有时还会讨论MIP的特殊情况,包括混合整数线性程序(MILP),混合整数二次程序(MIQP),混合整数二次约束程序(MIQCP)混合整数二阶锥程序(MISOCP)。Gurobi Optimizer 处理所有这些模型类。

求解模型

构建模型后,可以调用 gurobi 来计算解决方案。默认情况下,gurobi 将使用并发优化器求解 LP 模型,使用势垒算法求解 QP 模型和具有凸约束的 QCP 模型,并使用分支和切割算法求解混合整数模型。解决方案作为结构变量返回。当我们讨论gurobi函数时,我们将讨论如何表示优化结果的细节。

以下是MATLAB API中可能命令序列的简单示例:
model = gurobi_read('examples/data/stein9.mps');
result = gurobi(model);

多种解决方案和多个目标

默认情况下,Gurobi 优化器假定您的目标是为具有单个目标函数的模型找到一个经过验证的最优解。Gurobi提供了允许您放宽这些假设的功能。有关如何请求多个解决方案的信息,请参阅解决方案池部分;有关如何指定多个目标函数并控制它们之间的权衡的信息,请参阅“多个目标”部分。

3.2 电力系统经济调度(Matlab代码实现)[Yalmip + Gurobi] 

上一次在上一篇文章已经梳理过,这里直接附上链接:

电力系统经济调度(Matlab代码实现)[Yalmip + Gurobi]

4 致谢 

刘兴禄,清华大学

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

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

相关文章

Python2.x 与 3​​.x 版本到底有啥区别?

嗨害大家好鸭&#xff01;我是小熊猫~ 今天给大家带来一点小干货~ 很多人对于python的版本有些许疑问&#xff0c; 今天就来给大家说说看~ Python学习资料电子书点击此处跳转文末名片 Python 的 3​​.0 版本&#xff0c;常被称为 Python 3000&#xff0c;或简称 Py3k。 相对…

Mybatis-Plus“读-批量写-读”数据不一致的问题分享

在日常开发过程中&#xff0c;时常会遇到一个如下场景&#xff1a; 根据条件x&#xff0c;读取表A&#xff0c;得到多行数据&#xff1b;遍历读取到的数据&#xff0c;对条件x以外的字段进行修改&#xff0c;并进行保存&#xff1b;&#xff08;重点&#xff09;修改后&#x…

基础算法(七)——离散化

离散化 介绍 这里的离散化&#xff0c;特指整数的、保序的离散化 有些题目可能需要以数据作为下标来操作&#xff0c;但题目给出的数据的值比较大&#xff0c;但是数据个数比较小。此时就需要将数据映射到和数据个数数量级相同的区间&#xff0c;这就是离散化&#xff0c;即…

基于imx6ull第一个Linux驱动

在编译第一个驱动之前&#xff0c;需要把基本的环境准备好&#xff0c;可以参照这两篇文章&#xff1a;https://wlink.blog.csdn.net/article/details/128590747https://wlink.blog.csdn.net/article/details/128591216我们之前写过一个基于ubuntu最基本的字符设备驱动&#xf…

关于固态硬盘冷数据掉速问题解决方案

20230107 By wdhuag 前言&#xff1a; 我有一个西数蓝盘500G固态&#xff0c;系统盘&#xff0c;一年没开机&#xff0c;这个月开机后发现系统很卡&#xff0c;持续读取假死严重。测试没有坏块&#xff0c;网上说的是冷数据掉速问题。 参考&#xff1a; 如何看待西数/闪迪多…

排序算法:插入、希尔、选择、冒泡

目录 一.插入排序 1.算法描述&#xff1a; 2.实现思路&#xff1a; 3.时间复杂度&#xff1a; 代码如下&#xff1a; 二.希尔排序 &#xff08;插入排序的优化升级&#xff09; 1.算法描述&#xff1a; 2.实现思路&#xff1a; 3.时间复杂度&#xff1a; 代码如下&a…

【算法笔记】最近公共祖先(LCA)问题求解——倍增算法

0. 前言 最近公共祖先简称 LCA&#xff08;Lowest Common Ancestor&#xff09;。两个节点的最近公共祖先&#xff0c;就是这两个点的公共祖先里面&#xff0c;离根最远的那个。 这种算法应用很广泛&#xff0c;可以很容易解决树上最短路等问题。 为了方便&#xff0c;我们记…

星光不负赶路人|2022年终总结

时间真快&#xff0c;转眼又是年末。整理一篇文章来给自己好好做一次年终盘点&#xff0c;本着陈述事实&#xff0c;提炼精华&#xff0c;总结不足的思路&#xff0c;给自己这一年的工作、生活、成长画个句号。 工作 &#x1f3e2; 从经海路到中关村 去年换了工作&#xff0c…

Java设计模式中的创建者模式/单例模式是啥?单例模式其中的饿汉式与懒汉式又是啥?又可以用在哪些地方

继续整理记录这段时间来的收获&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 4. 创建者模式 4.1 特点 使用者不需要知道对象的创建细节 4.2 单例模式 4.2.1使用场景 单例类&#xff1a;且仅能创建一个实例类访问类&#xff1a;使用单例类…

七、Gtk4-Defining a final class

1 定义一个最终类 1.1 一个非常简单的编辑器 在上一节中&#xff0c;我们创建了一个非常简单的文件查看器。现在我们继续重写它&#xff0c;并将其转换为非常简单的编辑器。它的源文件是tfe目录下的tfe1.c(文本文件编辑器1)。 GtkTextView是一个多行编辑器。因此&#xff0c…

java学习day71(乐友商城)购物车实现

今日目标&#xff1a; 1.实现未登录状态的购物车 2.实现登陆状态下的购物车 1.搭建购物车服务 1.1.创建module 1.2.pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi&…

软件测试~测试分类

目录 1.按照是否查看代码划分 ① 黑盒测试(Black-box Testing) ② 白盒测试(White-box Testing) ③ 灰盒测试(Gray-Box Testing) 2.按照开发阶段划分 ① 单元测试(Unit Testing) ② 集成测试(Integration Testing) ③ 系统测试(System Testing) ④ 验收测试(Acceptance…

kNN分类

一、 概述 kNN(k nearest neighbor,k近邻)是一种基础分类算法&#xff0c;基于“物以类聚”的思想&#xff0c;将一个样本的类别归于它的邻近样本。 ![在这里插入图片描述] 二、算法描述 1.基本原理 给定训练数据集 T{(x1,y1),(x2,y2),...,(xN,yN)}T\left\{ \left( x_1,y_1 …

17. XML

文章目录一、XML概念二、XML语法1、基础语法2、快速入门3、组成部分4、约束1. 约束概述2. 分类3. DTD4. Schema三、XML解析1、操作xml文档2、 解析xml的方式1. DOM2. SAX3. xml常见的解析器&#xff08;工具包&#xff09;4. Jsoup&#xff08;1&#xff09;快速入门&#xff0…

VUE3 学习笔记(一):环境配置、项目创建

一、首先需要安装node.jsnodejs官网&#xff1a;Node.js (nodejs.org)下载安装包&#xff1a;下载稳定版本即可&#xff0c;目前&#xff08;2023-01-07&#xff09;是18.13.0版本c. 检查当前版本&#xff08;CMD&#xff09;&#xff1a;至此&#xff0c;nodejs已经安装成功&a…

电力系统机组组合(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清…

EM算法学习总结

序 这个和我的硕士毕业论文的题目就有一定关系&#xff0c;我的导师让我按时向她汇报学习进度。然而我还在进行实习&#xff0c;还要准备自己明年的秋招&#xff0c;只能想办法游走于三者之间。 EM算法是一个常用的数据挖掘算法&#xff0c;想必从事数据挖掘的相关工作的同学…

机器人操作系统ROS/ROS2(1)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、ROS和ROS2是什么&#xff1f;二、ROS2安装步骤1.Ubuntu虚拟机安装2.ROS2系统安装3.验证ROS2安装成功4.小海龟仿真示例总结前言 提示&#xff1a;这里可以添…

LeetCode刷题模版:21 - 30

目录 简介21. 合并两个有序链表22. 括号生成23. 合并K个升序链表24. 两两交换链表中的节点25. K 个一组翻转链表26. 删除有序数组中的重复项27. 移除元素28. 找出字符串中第一个匹配项的下标29. 两数相除【未理解】30. 串联所有单词的子串【未理解】结语简介 Hello! 非常感谢您…

devops 是什么东东了

DevOps&#xff0c;字面意思是Development &Operations的缩写。 DevOps是从实践中逐步总结提炼出的方法论理念。近而创造了DevOps这个词。 DevOps概念的萌芽阶段&#xff1a; 2008年敏捷大会上&#xff0c;来自Patrick Debois发表了题为 《Agile Infrastructure & Op…