优化|PyOptInterface:高效且灵活的Python优化建模语言

news2024/9/17 7:19:22

优化建模语言作为优化求解器与终端用户之间的桥梁,是构建、求解和分析优化模型的重要工具。建模语言的效率直接影响优化模型的构建和求解时间。PyOptInterface是一种基于Python编程语言的优化建模语言,相比现有建模语言兼具高效率和灵活性,在优化建模性能方面实现了10-20倍的显著提升。

一、PyOptInterface简介

PyOptInterface是一个基于Python 的开源通用优化建模语言,由合肥工业大学电气与自动化工程学院杨越副教授、清华大学电机系吴文传教授团队合作开发,代码目前已经在Github开源:https://github.com/metab0t/PyOptInterface,并附有详尽的在线文档网站:https://metab0t.github.io/PyOptInterface/,相关论文已经发布在arXiv预印本平台:https://arxiv.org/abs/2405.10130。

PyOptInterface目前支持求解以下八类优化问题:

  1. 线性规划 (LP)

  2. 混合整数线性规划(MILP)

  3. 二次规划 (QP)

  4. 混合整数二次规划 (MIQP)

  5. 二次约束二次规划 (QCQP)

  6. 混合整数二次约束二次规划 (MIQCQP)

  7. 二阶锥规划 (SOCP)

  8. 混合整数二阶锥规划 (MISOCP)

在优化求解器的支持方面,PyOptInterface目前支持调用以下四种性能领先的商业和开源优化求解器:

1. COPT

2. Gurobi

3. HiGHS

4. Mosek

二、实际优化建模中的痛点问题

在优化建模方面,已有AMPL、GAMS、Pyomo、JuMP.jl等兼容多个求解器的通用建模语言,也有COPT、Gurobi等求解器自带的Python编程接口,然而在实际使用中存在以下痛点:

  1. AMPL、GAMS等基于领域特定语言(Domain Specific Language,DSL)的优化建模语言学习门槛高,难以和Python等数据分析处理的工作流融合,难以实现高效的模型增量修改和求解。

  2. Pyomo等兼容多求解器的建模语言,对大规模优化模型的建模速度不尽如人意,与直接使用求解器的底层接口之间的性能差距显著。

  3. COPT、Gurobi等求解器自带的Python编程接口性能较好,然而不同求解器的接口存在差异,导致代码与求解器深度耦合,难以切换求解器。

三、PyOptInterface与其他优化建模语言相比的优势:

PyOptInterface使用了创新性的设计架构,通过建立变量、约束等对象与优化求解器底层接口间的高效映射,最大程度压缩了通用建模语言和使用优化求解器底层接口之间的性能差距,与现有的建模语言相比具有以下几大优势:

  1. 通过C++实现的内核直接调用优化求解器的底层C接口,构建优化模型的速度非常快,在性能测试中建模速度最接近求解器的C++接口,比Pyomo快10-20倍,比一些优化求解器的官方Python接口快2-5倍,并超越了目前速度最快的开源建模语言JuMP.jl。

  2. 支持多求解器的模型增量修改和重新求解(包括添加/删除/修改变量或者约束条件、更改目标函数等),无需重新构建模型,适合实现Benders分解、列生成、序列线性化等需要逐次求解模型的算法。

  3. 提供了涵盖常用功能的统一编程接口,只需编写一份代码即可适用于所有优化求解器。

  4. 在统一接口的基础上,仍然提供了设置优化求解器特定参数等底层接口和高级功能,比如支持混合整数规划(MIP)中的回调函数(callback function),提供与优化求解器官方Python接口相近的完备功能。

 四、建模性能测试

我们选择了八个不同规模的优化模型作为测试案例,分别使用 Gurobi 和 COPT 作为优化器进行了两轮基准测试。针对每个模型,记录了不同建模语言生成模型并提交给优化求解器的总时间,并将优化求解的时间限制设为0.0秒,以避免求解过程的影响。从测试结果可以看出:PyOptInterface与现有的优化建模语言相比具有明显的性能优势。

表1 生成模型并将其提交给 Gurobi 优化求解器的时间(秒)

Model

Variables

C++

PyOptInterface

JuMP

gurobipy

Pyomo

fac-25

67651

0.2

0.2

0.2

1.2

4.1

fac-50

520301

0.8

1.2

1.8

9.7

32.7

fac-75

1732951

