MindOpt优化器: 浅谈版本0.x和1.x之间API的差异

2024-03-08 19:28

本文主要是介绍MindOpt优化器: 浅谈版本0.x和1.x之间API的差异,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Mindopt 是一个优化求解器,如果它有两个主要版本——0.xx和1.x.x(最新版本1.1.1),它们代表着软件开发的两个不同阶段。版本1.0.0表示软件的一个大的里程碑,代表着软件第一个正式的“成熟”发布版本,而0.25是一个较早期的开发版本。在这篇博客中,我们将把这个最新版本与它的前身0.25版进行比较。

简介

Mindopt是一款高性能优化求解器,专为解决从简单线性规划 (LP) 到更复杂的混合整数规划 (MIP) 、非线性规划(QP、SDP)的一系列问题而设计。其强大的算法旨在有效地找到最佳解决方案,使其成为运筹学,电力能源、工业制造、交通物流和其他领域的研究人员和专业人员的首选工具。

版本0.25与1.1.1之间API的差异

功能差异:

1.1.1版本的API引入一些新的功能和参数选项,这些功能可能在0.25版本中不可用。例如,1.1.1版本增加一些高级优化算法、并行计算支持、更强大的约束处理能力等功能,这些功能可能并不在0.25版本的API中存在。例如:新增 MILP 的热启动(warm start) 和SOS约束和Indicator约束,新增回调函数功能 (Callback),输入文件增加支持.qps格式,提供了线性规划问题的 primal-dual feasible solution.改进并发优化方法 (concurrent optimization method) 的算法流程等等。

  • 新增:callback回调功能
    • 可用于获取中间结果,进行求解过程跟踪;
    • 也可设置启发式决策来优化求解速度,比如:添加割平面,裁剪不会出现最优解的分支;干预 MindOpt 的分支选择策略,控制节点二分方法及遍历顺序;添加自定义可行解(比如通过某种启发式算法得到),一个较好的可行解可以加速 MindOpt 的求解效率。

接口设计:

1.1.1版本的API对接口进行重新设计,以提高灵活性和可定制性。这导致一些方法的名称、参数数量或参数类型发生变化。例如支持定义变量的类型、定义约束时支持使用等式符号等等。例如:

  • 添加变量和约束
    在这里插入图片描述

示例:

  • 1.1.1版本
38        # Add variables.
39        x = []
40        x.append(model.addVar(0.0,         10.0, 1.0, 'I', "x0"))
41        x.append(model.addVar(0.0, float('inf'), 2.0, 'I', "x1"))
42        x.append(model.addVar(0.0, float('inf'), 1.0, 'I', "x2"))
43        x.append(model.addVar(0.0, float('inf'), 1.0, 'C', "x3"))
  • 0.25版本
41        # Add variables.
42        x = []
43        x.append(model.add_var(0.0,         10.0, 1.0, None, "x0", True))
44        x.append(model.add_var(0.0, MDO_INFINITY, 1.0, None, "x1", True))
45        x.append(model.add_var(0.0, MDO_INFINITY, 1.0, None, "x2", True))
46        x.append(model.add_var(0.0, MDO_INFINITY, 1.0, None, "x3", False))
  • 设置目标
    在这里插入图片描述

性能差异:

由于0.25版本停止更新,而1.1.1作为正式版本会持续对算法进行优化和改进,因此其在性能方面会持续提升。这会导致一些API方法的响应时间、收敛速度等方面的差异越来越大。


一个完整的示例:

代码如下:

from mindoptpy import *
import time
import numpy as npif __name__ == "__main__":# 声明参数和集合plant = ["小麦","玉米","蔬菜","瓜果"]plant_ub = [76,88,40,96]field = ["地块1","地块2","地块3","地块4","地块5","地块6"]field_ub = [42, 56, 44, 39, 60, 59]profit_plant_field =np.array([[500 ,550 ,630 ,1000 ,800 ,700],[800 ,700 ,600 ,950 ,90 ,930],[1200 ,1040 ,980 ,860 ,880 ,780],[1000 ,960 ,840 ,650 ,600 ,700]])alt_plant = [1,1,1,1] # for矩阵相乘得到加和alt_field = [1,1,1,1,1,1] # for矩阵相乘得到加和# Step 1. Create a model and change the parameters.model = Model(name = 'LP_1_plant2')try:# Step 2. Input model.# Change to maximize problem.model.modelsense =  MDO.MAXIMIZE# Add variables.#vars = {}vars = model.addMVar((len(plant),len(field)), obj=profit_plant_field, vtype='C', name="x")# Add constraints.#cons = {}constrs1 = model.addConstr( alt_plant @ vars <= 0)constrs1.rhs =  field_ubconstrs1.lhs =  0constrs2 = model.addConstr( vars @ alt_field   <= 0)constrs2.rhs = plant_ubconstrs2.lhs =  0# Step 3. Solve the problem and populate the result.model.optimize()time.sleep(1) #for printmodel.write("model/plant2.lp") #可以输出文件,观察建模是否正确model.write("model/plant2.sol")if model.Status == MDO.OPTIMAL:print("----\n")print(f"目标函数是: {model.objval}")print("决策变量:")x = vars.Xprint(x)for p in range(len(plant)):for f in range(len(field)):if x[p,f] != 0:print("{0}在{1}的种植面积≈{2:.0f}".format(plant[p],field[f],x[p,f]))else:print("无可行解!求解结束状态是:(code {0}).".format(model.Status))except MindoptError as e:print("Received Mindopt exception.")print(" - Code          : {}".format(e.code))print(" - Reason        : {}".format(e.message))except Exception as e:print("Received other exception.")print(" - Reason        : {}".format(e))finally:# Step 4. Free the model.model.dispose()

此案例可在云上平台查看运行结果,也可对案例复制调试。

相同案例不同代码的对比:1.xx版本vs0.xx版本

这篇关于MindOpt优化器: 浅谈版本0.x和1.x之间API的差异的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/788127

相关文章

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Tomcat版本与Java版本的关系及说明

《Tomcat版本与Java版本的关系及说明》:本文主要介绍Tomcat版本与Java版本的关系及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat版本与Java版本的关系Tomcat历史版本对应的Java版本Tomcat支持哪些版本的pythonJ

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

浅谈mysql的sql_mode可能会限制你的查询

《浅谈mysql的sql_mode可能会限制你的查询》本文主要介绍了浅谈mysql的sql_mode可能会限制你的查询,这个问题主要说明的是,我们写的sql查询语句违背了聚合函数groupby的规则... 目录场景:问题描述原因分析:解决方案:第一种:修改后,只有当前生效,若是mysql服务重启,就会失效;

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方