Gurobi使用(一)——操作指南(转自知乎)

这篇具有很好参考价值的文章主要介绍了Gurobi使用(一)——操作指南(转自知乎)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

好像还是要学一下Gurobi如何使用的,不然这代码着实有点抽象了

一、入门操作

一般来说,求解一个数学规划模型的时候,通常会按照如下步骤解决问题:
设置变量---addVar()。
更新变量空间---update()。
设定目标函数---setObjective()。
设定约束条件---addConstr()。
执行最优化---optimize()。

创建模型:

import gurobipy
model = gurobipy.Model('LP模型测试1')  # 创建一个模型

(1) 设置决策变量

一次创建一个变量:

x = model.addVar(lb=0.0, ub=gurobipy.GRB.INFINITY, vtype=gurobipy.GRB.CONTINUOUS, name="")
  • lb=0.0:变量的下界,默认为0.0。 
  • ub=gurobipy.GRB.INFINITY:变量的上界,默认为无穷大。 
  • vtype=gurobipy.GRB.CONTINUOUS:变量的类型,默认为连续型号。变为GRB.BINARY则是0-1变量,变为GRB.INTEGER则为整数变量。 
  • name="":变量名,默认为空。 

一次创建多个变量:

x = model.addVars(*indexes, lb=0, ub=gurobipy.GRB.INFINITY, vtype=gurobipy.GRB.CONTINUOUS, name="")

示例: 

x = model.addVars(3, 4, 5, vtype=gurobipy.GRB.BINARY, name="C")

一次性生成3x4x5个变量。x包含了3x4x5个变量,可以通过x[i,j,k]来访问单个的变量。

(2)更新变量空间

model.update()

(3)设定目标函数

单目标优化

model.setObjective(expression,sense=None)
  • expression:表达式,可以是一次或者二次函数的类型。 
  • sense:求解类型,GRB.MINIMIZE则为最小值,GRB.MAXMIZE则为最大值。 
model.setObjective(8 * x1 + 10 * x2 + 7 * x3 + 6 * x4 + 11 * x5 + 9 * x6, gurobipy.GRB.MINIMIZE)

多目标优化代码:

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:分层序列法多目标决策时允许的目标函数值的最大降低比率。

(4)添加约束条件:

创建一个约束条件

model.addConstr(expression, name="")
  • expression: 布尔表达式,可以是一次或二次函数类型
  • name: 约束式的名称 
model.addConstr(12 * x1 + 9 * x2 + 25 * x3 + 20 * x4 + 17 * x5 + 13 * x6 >= 60, "c0")

创建多个约束条件

model.addConstrs(expressions, name="")

创建一个指示变量约束

model.addGenConstrIndicator(binvar, binval, expression, name="")

指示变量 binvar 的值取 binval 时, 进行约束 expression 

或者 
方法1: 构造指示变量  ,则上述约束转化为: (M是一个很大的数,可以取1000)
方法2:转化为二次约束,但是如果矩阵为非正定矩阵,则无法求解:

(5)执行最优化

model.Params.LogToConsole=True # 显示求解过程
model.Params.MIPGap=0.0001 # 百分比界差
model.Params.TimeLimit=100 # 限制求解时间为 100s
model.Params.Presolve = -1 # 预处理程度, 0关闭,1保守,2激进
model.Params.MIPFocus = 0 # 求解侧重点. 1快速找到可行解, 2证明最有, 3侧重边界提升, 0均衡搜索
model.Params.SolutionLimit = inf # 求解数量, 默认求所有解, 比较出最优的结果, 只需要可行解时可以设置该参数为1
model.Params.NonConvex = 1  # 默认求解器,改为 2 时可以解决非凸二次优化问题
​
model.optimize()

(6)查看模型优化结果

  • 查看函数值以及变量值
# 查看单目标规划模型的目标函数值
print("Optimal Objective Value", model.objVal)  
# 查看多目标规划模型的目标函数值
for i in range(model.NumObj):
  MODEL.setParam(gurobipy.GRB.Param.ObjNumber, i)
  print(f"Obj {i+1} = {model.ObjNVal}")  
# 查看变量取值
for var in model.getVars():
   print(f"{var.varName}: {round(var.X, 3)}")

(7)辅助函数

quicksum()
quicksum相当于sum及其求和符号,效率更高。
写为: 

for i in I:
    model.addConstr(quicksum(x[i,j] for j in J) <= 5)

此外,它还支持迭代器、生成器协议,也就是说,可以通过下面的代码,实现更为复杂的过滤、求和方法. 

for c in C:
  model.addConstr(gurobipy.quicksum(x[d,i,j] for d in D for i in range(0, 24) for j in range(i + 1, 25) if i <= c < j) >= R[c])


 

 文章来源地址https://www.toymoban.com/news/detail-700155.html

 