2.7

4.1

6.6

32.5

119.3

fac-100

4080601

6.3

10.0

17.8

79.1

286.3

lqcp-500

251501

0.9

1.5

1.3

6.3

23.8

lqcp-1000

1003001

3.7

6.0

6.1

26.7

106.6

lqcp-1500

2254501

8.3

14.0

17.7

61.8

234.0

lqcp-2000

4006001

14.5

24.9

38.3

106.9

444.1

表2 生成模型并将其提交给COPT 优化求解器的时间(秒)

Model

Variables

C++

PyOptInterface

JuMP

coptpy

Pyomo

fac-25

67651

0.3

0.2

0.3

0.6

4.1

fac-50

520301

2.2

1.5

2.7

5.4

32.8

fac-75

1732951

8.1

6.6

10.2

20.3

117.4

fac-100

4080601

22.4

23.4

30.3

58.0

284.0

lqcp-500

251501

3.8

3.1

3.0

6.6

26.4

lqcp-1000

1003001

16.0

15.5

13.9

28.1

112.1

lqcp-1500

2254501

37.6

32.4

33.7

64.6

249.3

lqcp-2000

4006001

68.2

60.3

66.2

118.4

502.4

五、安装使用

PyOptInterface 已经在PyPI上正式发布,支持Windows、Linux和MacOS平台,支持Python 3.8-3.12的各个版本,可以通过直接 pip 安装:

pip install pyoptinterface

安装完成后,可以在 Python 代码中导入该软件包:

import pyoptinterface as poi

