MindOpt的可选输入参数有哪些?有什么作用?请阅读本篇!

简介: 在编译器中可选参数是指在调用的时候可以选择传入参数或者不传入参数,但在我们MindOpt优化求解器中的意思是指可以选择输入参数控制求解器的行为,如优化方法、求解流程,以及终止条件,或是对远程计算服务进行配置等。

Mindopt中的可选参数类型有三种,分别为整数型、实数型、字符串型参数。顾名思义,三种可选参数类型是指参数为整数、实数、字符串。整数型一般控制的是求解器初始阶段的参数,比如选择求解方法、使用的线程数等等;实数型一般控制的是求解过程中的参数,比如设置最大求解的时间、设置单纯形法的原始可行性容差等等;而字符串型参数主要用于对 远程计算服务 中的相关参数进行设置,比如设置远程计算服务中的token、远程计算服务中优化问题的描述。下文我们用前文线性规划建模优化的例题修改几个简单的参数进行演示。


下载安装

用户可以点这里下载安装MindOpt优化求解器

开通算法服务控制台(免费的)

MindOpt的更多信息官网


整数型参数

C API对应参数接口参考

参数

说明

MDO_INT_PARAM_METHOD

“Method”

设置选取的优化方法

MDO_INT_PARAM_PRESOLVE

“Presolve”

设置是否开启预处理方法

MDO_INT_PARAM_DUALIZATION

“Dualization”

设置是否对模型对偶化

MDO_INT_PARAM_NUM_THREADS

“NumThreads”

设置所使用的线程数

MDO_INT_PARAM_ENABLE_NETWORK_FLOW

“EnableNetworkFlow”

设置是否启用网络单纯形法

MDO_INT_PARAM_ENABLE_STOCHASTIC_LP

“EnableStochasticLP”

检测随机线性规划问题结构

MDO_INT_PARAM_SPX_COLUMN_GENERATION

“SPX/ColumnGeneration”

设置是否在单纯形法中使用列生成方法

MDO_INT_PARAM_SPX_CRASH_START

“SPX/CrashStart”

设置是否在单纯形法中使用初始基解生成方式

MDO_INT_PARAM_SPX_MAX_ITERATIONS

“SPX/MaxIterations”

设置单纯形法中最大迭代次数

MDO_INT_PARAM_SPX_PRIMAL_PRICING

“SPX/PrimalPricing”

设置单纯形法中的原始定价策略

MDO_INT_PARAM_SPX_DUAL_PRICING

“SPX/DualPricing”

设置单纯形法中的对偶定价策略

MDO_INT_PARAM_IPM_MAX_ITERATIONS

“IPM/MaxIterations”

设置内点法中最大迭代次数

MDO_INT_PARAM_MIP_MAX_NODES

“MIP/MaxNodes”

设置MIP中的最大节点限制

MDO_INT_PARAM_MIP_ROOT_PARALLELISM

“MIP/RootParallelism”

设置MIP求解中根节点允许的最大并发线程数

#更多可选参数类型可以戳这里查看>>可选输入参数

展示用法

"Method"

整数型参数,用于设置优化器中使用的算法,默认让选择求解器选择方法(并发优化)。

选项

说明

-2

使用多线程单纯形法

-1

让求解器决定(并发优化)

0

原始单纯形法

1

对偶单纯形法

2

内点法

示例:

C语言
    Mdo_setIntParam(model, "Method", -1)
C++
    model.setIntParam(model, "Method", -1)
python
    model.set_int_param("Method", -1)

实操

try:
        # Step 2. 输入模型。
        #  改为最小化问题。
        #  通过 mindoptpy.MdoModel.set_int_attr() 将目标函数设置为 最小化 
        model.set_int_attr("MinSense", 1)
        #  优化方法修改为内点法
        model.set_int_param("Method", 2)

修改参数前后运行反馈的优化器摘要

#默认参数
Optimizer summary.
 - Optimizer used     : Simplex method #单纯形法
 - Optimizer status   : OPTIMAL
 - Total time         : 0.002s
#修改后
Optimizer summary.
 - Optimizer used     : Interior point method #内点法
 - Optimizer status   : OPTIMAL
 - Total time         : 0.013s

"IPM/MaxIterations"

整数型参数,用于设置内点法中最大迭代次数,默认值是400,取值范围[0, 2147483647]。

示例:

C语言
Mdo_setIntParam(model, "IPM/MaxIterations", 400);
C++
model.setIntParam("IPM/MaxIterations", 400);
Python
model.set_int_param("IPM/MaxIterations", 400)

实操

# 我们同样选择使用内点法,但限制它的最大迭代次数。
model.set_int_param("Method", 2)
#修改最大迭代次数为1
model.set_int_param("IPM/MaxIterations", 1)