到了这里,关于Gurobi使用(一)——操作指南(转自知乎)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 操作指南 | 如何使用Chainlink喂价功能获取价格数据

    Chainlink的去中心化预言机网络中的智能合约包含由运行商为其他智能合约(DApps)使用或截取所持续更新的实施价格数据。其中有两个主要架构:喂价和基础要求模型。此教程将会展现如何在Moonbeam、Moonriver或是Moonbase Alpha测试网上使用喂价功能。 这些信息仅用于教育目的,永

    2024年02月11日
    浏览(51)
  • 【Golang】golang使用三方SDK操作容器指南

    大家好 我是寸铁👊 总结了一篇 golang使用三方SDK操作容器✨ 喜欢的小伙伴可以点点关注 💝 这应该是目前全网最全golang使用三方SDK操作容器的指南了✌️ 主要是创建容器的配置信息,常用的字段 使用包如下: 配置创建Docker 容器的结构体,具体字段的含义和用途如下: 1.

    2024年04月11日
    浏览(40)
  • Moonbeam操作指南|如何使用Gelato创建自动化任务

    Gelato是一个Web3去中心化自动化网络,允许开发者横跨多个基于EVM兼容区块链上自动化和连接任意的智能合约执行。 📑阅读中文版详细操作教程 举例来说,我们将使用MetaMask作为钱包。同时,您的钱包余额中需要有一些GLMR用于支付自动化交易的gas费用。 开始之前,请先前往

    2024年02月02日
    浏览(49)
  • 【操作宝典】IDE神器解密:IntelliJ IDEA详细教程,Java编程进阶指南!

    目录 🛸1. 新建Java项目 🛸2. 运行Java程序 🛸3. 创建springboot项目 方法一 导入jar包 ​编辑方法二 maven的安装配置 🛸4. 创建Vue项目 ​编辑4.1 配置node.js ​编辑4.2 idea运行 文件--新建--项目 JAVA模型--JDK 注意: 程序放在src里面 xxx.java则创建的类名只能为xxx 示例程序Hello.java 建议使

    2024年02月05日
    浏览(49)
  • MySQL 数据库操作指南:LIMIT,OFFSET 和 JOIN 的使用

    您可以通过使用\\\"LIMIT\\\"语句来限制查询返回的记录数量。以下是一个示例,获取您自己的Python服务器中\\\"customers\\\"表中的前5条记录: 如果您想返回五条记录,从第三条记录开始,可以使用\\\"OFFSET\\\"。以下是一个示例: 通过使用JOIN语句,您可以基于它们之间的相关列合并两个

    2024年02月05日
    浏览(49)
  • Go语言变量使用指南:声明、类型转换与字符串操作

    深入了解Go语言中变量的声明方式、字符和布尔类型的细节、字符串的不可变性以及基本数据类型之间的转换规则。

    2024年02月10日
    浏览(89)
  • Word不同部分(分节)设置页眉和页码的使用指南——附案例操作

    在撰写word文档时,我们经常需要在不同的部分应用不同的页眉和页码格式。在这篇博文中,我们将深入探讨如何正确使用这些功能,避免常见错误,以及关注设置的重点。 在需要设置不同页眉和页码的地方,首先插入分节符: 将光标放在要分割的位置,如新的章节开始处。

    2024年01月23日
    浏览(46)
  • MySQL Workbench 使用教程 - 如何使用 Workbench 操作 MySQL / MariaDB 数据库中文指南

    MySQL Workbench 是一款专门为 MySQL 设计的可视化数据库管理软件,我们可以在自己的计算机上,使用图形化界面远程管理 MySQL 数据库。 有关 MySQL 远程管理软件,你可以选择 Windows 下的 HeidiSQL,MacOS 下的 Sequel Ace 或者 MySQL 官方推出的跨平台客户端 MySQL Workbench 。 本文使用 Mac 版

    2024年02月10日
    浏览(46)
  • AI绘图提示词/咒语/词缀/关键词使用指南(Stable Diffusion Prompt 设计师操作手册)

    基本知识 : 安装及其问题解决参考:《Windows安装Stable Diffusion WebUI及问题解决记录》; 运行使用时问题《Windows使用Stable Diffusion时遇到的各种问题整理》; 模型运用及参数《Stable Diffusion 个人推荐的各种模型及设置参数、扩展应用等合集》; 提示词生图咒语《AI绘图提示词

    2024年02月01日
    浏览(74)
  • Linux常规操作指南

    (1)查看当前目录内容 或查看详细信息: (2)切换工作目录 (3)创建新目录 (4)删除空目录 (5)删除文件或目录(递归删除) (1)复制文件或目录 (2)移动或重命名文件/目录 (3)查看文件内容 (4)编辑文件(使用vi/vim编辑器) 在vi中,输入 i 进入插入模式,编辑

    2024年01月19日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包