Gurobi解决优化问题

news2025/1/10 16:13:01

Gurobi1介绍

Gurobi是一种优化软件,用于解决各种数学规划和整数规划问题。它提供了高性能的数学规划求解器,可用于最大化或最小化目标函数的线性规划、混合整数规划、二次规划、约束规划等问题。

  • Gurobi具有强大的求解能力和高效的算法,可以处理大规模复杂问题。它的求解器使用先进的优化技术,如线性规划的单纯形法、内点法以及整数规划的分支定界法和割平面法等。Gurobi还提供了丰富的API(应用程序编程接口),可以与各种编程语言(如Python、C++、Java等)进行集成,使开发者能够方便地使用它的功能来解决实际问题。
  • Gurobi的应用领域广泛,包括物流和运输优化、生产计划、资源分配、金融风险管理、电力系统调度等。通过使用Gurobi,用户可以对复杂的决策问题建立数学模型,并通过求解器获得最优或接近最优的解决方案,从而提高效率、降低成本或优化资源利用。

Gurobi的建模流程

  • 建模示例图
    建模流程示例图

建模流程

  1. 定义变量;’(需要定义问题中所有的变量,并指定相应限制;如上下界限制和初始值等等;)
  2. 定义目标函数;(根据问题的要求设置目标函数,可以最大化或最小化某种目标)
  3. 定义约束条件;(根据问题的限制条件,设置相应的约束条件,例如等式约束、不等式约束等。需要注意的是,在设置约束条件时,需要保证所有的约束条件都被满足。)
  4. 执行优化函数;(调用内部优化函数来获取最终结果;)
  5. 检查求解状态并获取结果;获取相应的结果即可

注:1~4步骤对应的相关函数见流程图;下面示例也会有所体现

使用Gurobi解决优化问题示例1(需先在电脑上配置Gurobi环境)

预备知识

  1. python基础语法;可参考(看到模块篇章就够用了):廖雪峰python教程
  2. Gurobi基础;可参考(Gurobi官网示例):Gurobi
    在这里插入图片描述

优化问题

实战数学优化问题1

  1. 题目示例图

示例1

  1. 步骤解析(按照建模流程来)
  • 基础步骤;导包
import gurobipy as gb
# 创建一个新的模型 调用内置函数Model()创建模型
model = gb.Model()
  • 流程步骤;回顾

① 定义变量;定义问题中所有的变量,指定限制如上下界等,变量过多常用循环限制;
在这里插入图片描述

# 创建变量
x = {}
# 下标1~3;双循环将下标都表示出来
for i in range(1, 4):
    for j in range(1, 4):
        # 这一行代码的作用是,向数学优化模型中添加一个名为"xij"的新的二元变量x[i,j],其取值范围为[0,1]。
        x[i, j] = model.addVar(lb=0, ub=1, name=f'x{i}{j}')

解释:model.addVar() 是一个用于向优化模型中添加变量的方法;并且可以指定这些变量的:名称、类型、上下界等特性;上述代码中传入了三个参数;lb=0代表变量下界为0,ub=1代表变量上界为1,name=f’x{i}{j}'代表变量的名称为x的索引i和j的字符串组合。

为了更好的理解上述代码,复习python字典(键值对)

x = {} # 创建了一个字典
x['key1'] = 'value1' # [ ] 的形式出来了
x['key2'] = 'value2'
print(x)  # 输出: {'key1': 'value1', 'key2': 'value2'}

但是我们想要x[i][j]的形式;这样我们就需要用到嵌套字典的知识,如下

x = {'a': {'kk': 1, 'why': 2}, 'b': {'hq': 3, 'qwe': 4}}

这样;我们可以使用 x[‘a’][‘kk’] 来访问 x 中第一个字典(即键为 ‘a’ 的字典)中键为 ‘kk’ 的值。这将返回值 1; x[i][j] 这样的语法,则假定 x 是一个嵌套字典,并且 i 和 j 是其键。因此,x[i][j] 表示获取嵌套字典 x 中键为 i 的值,然后再获取该值所对应的嵌套字典中键为 j 的值。
我们题解就是用到了嵌套字典的形式;上面项目就是生成一个个变量参数x[i][j]

② 定义目标函数;此处为最小化某种目标

# 设置目标函数
model.setObjective(sum(x[i, j] for i in range(1, 4) for j in range(1, 4)), gb.GRB.MINIMIZE)

解释:使用 gurobi 提供的 GRB.MINIMIZE 模式(固定写法),表示我们要最小化目标函数。该目标函数是由两个嵌套的 for 循环所定义的,循环变量 i 和 j 分别遍历范围为 [1, 4) 的整数集合,因此这个目标函数的形式可以理解为

