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