PyOptInterface无任何第三方依赖,但是如果需要将它与特定的优化求解器配合使用,需要手动安装相应的优化求解器软件。详情请参考文档地址(https://metab0t.github.io/PyOptInterface/getting_started.html)中的安装配置教程。

PyOptInterface也提供开源求解器HiGHS的打包安装方法:

pip install pyoptinterface[highs]

此命令将同时安装HiGHS优化器的二进制版本,可以与PyOptInterface配合使用。

六、结语

PyOptInterface目前已在电力能源优化等领域试用,欢迎读者在科研等领域积极试用PyOptInterface,并通过以下方式提出宝贵的意见和建议,并引用我们的预印本论文。本开源软件的使用、修改和传播需遵守Mozilla Public License Version 2.0。

Github Issue地址:

https://github.com/metab0t/PyOptInterface/issues

论文链接:https://arxiv.org/abs/2405.10130

联系邮箱:yue.yang@hfut.edu.cn ; linchenhui@tsinghua.edu.cn

附录、入门教程

以一个简单的线性规划问题为例:

import pyoptinterface as poi
from pyoptinterface import copt

model = copt.Model()

x = model.add_variable(lb=0, name="x")
y = model.add_variable(lb=0, ub=10, name="y")
con = model.add_linear_constraint(5*x+4*y, poi.Geq, 19)
model.set_objective(2*x+3*y)
model.optimize()
x_value = model.get_value(x)
y_value = model.get_value(y)

首先声明模型,其次调用model.add_variable函数添加变量,可以设置变量的上下界和名称,随后调用model.add_linear_constraint添加线性约束条件,调用model.set_objective设置目标函数,由于使用了运算符重载,线性表达式可以由变量的四则运算直接构建,最后调用model.optimize求解优化模型,并调用model.get_value查询变量的最优解取值。

如果加入整数变量的约束,则问题转化为混合整数线性规划问题,需要在调用model.add_variable的时候声明x和y是整数变量:

import pyoptinterface as poi
from pyoptinterface import copt
 
model = copt.Model()
 
x = model.add_variable(lb=0, domain=poi.VariableDomain.Integer, name="x")
y = model.add_variable(lb=0, ub=10, domain=poi.VariableDomain.Integer, name="y")
con = model.add_linear_constraint(5*x+4*y, poi.Geq, 19)
model.set_objective(2*x+3*y)
model.optimize()
 
x_value = model.get_value(x)
y_value = model.get_value(y)

如果将目标函数变为二次函数,则问题转化为混合整数二次规划问题,修改目标函数即可:

import pyoptinterface as poi
from pyoptinterface import copt
 
model = copt.Model()
 
x = model.add_variable(lb=0, domain=poi.VariableDomain.Integer, name="x")
y = model.add_variable(lb=0, ub=10, domain=poi.VariableDomain.Integer, name="y")
con = model.add_linear_constraint(5*x+4*y, poi.Geq, 19)
model.set_objective(2*x*x+3*y*y)
model.optimize()
 
x_value = model.get_value(x)
y_value = model.get_value(y)

最后展示一个利用PyOptInterface求解8皇后问题的示例,构建8*8的0-1变量数组,建模为混合整数线性规划问题,利用HiGHS求解器找到一个可行解,并打印最终的棋盘布置。示例中我们用Numpy的多维数组储存PyOptInterface的变量对象,表明了PyOptInterface可以与其他Python生态系统中第三方包无缝配合。

import numpy as np
import pyoptinterface as poi
from pyoptinterface import highs
 
model = highs.Model()
 
N = 8
 
x = np.empty((N, N), dtype=object)
for i in range(N):
    for j in range(N):
        x[i, j] = model.add_variable(domain=poi.VariableDomain.Binary)
 
for i in range(N):
    # 行列约束
    model.add_linear_constraint(poi.quicksum(x[i, :]), poi.Eq, 1.0)
    model.add_linear_constraint(poi.quicksum(x[:, i]), poi.Eq, 1.0)
for i in range(-N+1, N):
    # 对角线约束
    model.add_linear_constraint(poi.quicksum(x.diagonal(i)), poi.Leq, 1.0)
model.add_linear_constraint(poi.quicksum(np.fliplr(x).diagonal(i)), poi.Leq, 1.0)
 
model.optimize()
 
get_v = np.vectorize(lambda x: model.get_value(x))
x_value = get_v(x)
 
print(x_value.astype(int))

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

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

相关文章

Kotlin设计模式:深入理解桥接模式

Kotlin设计模式:深入理解桥接模式 在软件开发中,随着系统需求的不断增长和变化,类的职责可能会变得越来越复杂,导致代码难以维护和扩展。桥接模式(Bridge Pattern)是一种结构型设计模式,它通过…

【MySQL】如果表被锁可以尝试看一下事务

今天在MySQL中删除表的时候,发现无法删除,一执行drop,navicat就卡死。 通过 SHOW PROCESSLIST显示被锁了 kill掉被锁的进程后依旧被锁 最后发现是由于存在为执行完的事务 SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX; kill掉这些事务以…

九泰智库 | 医械周刊- Vol.36

⚖️ 法规动态 广东药监局 | 8家医疗器械公司体系不合规被停产 6月17日,广东省药品监督管理局组织开展医疗器械生产企业监督检查,发现8家企业质量管理体系存在严重缺陷,不符合《医疗器械生产质量管理规范》相关规定,广东省药品监督…

美食解压视频素材无水印无字幕的在哪找?海外美食解压网站分享

在如今快节奏的生活中,观看美食视频已成为许多人缓解压力的一种方式。这些视频不仅唤醒人们的味觉记忆,还能在繁忙中带来片刻的放松。然而,对于视频创作者来说,寻找高品质的美食视频素材,特别是那些无水印、无字幕、可…

HALCON-从入门到入门-提取小票上的斑点

测试效果 在一张超市小票上提取点阵数字 处理步骤解析 首先读取两张图,一张是小票的图片,一张是静脉的图片 为了让点阵数字提取更加困难,我们将两张图片合成到一起 read_image (ImageNoise, angio-part) crop_part (ImageNoise, ImagePart…

面试-java多线程与并发

1.如何实现处理线程的返回值 (1)主线程等待法 主线程等待法:程序执行时,没有等到value值赋予完成,就直接在主函数 中执行打印value的值。 缺点:需要自己去实现循环等待的逻辑。若需要等待的变量变多,需要等待的时间可能…

Python22 Pandas库

Pandas 是一个Python数据分析库,它提供了高性能、易于使用的数据结构和数据分析工具。这个库适用于处理和分析输入数据,常见于统计分析、金融分析、社会科学研究等领域。 1.Pandas的核心功能 Pandas 库的核心功能包括: 1.数据结构&#xff…

python flask使用flask_migrate管理数据库迁移

🌈所属专栏:【Flask】✨作者主页: Mr.Zwq✔️个人简介:一个正在努力学技术的Python领域创作者,擅长爬虫,逆向,全栈方向,专注基础和实战分享,欢迎咨询! 您的点…

openfeign的原理 ????

1、我们使用openfeign调用远程接口就像调用本地方法一样简单。 2、支持spring mvc 注解 3、整合了更多的扩展 (请求重试策略、超时控制、请求拦截器) 4、open Feign是基于aop的原理,他会通过所加FeignClient的接口,自动拼接接口…

使用gradle上传maven工件到新版maven central仓库central.sonatype.com

本文主要用到的插件是sonatype-uploader, 该插件主要功能是上传依赖文件夹到中央仓库。 该文件夹的生成也十分简单,不用担心。 前言 最近在研究maven插件的时候发现发布的网站发生了变化,使用之前的一些插件没能满足我发布依赖的需求,也可…

公司加密软件的主要功能(五款优秀公司加密软件)

在当今数字化和信息化的时代,企业面对的最大挑战之一就是如何保护其敏感数据不被泄露或篡改。无论是内部员工的操作失误还是外部黑客的恶意攻击,都可能导致严重的数据泄露事件。公司加密软件作为一种强有力的安全工具,能够有效地保护企业的敏…

解析分子筛自动填充高原制氧机的工作原理及优势

在高原地区,由于空气稀薄,氧气含量相对较低,这给人们的生活、工作和学习带来了诸多不便。为了解决这个问题,高原制氧机应运而生,其中分子筛自动填充高原制氧机以其高效、稳定、安全的特点受到了广泛的关注和应用。 一、…

PointCloudLib RANSAC算法实现点云粗配准 C++版本

0.实现效果 原始点云 粗配准后的点云 1.算法原理 RANSAC(Random Sample Consensus)算法,更常见的是RANSAC的变种RANSAC-ICP(Iterative Closest Point)或RANSAC结合其他点云配准技术,用于实现两个点云或3D模型之间的粗配准。在这里,我将简要描述一个使用RANSAC算法进行…

【SQL Server数据库】关系模式与关系代数

目录 一、请用关系代数完成下列查询 1. 求 供应工程J1 零件P1的供应商号码SNO; 2. 求 供应工程J1 零件(P)为红色 的供应商号码SNO; 3. 求 没有使用 天津供应商(P)生产的红色零件(S&#xff0…

Win11 docker build拉取镜像失败(无法访问镜像仓库)

目录 遇到的问题: 修改docker配置 写了一个dockerfile(基于python的镜像)文件,在生成时,一直报错,换了好几个仓库,都是不行(包括阿里、南大、官网、网易、Azure中国镜像等都不行) 遇到的问题: 连接超时…

梅雨季,祛湿不健脾,湿气易反复!4个方法助您健脾胃,祛湿气!

进入梅雨季以来,苏州连续降雨,空气湿度增加,我们身体内的湿气也愈加严重:身上胖嘟嘟、脸上油乎乎、身体困重、乏力,极易疲劳,食欲减退,头昏昏沉沉的,大便也十分黏腻…… 关于祛湿&am…

【软件下载】Camtasia Studio 2024详细安装教程视频

习惯上来说Camtasia Studio是一款简单易用的高清录屏和视频编辑软件,拥有录制屏幕和配音、视频的剪辑和过场动画片、添加说明字幕和水印、制作视频封面和菜单、视频压缩和播放。不得不说Camtasia是一款屏幕录制和视频剪辑软件,教授课程,培训他…

RFID时尚产业链的创新引擎

在数智化浪潮的推动下,随着 RFID 技术的深入应用,时尚品牌不再仅仅局限于传统条码管理模式,而是选择与RFID紧密融合,从生产到销售,从管理到体验,都展现出了前所未有高效。 RFID技术凭借在库存管理、防伪等方…

51单片机STC89C52RC——4.1 矩阵按键(数码管显示按键值)

目录 目录 目的 一,STC单片机模块 二,矩阵按键模块 2.1 针脚定义 ​编辑 2.2 矩阵按键位置 2.3 如何理解按键按下后针脚的高低电平 2.3.1 错误理解1 2.3.2 错误理解2 2.3.3 正确判定按下的是那个按键的逻辑 2.3.4 判定按键按下的依次扫描程…

版本控制工具-git的基本使用

目录 前言一、git简介二、git工作流程三、安装git并配置git3.1 配置用户名和邮箱3.2 配置.gitignore文件(可选)3.3 配置ssh key(可选) 四、git基本命令4.1 创建本地仓库4.2 将工作区内容提交到本地仓库4.3 将本地仓库内容推送到远…