求解的结果

#由于我们限制了迭代次数导致求解失败,我们可以看下它的报错
#状态码 -9000代表求解已达到最大迭代数,说明我们给的最大迭代次数不够
- Code          : -9000
#出错的原因这里也展示了:优化时达到迭代极限。
 - Reason        : Iteration limit was reached in optimization.

出现这个错误我们可以增加最大迭代次数

model.set_int_param("IPM/MaxIterations", 8) #把最大迭代次数修改到8
#运行结果:
Solution summary.       Primal solution
 - Objective          : 4.0000000000e-01

#一般情况下我们不需要修改最大迭代次数,此次只为演示,如果出现以上报错,可以通过此api进行修改


“MaxTime”

实数型参数,用于设置优化器的最大求解时间(以秒为单位),默认值: 1.7976931348623158E+308,取值范围: [0, ∞)

  • MindOpt 当前使用墙上时间作为默认计时。
  • 如果将该值设置为0,则不会施加求解时间限制。

示例

C语言
Mdo_setRealParam(model, "MaxTime", 7200.0);
C++
model.setRealParam("MaxTime", 7200.0);
Python
model.set_real_param("MaxTime", 7200.0)

实操

try:
        model.set_int_attr(MDO_INT_ATTR.MIN_SENSE, 1)
        model.set_real_param("MaxTime", 0.00)
- Code          : -9001
- Reason        : Time limit was reached in optimization.
#优化达到了时间限制,所以程序终止

完整代码

大家可以另存这段代码为test.py文件,然后在命令行运执行 python3 test.py 来运行。

但我比较推荐在云上建模求解平台直接复制运行哦,线上运行,选择python内核不需要下载。

云上建模求解平台:opt.aliyun.com

# 引入python包
from mindoptpy import *
if __name__ == "__main__":
    MDO_INFINITY = MdoModel.get_infinity()
    # Step 1.创建模型并更改参数。    
    model = MdoModel()
    try:
        # Step 2. 输入模型。 
        model.set_int_attr("MinSense", 1)# 改为最小化问题
        model.set_real_param("MaxTime", 1.0) #求解时间设置为1.00秒       
        model.set_int_param("Method", 2) # 设置为使用内点法       
        model.set_int_param("IPM/MaxIterations", 8) # 设置最大叠戴此时为8,上文为1是错误的示例
        
        #  添加变量。
        #  通过mindoptpy.MdoModel.add_var() 来添加四个优化变量,
        #  定义其下界、上界、名称和类型。
        x = []
        x.append(model.add_var(0.0,         10.0, 1.0, None, "x0", False))
        x.append(model.add_var(0.0, MDO_INFINITY, 1.0, None, "x1", False))
        x.append(model.add_var(0.0, MDO_INFINITY, 1.0, None, "x2", False))
        x.append(model.add_var(0.0, MDO_INFINITY, 1.0, None, "x3", False))
        #  添加约束。
        #  注意这里的非零元素是按行顺序输入的。
        model.add_cons(1.0, MDO_INFINITY, 1.0 * x[0] + 1.0 * x[1] + 2.0 * x[2] + 3.0 * x[3], "c0")
        model.add_cons(1.0,          1.0, 1.0 * x[0]              - 1.0 * x[2] + 6.0 * x[3], "c1")
        # Step 3. 解决问题并填充结果。
        # 调用 mindoptpy.MdoModel.solve_prob() 求解优化问题,
        # 并用 mindoptpy.MdoModel.display_results() 来查看优化结果
        model.solve_prob()
        model.display_results()
        # 调用 mindoptpy.MdoModel.get_status() 来检查求解器的优化状态,
        # 并通过 mindoptpy.MdoModel.get_real_attr() 和 
        # mindoptpy.MdoVar.get_real_attr() 来获取目标值和最优解。
        status_code, status_msg = model.get_status()
        if status_msg == "OPTIMAL":
            print("Optimizer terminated with an OPTIMAL status (code {0}).".format(status_code))
            print("Primal objective : {0}".format(round(model.get_real_attr(MDO_REAL_ATTR.PRIMAL_OBJ_VAL), 2)))
            for curr_x in x:
                print(" - x[{0}]          : {1}".format(curr_x.get_index(), round(curr_x.get_real_attr(MDO_REAL_ATTR.PRIMAL_SOLN), 2)))
        else:
            print("Optimizer terminated with a(n) {0} status (code {1}).".format(status_msg, status_code))
        # 如果求解异常,在这里将会看见它的状态码和错误原因
    except MdoError as e:
        print("Received Mindopt exception.")
        print(" - Code          : {}".format(e.code))
        print(" - Reason        : {}".format(e.message))
    except Exception as e:
        print("Received exception.")
        print(" - Reason        : {}".format(e))
    finally:
        # Step 4. 释放模型。
        # 调用 mindoptpy.MdoModel.free_mdl() 来释放内存
        # (多次运行部分脚本的时候有些变量已经被用,所以调用这个api进行清除)
        model.free_mdl()

