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

Gurobi基础语法之打印模型

        本文将介绍 lp 后缀和 mps 为后缀的文件,并介绍从常见模型中提取目标函数,约束条件的方法

.lp 后缀的文件

一个 .lp 文件通常包含以下几个部分:

  1. 目标函数(Objective):定义需要最大化或最小化的目标。
  2. 约束条件(Constraints):描述变量需要满足的条件。
  3. 变量定义(Variable Definitions):指定变量的类型(连续、整数、二进制等)和取值范围。

 .mps 后缀的文件

.mps 文件采用固定格式的记录来表示优化问题的各个部分,主要包括以下几种记录类型:

  1. NAME:指定问题的名称。
  2. ROWS:定义目标函数和约束条件的行。
  3. COLUMNS:描述变量及其在目标函数和约束条件中的系数。
  4. RHS:指定约束条件的右侧常数。
  5. BOUNDS:定义变量的取值范围。

        只需要在模型建立后调用m.write("文件名.lp")  或 m.write("文件名.mps")就可以按照格式将模型打印到文件中

python 提取优化模型的目标函数

x = m.addVar(ub=1000, vtype=GRB.CONTINUOUS, name="x")
y = m.addVar(ub=500, vtype=GRB.CONTINUOUS, name="y1")
z = m.addVars(3, name=["z1", "z2", "z3"])

ztcoef = { 0 : 11, 1 : 12, 2 : 8 }

# 设置目标函数
m.setObjective(-300 * x + 2 * y + z.prod(ztcoef), GRB.MAXIMIZE)
# 必须要更新模型,才能在python中获得这些模型的表达式
m.update()

# 打印目标函数
obj = m.getObjective() 
print('Objective function:', obj) 

python 中提取优化模型的约束条件

        提取带有二次约束的优化模型的约束条件

m = gp.Model()
x = m.addVars(5, name="x")
y = m.addVars(5, name="y")
ww = m.addConstrs((x[i]*x[i] + y[i]*y[i] + 2 * y[i] <= 2 for i in range(5)), name="c")
m.update()
for consstrsub, Qconstrexpr in ww.items():
    Qcname = Qconstrexpr.QCName
    curleftside = m.getQCRow(Qconstrexpr)
    sense = Qconstrexpr.QCSense
    sense_mapping = {'<': '<=', '>': '>=', '=': '='}
    cursense = sense_mapping[sense]
    currhs = Qconstrexpr.QCRHS
    print(f'{Qcname}: {curleftside} {cursense} {currhs}')

        说明

1. ww作为一个 tupledict 类型的对象,每个键值对都是以约束的下标(从0开始)为 key,QConstr 类对象为value

2. 想要获得约束条件的约束名称,左侧表达式,关系运算符,右侧数值,都只有通过 QConstr 这个类才能实现,其中

       约束条件的约束名称: QConstr 的 QCName 成员

       约束条件的左侧表达式:m.getQCRow(QConstr 对象) 

       约束条件的关系运算符:QConstr 的 QCSense 成员

       约束条件的右侧数值:QConstr 的 QCRHS 成员

3. 获得的关系运算符不会带有等号,需要处理一下

        提取不带有二次约束的优化模型的约束条件

m = gp.Model()
x = m.addVars(5, 5, name="x")
capacity = [1, 2, 3, 4, 5]
const = m.addConstrs(x.sum(i, '*') <= capacity[i] for i in range(5))
m.update()
# 打印所有约束条件
for constr in m.getConstrs():
    sense_mapping = {GRB.LESS_EQUAL : '<=', GRB.GREATER_EQUAL: '>=', GRB.EQUAL: '='}
    sense_symbol = sense_mapping[constr.sense]
    left_hand_side = m.getRow(constr)
    right_hand_side = constr.RHS
    # 打印完整约束表达式
    print(f'Constraint: {constr.constrName} : {left_hand_side} {sense_symbol} {right_hand_side}')

http://www.kler.cn/a/526777.html

相关文章:

  • 事务03之MVCC机制
  • 01.04、回文排序
  • 爬虫基础(三)Session和Cookie讲解
  • 【Pandas】pandas Series cumsum
  • 蓝桥杯之c++入门(一)【C++入门】
  • 使用Edu邮箱申请一年免费的.me域名
  • 本地部署 DeepSeek-R1 大模型实操
  • PHP中配置 variables_order详解
  • 爬虫基础(四)线程 和 进程 及相关知识点
  • 蓝桥杯例题五
  • 跨平台物联网漏洞挖掘算法评估框架设计与实现文献综述之GMN
  • doris:导入高可用性
  • 电脑要使用cuda需要进行什么配置
  • LitGPT - 20多个高性能LLM,具有预训练、微调和大规模部署的recipes
  • 电子电气架构 --- 在智能座舱基础上定义人机交互
  • 题单:冒泡排序1
  • Java根据端口范围关闭Appium服务
  • Java设计模式:行为型模式→责任链模式
  • 什么是Maxscript?为什么要学习Maxscript?
  • 数据结构之单链表(超详解)
  • 穷举vs暴搜vs深搜vs回溯vs剪枝系列一>解数独
  • 《一文读懂!Q-learning状态-动作值函数的直观理解》
  • win32汇编环境,窗口程序中使用滚动条控件的一般操作
  • AI 模型优化与性能调优
  • 芯片AI深度实战:进阶篇之vim内verilog实时基于AST的自定义检视
  • springboot集成钉钉,发送钉钉日报