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)
pythonmodel.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)

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

#默认参数Optimizersummary.
-Optimizerused     : Simplexmethod#单纯形法-Optimizerstatus   : OPTIMAL-Totaltime         : 0.002s#修改后Optimizersummary.
-Optimizerused     : Interiorpointmethod#内点法-Optimizerstatus   : OPTIMAL-Totaltime         : 0.013s

"IPM/MaxIterations"

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

示例:

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

实操

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

求解的结果

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

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

model.set_int_param("IPM/MaxIterations", 8) #把最大迭代次数修改到8#运行结果:Solutionsummary.       Primalsolution-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);
Pythonmodel.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        : Timelimitwasreachedinoptimization.
#优化达到了时间限制,所以程序终止

完整代码

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

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

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

# 引入python包frommindoptpyimport*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()
ifstatus_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)))
forcurr_xinx:
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))
# 如果求解异常,在这里将会看见它的状态码和错误原因exceptMdoErrorase:
print("Received Mindopt exception.")
print(" - Code          : {}".format(e.code))
print(" - Reason        : {}".format(e.message))
exceptExceptionase:
print("Received exception.")
print(" - Reason        : {}".format(e))
finally:
# Step 4. 释放模型。# 调用 mindoptpy.MdoModel.free_mdl() 来释放内存# (多次运行部分脚本的时候有些变量已经被用,所以调用这个api进行清除)model.free_mdl()

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


联系我们

钉钉群号:32451444

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

更多更新通知:https://solver.damo.alibaba.com


相关文章
|
3天前
|
存储 算法 程序员
【C++20 新特性 】模板参数包展开与Lambda初始化捕获详解
【C++20 新特性 】模板参数包展开与Lambda初始化捕获详解
92 3
|
3天前
|
定位技术 索引
基于Amos路径分析的输出结果参数详解
基于Amos路径分析的输出结果参数详解
461 2
|
3天前
|
开发者 Python
Python中的仅限位置参数:简化函数调用与提升代码清晰度
【4月更文挑战第17天】Python 3.8 引入了仅限位置参数,增强函数调用清晰度和安全性。通过`/`语法,开发者可指定某些参数只能按位置传递,防止顺序错误和不必要的关键字参数。这有助于提高代码可读性,确保参数正确传递,并在复杂函数中提升安全性。在实际应用中,仅限位置参数可用于明确参数位置、保持向后兼容性和增强函数安全性。
|
3天前
|
XML 算法 C语言
【C/C++ 静态代码检查工具 Cppcheck 】Cppcheck 检测器列表和检查规则大全一览
【C/C++ 静态代码检查工具 Cppcheck 】Cppcheck 检测器列表和检查规则大全一览
101 0
MindOpt APL建模语言自定小义函数的重要性和示例
在编程和建模语言中,函数是一段独立的、可重复使用的代码块,用于执行特定任务。在MindOpt APL中,自定义函数的使用非常重要,因为它们提高了建模过程的效率、可读性和灵活性。
|
SQL 人工智能 JSON
Prompt learning 教学技巧篇:通过增加示例、引导词、特殊符号指令等方式让chatgpt输出更好的答案
Prompt learning 教学技巧篇:通过增加示例、引导词、特殊符号指令等方式让chatgpt输出更好的答案
|
JSON Linux 数据格式
ChatGPT无所不知?? 怎么可能? vscode启用括号对参考线, 他就不知道
一开始我是这样问的 问ChatGPT vscode , 当我点击某个括号时, 显示配对的括号, 有一条线连接两个括号, 怎么实现? vscode自带这个功能吗? 或者用什么插件扩展
364 0
ChatGPT无所不知?? 怎么可能? vscode启用括号对参考线, 他就不知道
|
测试技术
loadrunner 脚本开发-参数化之将内容保存为参数、参数数组及参数值获取
loadrunner 脚本开发-参数化之将内容保存为参数、参数数组及参数值获取
89 0
|
PyTorch 算法框架/工具 Python
jupyter 输出向量自动省略了中间的值,如何查看完整的向量值
Jupyter 默认情况下会根据向量的长度来自动省略中间的值,以便在输出时能够更好地适应屏幕大小。如果想要查看完整的向量值,可以通过以下两种方式实现: 1. 使用 print() 函数显示完整的向量内容。这种方法适用于任何大小的向量,但是需要显式调用 print() 函数来输出向量。Jupyter 默认情况下会根据张量的长度来自动省略中间的值,以便在输出时能够更好地适应屏幕大小。如果想要查看完整的张量内容,可以通过以下两种方式实现: 1. 使用 print() 函数显示完整的张量内容。这种方法适用于任何大小的张量,但是需要显式调用 print() 函数来输出张量。
933 0
|
前端开发
前端学习案例-参数默认值是函数1
前端学习案例-参数默认值是函数1
51 0
前端学习案例-参数默认值是函数1