MindOpt 设计了用来计算 IIS 的 API,用户可以通过利用该 API 来对不可行问题进行分析。再依据此对 IIS 中的约束进行修正或移除,可以使得优化问题变得可行,以便于更好地对实际问题进行分析建模和获得最优决策。
本文将讲述在Python环境遇到IIS问题是如何分析,让问题变的可行。
下载安装
用户可以点这里下载安装MindOpt优化求解器
开通算法服务控制台(免费的)
举例
我们在使用画图软件去画一个正方形,我们告诉系统长是5,但又告诉高是6,我们都知道这是不可能的。这里就存在约束,正方形是四边相等的约束,但我们又告诉他是6,这个时候系统就无法判断到底是边等于5还是等于6或者是不约束各边相等,那么他就会视为冲突。说明数据不对或者已知条件太多。解决办法就是查出多余的条件,像删除等于5或者等于6 各边相等。
入门算例
在线性规划问题中,IIS 可能并不是唯一的。若存在多个 IIS,则需要对优化问题进行多次调整,才能使其变得可行。例如:
在这个例子中,我们很容易知道 与 为一组 IIS, 与 为一组 IIS。在同时移除 或 中的任意一条约束以及 或 中的任意一条约束后,该问题将变得可行。
进阶算例
我们将通过一个更加复杂的例子,来展示如何在 MindOpt 中使用约束不可行性分析来获取 IIS。考虑如下的不可行约束系统:
其中,前面三组约束构成一组IIS,而第四个约束和变量上下界则构成另外一组IIS。
#注意:MindOpt 目前采用过滤算法来寻找IIS。过滤算法虽然能在短时间找出一组IIS,但无法保证IIS的规模是所有IIS组合中最小的。此外,若使用者对约束顺序做调整,则 MindOpt 也可能会产生不同的IIS。
#注意:实际操作上,我们建议使用者修复IIS中的冲突后,再将修改后的模型输入至求解IIS的API,并修复下一个IIS;依此直至所有的冲突都得以修复。
代码实现
下面是完整的例子,可复制存为test_IIS.py
文件。
从开头到第三步【model.display_results()】我们使用的是和前文一样的建模方法
- Python: 线性规划LP问题、混合整数线性规划MILP问题、二次规划QP问题
from mindoptpy import * if __name__ == "__main__": MDO_INFINITY = MdoModel.get_infinity() # Step 1. 创建模型并更改参数。 model = MdoModel() # 关闭预求解器,这样求解器就不会以 MDO_INF_OR_UBD 状态终止。 model.set_int_param(MDO_INT_PARAM.PRESOLVE, 0) model.set_int_param(MDO_INT_PARAM.METHOD, 1) try: # Step 2. 输入模型。 # 改为最小化问题。 model.set_int_attr(MDO_INT_ATTR.MIN_SENSE, 1) # 添加变量 x = [] x.append(model.add_var(0.0, MDO_INFINITY, 0.0, None, "x0", False)) x.append(model.add_var(0.0, MDO_INFINITY, 0.0, None, "x1", False)) x.append(model.add_var(0.0, MDO_INFINITY, 0.0, None, "x2", False)) x.append(model.add_var(5.0, MDO_INFINITY, 0.0, None, "x3", False)) x.append(model.add_var(0.0, 2.0, 0.0, None, "x4", False)) # 添加约束。 conss = [] conss.append(model.add_cons(-0.5 * x[0] + x[1] >= 0.5, "c0")) conss.append(model.add_cons( 2.0 * x[0] - x[1] >= 3.0, "c1")) conss.append(model.add_cons( 3.0 * x[0] + x[1] <= 6.0, "c2")) conss.append(model.add_cons( 3.0 * x[3] - x[4] <= 2.0, "c3")) conss.append(model.add_cons( x[0] + x[4] <= 10.0, "c4")) conss.append(model.add_cons( x[0] + 2.0 * x[1] + x[3] <= 14.0, "c5")) conss.append(model.add_cons( x[1] + x[3] >= 1.0, "c6")) # Step 3. 解决问题并填充结果。 model.solve_prob() model.display_results() #接下来,当优化问题不可行时,使用 mindoptpy.MdoModel.compute_iis() #获取不可约不可行子系统的行列坐标,并打印对应的约束名与变量名 status_code, status_msg = model.get_status() if status_msg == "INFEASIBLE": print("Optimizer terminated with an MDO_INFEASIBLE status (code {0}).".format(status_code)) print("Compute IIS.") idx_rows, idx_cols = model.compute_iis() print("Computed IIS has {0} rows and {1} columns.".format(len(idx_rows), len(idx_cols))) print("Populating IIS.") for i in idx_rows: print("Constraint: {0}".format(conss[i].get_str_attr("RowName"))) for j in idx_cols: print("Variable: {0}".format(x[j].get_str_attr("ColName"))) 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(" - Explanation : {}".format(e)) finally: # Step 4. 释放模型。 model.free_mdl()
然后运行代码,如命令行中执行 python test_IIS.py 文件后,得到求解的结果如下所示,#号里面是我添加的注释。
Model summary. - Num. variables : 5 - Num. constraints : 7 - Num. nonzeros : 15 - Bound range : [5.0e-01,1.4e+01] - Objective range : [0.0e+00,0.0e+00] - Matrix range : [5.0e-01,3.0e+00] Simplex method started. Iteration Objective Dual Inf. Primal Inf. Time 0 0.00000e+00 0.0000e+00 1.6500e+01 0.01s 1 0.00000e+00 0.0000e+00 1.7500e+01 0.01s Simplex method terminated. Time : 0.003s Optimizer summary. #优化器摘要 - Optimizer used : Simplex method #单纯形法 - Optimizer status : INFEASIBLE #优化状态不可行 - Total time : 0.008s Solution not available. #解决方案不可用。 Optimizer terminated with an MDO_INFEASIBLE status (code 2). Compute IIS. #然后开始计算IIS IIS started. IIS terminated. Time : 0.010s A subsystem with 1 rows (out of 7 rows) that contains an IIS was found. #找到了一个包含IIS的1行 (7行中) 的子系统。 Computed IIS has 1 rows and 0 columns. Populating IIS. Constraint: c3 #可以对C3的约束进行修正或移除
联系我们
钉钉群号:32451444
邮箱地址:solver.damo@list.alibaba-inc.com
更多更新通知:https://solver.damo.alibaba.com