minimize: x[1, 1] + x[1, 2] + x[1, 3] + x[2, 1] + x[2, 2] + x[2, 3] + x[3, 1] + x[3, 2] + x[3, 3]

其中 x[i, j] 表示模型中的决策变量,它们的值可以是任意实数,并且在其他约束条件下可能会被限制。通过最小化这个目标函数,我们希望找到一组值使得所有决策变量的总和尽可能地小。

③ 定义约束条件;将s.t.中的约束条件表示出来即可;

for i in range(1, 4):
    model.addConstr(sum(x[i, j] for j in range(1, 4)) == 1, name=f'c{i}')

for j in range(1, 4):
    model.addConstr(sum(x[i, j] for i in range(1, 4)) == 1, name=f'c{j+3}')

解释: model.addConstr() 用于添加约束条件;① sum(x[i, j] for j in range(1, 4)) == 1;表示在所有列(j)上,第 i 行上的决策变量 x[i, j] 的总和必须等于 1。也就是说,每一行上只能选择一个 x[i, j] 变量为 1,其他都必须为 0;
其中还有一个约束条件:在① 定义变量的时候已经解决了【范围】;
在这里插入图片描述
④ 执行优化函数;固定写法

# 执行优化函数
model.optimize()

⑤ 检查求解状态并获取结果;最后获取相应的结果即可

# 检查求解状态
if model.status == gb.GRB.OPTIMAL:
# 打印最优解
    print('最优解是:')
    for i in range(1, 4):
        for j in range(1, 4):
            print(f'x{i}{j}: {x[i, j].x}')
    print('目标函数值:', model.objVal)
else:
    print('未找到最优解。')

实战数学优化问题1完整代码

# 基础步骤
import gurobipy as gb
model = gb.Model()

# 流程步骤
# ① 定义变量
x = {}
for i in range(1, 4):
    for j in range(1, 4):
        x[i, j] = model.addVar(lb=0, ub=1, name=f'x{i}{j}')

# ② 定义目标函数
model.setObjective(sum(x[i, j] for i in range(1, 4) for j in range(1, 4)), gb.GRB.MINIMIZE)

# ③ 定义约束条件
for i in range(1, 4):
    model.addConstr(sum(x[i, j] for j in range(1, 4)) == 1, name=f'c{i}')

for j in range(1, 4):
    model.addConstr(sum(x[i, j] for i in range(1, 4)) == 1, name=f'c{j+3}')
    
# ④ 执行优化函数
model.optimize()

# ⑤ 检查求解状态并获取结果
if model.status == gb.GRB.OPTIMAL:
    # 打印最优解
    print('最优解是:')
    for i in range(1, 4):
        for j in range(1, 4):
            print(f'x{i}{j}: {x[i, j].x}')
    print('目标函数值是:', model.objVal)
else:
    print('未找到最优解。')

实战数学优化问题1求解结果

在这里插入图片描述
总结:一般数学优化问题,可以参数上述5个步骤来。

参考

这篇Gurobi教程写的不错

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

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

相关文章

SpringBoot+Durid+dynamic-datasource实现多数据源分布式事务

SpringBootDuriddynamic实现多数据源分布式事务 引言: 在现代的应用程序中,使用多个数据源来处理不同的业务需求已成为常态。然而,处理多数据源之间的分布式事务是一个复杂的问题。本文将介绍如何使用Spring Boot、Druid和dynamic-datasourc…

java娱乐新闻系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目wap

一、源码特点 java 娱乐新闻系统是一套完善的java web wap信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&…

python---------bs4爬取数据的一种神器

作者前言 欢迎小可爱们前来借鉴我的gtieehttps://gitee.com/qin-laoda 目录 Beautiful Soup的简介 解析⼯具对⽐ BeautifulSoup的基本使⽤ 解析器 搜索⽂档树 CSS常⽤选择器介绍 select和css选择器提取元素 _______________________________________________ 前面我已经…

MongoDB快速实战与基本原理-01

一、MongoDB介绍 1、什么是MongoDB MongoDB是 一个文档数据库(以 JSON 为数据模型) ,由C语言编写,旨在 为 WEB应用提供可扩展的高性能数据存储解决方案。 文档来自于“ JSON Document”,并非我们一般理解的 PDF&am…

Nik Color Efex 滤镜详解(2/5)

交叉冲印 Cross Processing 提供多种选项来处理 C41 - E6(用幻灯片显影液处理彩色底片)和 E6 - C41(用彩色底片显影液处理幻灯片)。 方法 Method 选择预设。 强度 Strength 控制滤镜效果程度。 黑暗对比度 Dark Contrasts 使用新…

这本书解开了我心中多年的疑惑,也推荐给你

