约束冲突怎么办?没关系,MindOpt会出手的!

简介: 在对实际应用中的优化问题进行建模求解的过程中,往往会遇到问题不可行的情况。而不可行问题必然是由某些约束互相之间冲突导致的,如何分析问题的不可行性并识别出导致冲突的关键约束成为求解器应用的重要一环。这类导致问题不可行的最小约束子集被称为不可约不可行系统 (IIS, irreduciable infeasible system)。

MindOpt 设计了用来计算 IIS 的 API,用户可以通过利用该 API 来对不可行问题进行分析。再依据此对 IIS 中的约束进行修正或移除,可以使得优化问题变得可行,以便于更好地对实际问题进行分析建模和获得最优决策。

本文将讲述在Python环境遇到IIS问题是如何分析,让问题变的可行。



下载安装

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

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

MindOpt的更多信息官网


举例

我们在使用画图软件去画一个正方形,我们告诉系统长是5,但又告诉高是6,我们都知道这是不可能的。这里就存在约束,正方形是四边相等的约束,但我们又告诉他是6,这个时候系统就无法判断到底是边等于5还是等于6或者是不约束各边相等,那么他就会视为冲突。说明数据不对或者已知条件太多。解决办法就是查出多余的条件,像删除等于5或者等于6 各边相等。


入门算例

在线性规划问题中,IIS 可能并不是唯一的。若存在多个 IIS,则需要对优化问题进行多次调整,才能使其变得可行。例如:

image.png

在这个例子中,我们很容易知道 为一组 IIS, 为一组 IIS。在同时移除 中的任意一条约束以及 中的任意一条约束后,该问题将变得可行。


进阶算例

我们将通过一个更加复杂的例子,来展示如何在 MindOpt 中使用约束不可行性分析来获取 IIS。考虑如下的不可行约束系统:

image.png

其中,前面三组约束构成一组IIS,而第四个约束和变量上下界则构成另外一组IIS。

#注意:MindOpt 目前采用过滤算法来寻找IIS。过滤算法虽然能在短时间找出一组IIS,但无法保证IIS的规模是所有IIS组合中最小的。此外,若使用者对约束顺序做调整,则 MindOpt 也可能会产生不同的IIS。

#注意:实际操作上,我们建议使用者修复IIS中的冲突后,再将修改后的模型输入至求解IIS的API,并修复下一个IIS;依此直至所有的冲突都得以修复。


代码实现

下面是完整的例子,可复制存为test_IIS.py文件。

从开头到第三步【model.display_results()】我们使用的是和前文一样的建模方法


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的约束进行修正或移除

联系我们

钉钉:damodi

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


相关文章
|
机器学习/深度学习 监控 算法
基于计算机视觉(opencv)的运动计数(运动辅助)系统-源码+注释+报告
基于计算机视觉(opencv)的运动计数(运动辅助)系统-源码+注释+报告
397 3
|
人工智能 达摩院 算法
AI+求解器双决策引擎MindOpt Studio助力参赛队伍赢得电力调度大赛
于12月27日结束的第五届电力调度AI大赛以“基于人工智能的电力现货市场快速出清”为主题。达摩院决策智能实验室MindOpt Studio团队第二次协办该赛事,向参赛队伍提供比赛封闭环境的算法开发环境与测试平台。在与友商比拼下,阿里云产研团队与达摩院MindOpt团队的紧密协作,赋予了比赛以多项新技能Buff,使用MindOpt Studio平台的参赛队伍在评测中占据了前10名中的8席。决赛冠军清华大学团队对阿里云点赞。
1349 2
AI+求解器双决策引擎MindOpt Studio助力参赛队伍赢得电力调度大赛
|
机器学习/深度学习 人工智能 算法
阿里达摩院 MindOpt 介绍和使用
MindOpt 是阿里巴巴达摩院决策智能实验室研发的决策优化软件。团队组建于2019年,聚焦于研发尖端运筹优化和机器学习技术,构建智能决策系统,更快更好地向各行各业提供数学建模与求解能力,帮助业务更快更好地做出决策,以期降低成本、提升效率、增大收益 。当前 MindOpt 围绕智能决策优化所需的建模和求解能力,突破国外垄断,自研了 MindOpt Solver 优化求解器、MindOpt APL 建模语言、MindOpt Tuner 调参器;并创新地提出“强化+优化”双决策引擎,打造了MindOpt Studio 优化平台。并结合前沿先进的预训练大模型技术打造MindOpt Copilot。
4290 2
阿里达摩院 MindOpt 介绍和使用
|
机器学习/深度学习 自然语言处理 算法
数据准备指南:10种基础特征工程方法的实战教程
在数据分析和机器学习中,从原始数据中提取有价值的信息至关重要。本文详细介绍了十种基础特征工程技术,包括数据插补、数据分箱、对数变换、数据缩放、One-Hot编码、目标编码、主成分分析(PCA)、特征聚合、TF-IDF 和文本嵌入。每种技术都有具体应用场景和实现示例,帮助读者更好地理解和应用这些方法。通过合理的特征工程,可以显著提升模型的性能和预测能力。
694 3
数据准备指南:10种基础特征工程方法的实战教程
|
Oracle Java iOS开发
JDK的选型、安装与配置
JDK的选型、安装与配置
353 1
Python语言如何使用MindOpt建模并求解混合整数线性规划问题
MindOpt是一款高效的优化算法软件包,求解算法实现了线性规划(LP)、混合整数线性规划(MILP)、二次规划(QP),可以支持命令行、c、c++、java和python调用。接下来我们将发布一系列文章,讲述各个语言如何使用 MindOpt 来求解数学规划问题。
Python语言如何使用MindOpt建模并求解混合整数线性规划问题
|
机器学习/深度学习 算法 Python
机器学习基础:用 Lasso 做特征选择
机器学习基础:用 Lasso 做特征选择
机器学习基础:用 Lasso 做特征选择
|
移动开发 安全 数据挖掘
(文章复现)梯级水光互补系统最大化可消纳电量期望短期优化调度模型matlab代码
参考文献: [1]罗彬,陈永灿,刘昭伟等.梯级水光互补系统最大化可消纳电量期望短期优化调度模型[J].电力系统自动化,2023,47(10):66-75.
|
关系型数据库 MySQL 数据库
使用ZIP包安装MySQL及配置教程
使用ZIP包安装MySQL及配置教程
1610 4
|
开发框架 自然语言处理 达摩院
MindOpt APL,可以支持调用几十种求解器的建模语言
建模语言可以提供更高级、更灵活的问题描述方式,从而提高问题的理解和求解效率。它可以加速问题的开发和部署过程,促进不同领域之间的合作和交流,从而推动问题求解的进展和创新。