更多的参数详情请参考可选输入参数


联系我们

钉钉:damodi

邮箱地址:solver.damo@list.alibaba-inc.com


相关文章
|
编译器 开发工具 C#
使用MindOpt时常见的报错,以及对应的解决方法
使用MindOpt时常见的报错,以及对应的解决方法
|
5月前
|
数据采集 人工智能 机器人
什么是大模型微调?从原理到实操,新手也能轻松上手
本文通俗讲解大模型微调技术,从原理到实操全流程解析。通过比喻厘清CPT、SFT、DPO三种方式,指导新手如何用业务数据定制专属AI,并提供数据准备、工具选择、效果评估等落地步骤,助力个人与企业低成本实现模型私有化,让大模型真正融入实际场景。
什么是大模型微调?从原理到实操,新手也能轻松上手
|
6月前
【麒麟Kylin】cmake-3.16.5 rpm包安装步骤详解 附常见问题
本文介绍在麒麟系统上安装CMake 3.16.5的完整步骤:从下载RPM安装包、确认文件位置,到使用终端通过rpm或yum命令安装,并验证版本。适用于初学者快速部署CMake环境。(238字符)
|
6月前
|
Linux 编译器 数据安全/隐私保护
gcc-c++-7.3.0 rpm安装方法 Linux麒麟KY10完整步骤
本文介绍在麒麟系统中手动安装 GCC C++ 编译器的完整步骤。从下载 RPM 安装包、确认文件路径,到使用终端通过 `yum` 或 `rpm` 命令安装,涵盖权限处理、依赖解决及版本冲突等常见问题,并提供验证安装方法,确保 `g++` 成功配置。
1653 1
|
12月前
|
机器人 Linux
CentOS 7系统中安装特定版本CMake 3.21.2的方法。
到这里,过程已经全部完成。如果你跟随上面的步骤来,那么你现在已经拥有了一个全新的CMake版本在你的CentOS 7系统上了。这个过程就像是你通过一系列仪式,唤醒了一个沉睡已久的古老机器人,它现在完全按照你的意愿来帮你构建和编译软件了。
800 18
|
人工智能 计算机视觉
RT-DETR改进策略【损失函数篇】| NWD损失函数,提高小目标检测精度
RT-DETR改进策略【损失函数篇】| NWD损失函数,提高小目标检测精度
1381 5
RT-DETR改进策略【损失函数篇】| NWD损失函数,提高小目标检测精度
|
算法 数据挖掘 索引
Pandas数据排序:单列与多列排序详解
本文介绍了Pandas库中单列和多列排序的方法及常见问题的解决方案。单列排序使用`sort_values()`方法,支持升序和降序排列,并解决了忽略大小写、处理缺失值和索引混乱等问题。多列排序同样使用`sort_values()`,可指定不同列的不同排序方向,解决列名错误和性能优化等问题。掌握这些技巧能提高数据分析效率。
1092 9
|
人工智能 自然语言处理 算法
AI时代的企业内训全景图:从案例到实战
作为一名扎根在HR培训领域多年的“老兵”,我越来越清晰地感受到,企业内训的本质其实是为企业持续“造血”。无论是基础岗的新人培训、技能岗的操作规范培训,还是面向技术中坚力量的高阶技术研讨,抑或是管理层的战略思维提升课,内训的价值都是在帮助企业内部提升能力水平,进而提高组织生产力,减少对外部资源的依赖。更为重要的是,在当前AI、大模型、Embodied Intelligence等新兴技术快速迭代的背景下,企业必须不断为人才升级赋能,才能在市场竞争中保持领先。
2146 13
|
网络协议 安全 Linux
网卡接口跃点数:概念与重要性解析
在计算机网络中,跃点数(Hop Count)是指数据包从源设备传输到目标设备时经过的路由器或网关数量,是衡量路径长度的关键指标。本文详细介绍了跃点数的概念、计算方法及其在网络管理中的重要性,包括性能评估、故障排除、网络优化及路由选择等方面的应用。通过使用traceroute或tracert命令,网络管理员可以轻松获取跃点数信息,并据此优化网络结构,提高数据传输效率和安全性。尽管跃点数是重要指标,但仍需与其他因素结合分析以全面评估网络性能。
|
存储 负载均衡 数据管理
分区和分片
分区和分片
978 5