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

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

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.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 的求解效率。

2. 接口设计:

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

  • 添加变量和约束

V0.x API Python

V1.x API Python

MdoModel.add_vars(indices,lb,ub,obj,name,is_integer)

MdoModel.add_cons(lhs,rhs,expr,name)

  1. 一个变量,或者数组变量添加,不易用
  2. 变量类型只有是否是整数选型



Model.addMVar(shape, lb=0.0, ub=float('inf'), obj=0.0, vtype='C', name='')

Model.addMConstr(A, x, sense, b, name='')

  1. 支持numpy.ndarray
  2. 变量类型支持:连续型变量MDO.CONTINUOUS(‘C’)、二元变量MDO.BINARY(‘B’)、整数型变量MDO.INTEGER(‘I’)、半连续型变量MDO.SEMICONT(‘S’)、半整数型变量MDO.SEMIINT(‘N’)

示例:

  • 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))
  • 设置目标

V0.x API Python

V1.x API Python

MdoModel.add_vars(indices,lb,ub,obj,name,is_integer)

  • 在添加变量的时候设置系数,查程序麻烦

Model.setObjective(expr, MDO.MINIMIZE)

  • 直接设置目标函数,更清晰

3. 性能差异:

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


4. 一个完整的示例:

代码如下:

from mindoptpy import *
import time
import numpy as np
if __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_ub
        constrs1.lhs =  0
        
        constrs2 = model.addConstr( vars @ alt_field   <= 0)
        constrs2.rhs = plant_ub
        constrs2.lhs =  0
         
        # Step 3. Solve the problem and populate the result.
        model.optimize()
        time.sleep(1) #for print
        
        model.write("model/plant2.lp") #可以输出文件,观察建模是否正确
        model.write("model/plant2.sol")
        if model.Status == MDO.OPTIMAL:
            print("----\n")
            print(f"目标函数是: {model.objval}")
            
            print("决策变量:")
            x = vars.X
            print(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.errno))
        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版本

相关文章
|
4月前
|
文字识别 算法 API
视觉智能开放平台产品使用合集之海外是否可以访问人物动漫化的api版本
视觉智能开放平台是指提供一系列基于视觉识别技术的API和服务的平台,这些服务通常包括图像识别、人脸识别、物体检测、文字识别、场景理解等。企业或开发者可以通过调用这些API,快速将视觉智能功能集成到自己的应用或服务中,而无需从零开始研发相关算法和技术。以下是一些常见的视觉智能开放平台产品及其应用场景的概览。
55 0
|
4月前
|
Oracle Java 关系型数据库
JDK版本特性问题之在 JDK 11 中,HTTP Client API 的特点有哪些
JDK版本特性问题之在 JDK 11 中,HTTP Client API 的特点有哪些
|
4月前
|
缓存 JavaScript 前端开发
微信 JS-SDK Demo “分享信息设置” API 及数字签名生成方法(NodeJS版本)
微信 JS-SDK Demo “分享信息设置” API 及数字签名生成方法(NodeJS版本)更新时间(2020-10-29)
|
5月前
|
人工智能 自然语言处理 数据挖掘
详解:Google AI Gemini中文版本(基于API 开发实现对话)
谷歌旗下的人工智能应用Gemini,自问世以来凭借其强大的计算能力和高效的处理性能,迅速成为全球用户的宠儿。作为一款由世界顶尖科技公司开发的产品,Gemini不仅在语言处理、图像识别、数据分析等领域表现出色,还在多种复杂任务中展现了其卓越的智能决策能力。然而,由于网络限制等问题,国内用户往往无法直接访问和使用Gemini的网站,这也导致了许多技术爱好者和专业人士未能亲身体验这一先进技术所带来的便利和强大功能。
|
5月前
|
Java API PHP
【亲测有效,官方提供】php版本企查查api接口请求示例代码,php请求企查查api接口,thinkphp请求企查查api接口
【亲测有效,官方提供】php版本企查查api接口请求示例代码,php请求企查查api接口,thinkphp请求企查查api接口
157 1
|
6月前
|
达摩院 Python
阿里达摩院MindOpt优化求解器-月刊(2024年6月)
**阿里达摩院MindOpt优化求解器2024年6月月刊概览:** - 发布新功能,MAPL建模语言V2.5上线,Python APIs全面升级,旧版本不兼容。 提供快速入门教程、示例代码展示如何用Python调用MAPL。MindOpt Studio租户版新增Gradio支持,便于开发WebAPP,提供了案例源码展示如何开发。引入新案例: 1. 巡检线路的排班-2017全国大学生数学建模竞赛D题。包含最短路模型、TSP模型、弧分割模型。2. 商品组合定价策略:探讨如何最赚钱的加购区商品定价。
135 0
|
6月前
|
存储 API 容器
技术经验分享:fmt的API介绍(版本:7.0.1)
技术经验分享:fmt的API介绍(版本:7.0.1)
40 0
|
6月前
|
Java API Maven
第三方支付API支付宝支付申请流程 支付宝新老版本
第三方支付API支付宝支付申请流程 支付宝新老版本
145 0
|
24天前
|
JSON API 数据格式
淘宝 / 天猫官方商品 / 订单订单 API 接口丨商品上传接口对接步骤
要对接淘宝/天猫官方商品或订单API,需先注册淘宝开放平台账号,创建应用获取App Key和App Secret。之后,详细阅读API文档,了解接口功能及权限要求,编写认证、构建请求、发送请求和处理响应的代码。最后,在沙箱环境中测试与调试,确保API调用的正确性和稳定性。
|
1月前
|
供应链 数据挖掘 API
电商API接口介绍——sku接口概述
商品SKU(Stock Keeping Unit)接口是电商API接口中的一种,专门用于获取商品的SKU信息。SKU是库存量单位,用于区分同一商品的不同规格、颜色、尺寸等属性。通过商品SKU接口,开发者可以获取商品的SKU列表、SKU属性、库存数量等详细信息。