我对地理一直比较感兴趣,中学时知识掌握的比较扎实,分得清洋流走向、季风信风、世界渔场等等,长期闲置不用已经遗忘的差不多。当时看地理真的是地理,现在看地理,不单单只是地理,还有政治、军事、经济、文化…

港科夜闻|香港科大工学院陈浩教授获选2023年亚洲青年科学家

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大工学院陈浩教授获选2023年亚洲青年科学家。亚洲青年科学家基金项目于2022年推出,是一项私人资助的研究奖学金计划,旨在鼓励和支持亚洲区内的青年科学家进行推动变革的创新研究&#xff0c…

springCloudAlibaba组件-Nacos-服务注册与心跳机制(二)

文章目录 nacos服务注册流程图专业术语服务注册执行流程 nacos服务注册流程图 专业术语 1.服务注册:为了将所有的微服务都方便管理,需要将自身的信息(ip地址、端口号、服务名称)以http请求方式调用nacos注册中心接口都放到nacos服…

有趣的数学 求和符号Σ (sigma)简述

一、简单相加 符号∑(sigma)通常用于表示多个项的总和。这个符号通常伴随着一个索引,该索引变化以包含总和中必须考虑的所有术语。 例如,݊第一个整数的和可以用以下方式表示: 或者,这两种表示意思都是一样…

【JS】中 ?.、??、??= 的用法和含义

今天分享几个处理空值简单的方法,避免使用三目运算、与或、if else时增加冗余的代,希望对大家有帮助。 可选链(?.) let a; let b a.?age; 含义: 可选链,只有当a存在,同时 a 具有 age 属性的时候,才会把值赋给b,否则就会将 u…

【FPGA入门】第二篇、ISE软件的使用

目录 第一部分、新建工程 第二部分、添加顶层文件 第三部分、添加管脚约束文件 第四部分、生成bit文件 第五部分、连接开发板,下载bit文件 第六部分、总结 第一部分、新建工程 第一步、如果提前建立了工程文件夹,那么这里就需要去掉生成子文件夹的…

字符串--const类型限定符、字符处理函数(修改首字母的大小写)、数值字符串向数值得转换

目录 一、const类型限定符 二、字符处理函数 三、数值字符串向函数值转换 一、const类型限定符 通过采用指针或数组作函数参数,可使调用者获得修改后的数据,但有时我们只希望将数据传到被调函数的内部,而并不希望它们在函数内被修改&…

Spring6 JdbcTemplate和事务

文章目录 1、JdbcTemplate1.1、简介1.2、准备工作1.3、实现CURD①装配 JdbcTemplate②测试增删改功能③查询数据返回对象④查询数据返回list集合⑤查询返回单个的值 2、声明式事务概念2.1、事务基本概念①什么是事务②事务的特性 2.2、编程式事务2.3、声明式事务 3、基于注解的…

AI无处不在,科技改变生活:开放原子全球开源峰会参会感悟

目录 前言 英特尔的开源之路 拥抱人工智能 AIGC的浪潮之巅 全链路AI解决方案 极致性能优化 结束语 前言 2023年开放原子全球开源峰会 目前中国源代码贡献量已达到世界第二,开源软件开发者数量也已突破800万,居全球第二。在众多开发者的关注下&…

2.部署Keystone服务

在OpenStack的框架体系中Keystone的作用类似于一个服务总线,为OpenStack提供身份管理服务,包括用户认证,服务认证和口令认证,其他服务通过Keystone来注册服务的Endpoint(端点),针对服务的任何调…

50 最佳实践-安全最佳实践-Libvirt鉴权

文章目录 50 最佳实践-安全最佳实践-Libvirt鉴权50.1 简介50.2 开启libvirt鉴权50.3 管理SASL 50 最佳实践-安全最佳实践-Libvirt鉴权 50.1 简介 用户使用libvirt远程调用功能时,如果不进行任何鉴权校验,所有连接到主机所在网络的第三方程序都可以通过…

一道北大强基题背后的故事(四)——数学之美,美在哪里?

早点关注我,精彩不错过! 在前面文章中,我们重点聊了[((1 sqrt(5)) / 2) ^ 12]这道题可能的弯路,出题思路和这道题设计巧妙的结论,相关内容请戳: 一道北大强基题背后的故事(三)——什…

MTK 平台相机bringup流程

和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一、Camera 框架介绍二、Camera Bringup 需要配置的文件三、复盘总结 一、Camera 框架介绍 Camera 的框架分为 Kernel 部分和 hal 部分,其中…

需求分析引言:架构漫谈(一)

本文主要对架构的概念做一些介绍,并引申出需求分析的重要性。 后续准备做一个系列,定期介绍我工作以来的一些需求实现的案例。 注:因为架构的内容比较庞大,里面的每个点,都可以扩展成一系列的文章, 因此&am…

基于Java精品酒销售管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…