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版本

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

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

相关文章

MySQL--优化(索引--索引失效场景)

MySQL–优化&#xff08;索引–索引失效场景&#xff09; 定位慢查询SQL执行计划索引 存储引擎索引底层数据结构聚簇和非聚簇索引索引创建原则索引失效场景 SQL优化经验 常见的索引失效场景 1、场景准备&#xff1a; 给 tb_user 表创建联合索引&#xff0c;字段为&#xff1…

SSR和CSR

SSR&#xff1a;服务端渲染&#xff08;Server-Side Rendering&#xff09; 浏览器每次请求时&#xff0c;服务端都会生成页面完整的HTML响应&#xff0c;最后在浏览器将静态的HTML“激活”。 CSR&#xff1a;客户端渲染&#xff08;Client-Side Rendering&#xff09; 首次…

消息队列-Kafka-消费方如何分区与分区重平衡

消费分区 资料来源于网络 消费者订阅的入口&#xff1a;KafkaConsumer#subscribe 消费者消费的入口&#xff1a;KafkaConsumer#poll 处理流程&#xff1a; 对元数据重平衡处理&#xff1a;KafkaConsumer#updateAssignmentMetadataIfNeeded 协调器的拉取处理&#xff1a;onsum…

linux下改变主机名,永久生效的方法

hostnamectl set-hostname test 例子 #支持大写必须就要这样写 hostnamectl set-hostname 名称 --static

缩放算法优化步骤详解

添加链接描述 背景 假设数据存放在在unsigned char* m_pData 里面&#xff0c;宽和高分别是&#xff1a;m_nDataWidth m_nDataHeight 给定缩放比例&#xff1a;fXZoom fYZoom&#xff0c;返回缩放后的unsigned char* dataZoom 这里采用最简单的缩放算法即&#xff1a; 根据比…

每天一个数据分析题(一百九十五)

关于用户标签的分类&#xff0c;下列哪些说法是正确的&#xff1f; A. 属性标签主要包括用户的个人信息&#xff0c;如性别和出生日期&#xff0c;这些数据虽无因果关系&#xff0c;但可以用于预测用户行为。 B. 状态标签反映的是用户的社会经济状态和社会资本&#xff0c;如…

PostgreSQL教程(二十四):服务器管理(六)之数据库角色

PostgreSQL使用角色的概念管理数据库访问权限。一个角色可以被看成是一个数据库用户或者是一个数据库用户组&#xff0c;这取决于角色被怎样设置。角色可以拥有数据库对象&#xff08;例如&#xff0c;表和函数&#xff09;并且能够把那些对象上的权限赋予给其他角色来控制谁能…

代理IP以及动态拨号VPS的关系是什么?

在数字时代&#xff0c;网络安全和隐私保护已成为全球关注的热点话题。代理IP和动态拨号VPS作为提升网络匿名性和安全的重要技术&#xff0c;它们在维护网络隐私中扮演着至关重要的角色。虽然这两种技术在表面上看似相似&#xff0c;实际上它们在功能、应用场景以及用户需求满足…

react + antdesign table组件合并行,展开子表格

假如你有这样的一个数据&#xff1a; [{"bigClass":"吃的","smallClass":"水果","item":"苹果"},{"bigClass":"吃的","smallClass":"水果","item":"香蕉…

mutex 和 channel 哪一个工作效率更高?

关于Rust中mutex和channel哪一个工作效率更高的问题&#xff0c;实际上并没有一个绝对的答案&#xff0c;因为效率的高低取决于具体的使用场景和需求。 互斥锁&#xff08;mutex&#xff09;主要用于保护共享资源&#xff0c;确保一次只有一个线程可以访问它。当需要多个线程同…

这些养老难题,只能靠AI来解决了

3 月 5 日刚召开的两会&#xff0c;AI 这个话题妥妥站上了 C 位。不仅政府工作报告首次提出要开展“人工智能”行动&#xff0c;各路科技大佬和人大代表也是围绕着 AI 大模型的技术创新、应用落地和政策法规&#xff0c;展开了热烈积极的建言献策。甚至有互联网大佬建议将人工智…

创建RAID0,RAID5并管理,热备盘,模拟故障

目录 1. RAID介绍以及mdadm安装 1.1 安装mdadm工具 2. 创建raid0 2.1 环境准备 2.2 使用两个磁盘创建RAID0 2.3 查看RAID0信息 2.4 对创建的RAID0进行格式化并挂载 2.5 设置成开机挂载 2.6 删除RAID0 3. 创建raid5 3.1 环境准备 3.2 用3个磁盘来模拟R…

2024-01 STEMA 考试C++ 中级真题解析

2024-01 STEMA 考试C++ 中级真题一、选择题 第一题、表达式117 % 16 的结果是( B )。 A、0 B、5 C、7 D、10第二题、下列选项中,字符数组定义正确的是(B )。 A、char a[5] = "hello"; B、char a[ ] = "hello"; …

Go微服务: 基于net/rpc/jsonrpc模块实现微服务跨语言调用

概述 Golang 提供 net/rpc/jsonrpc 库来实现rpc方法采用 json 方式进行数据编解码&#xff0c;支持跨语言调用 这里实现跨语言示例 1 &#xff09;go 服务端 package main import ( "log" "net" "net/rpc" "net/rpc/jsonrpc" )…

ERC20学习

ERC20简介 ERC20是一种代币标准&#xff0c;用于创建可替代的代币。 ERC20是在以太坊网络上实现的代币标准&#xff0c;它为数字资产或代币定义了一套规则和接口。这些符合ERC20标准的代币在性质上是完全相同的。即每一个代币都可以被另一个同类型的代币替代&#xff0c;这种属…

系统架构30 - 质量属性

质量属性 概念开发期质量属性运行期质量属性 面向架构评估的质量属性质量属性场景描述 软件系统属性包括功能属性和质量属性&#xff0c;软件架构重点关注的是质量属性。架构的基本需求是在满足功能属性的前提下&#xff0c;关注软件系统质量属性。为了精确、定量地表达系统的质…

代码随想录算法训练营day54| 392. 判断子序列、115. 不同的子序列

392、判断子序列&#xff1a; class Solution(object):def isSubsequence(self, s, t):""":type s: str:type t: str:rtype: bool"""dp [[0] * (len(t)1) for _ in range(len(s)1)]for i in range(1, len(s)1):for j in range(1, len(t)1):if …

社区店选址评估的关键指标:确保商业成功的重要因素

对于想开实体店或创业的人来说&#xff0c;选址是决定商业成功的关键因素之一。作为一名开鲜奶吧5年的创业者&#xff0c;我在网上持续分享开店的干货和见解。 在这篇文章中&#xff0c;我将详细介绍社区店选址评估的关键指标&#xff0c;帮助你确保商业成功。 1、人流量&…

js之版本号排序

版本号排序 给定一个由版本号组成的数组&#xff0c;按照版本号由小到大排序 假如版本号如下 &#xff1a; ["0.1.1", "2.3.3", "0.302.1", "4.2", "4.3.5", "4.3.4.5"];原理很简单&#xff0c;通过自定义sort排…

2.DOM-事件基础(注册事件、tab栏切换)(案例:注册、轮播图)

案例 注册事件 <!-- //disabled默认情况用户不能点击 --><input type"button" value"我已阅读用户协议(5)" disabled><script>// 分析&#xff1a;// 1.修改标签中的文字内容// 2.定时器// 3.修改标签的disabled属性// 4.清除定时器// …