简介

MindOpt是一款高效的优化算法软件包,求解算法实现了线性规划(LP)、混合整数线性规划(MILP)、二次规划(QP),可以支持命令行、c、c++、java和python调用。接下来我们将发布一系列文章,讲述各个语言如何使用 MindOpt 来求解数学规划问题。

本篇文章是系列文章的第二篇,下文会分享小编个人对混合整数线性规划的定义,然后举一个例题,最后将对使用 MindOpt Python 语言的 API 来建模以及求解 混合整数线性规划问题示例 中的问题以及展示求解的结果。

如何获取MindOpt求解器

求解器安装包的发布渠道。请大家:

  1. 前往 https://www.aliyun.com/product/ai/opt 来下载求解器软件。
  2. 在阿里云上获取免费授权码:
    • 请大家迁移到“云鉴权”自助申请licenseKey,配置fl_client.ini。新的“云鉴权”不需要绑定机器ID,只要阿里云账号并联网就好。
    关于求解器的使用文档,请参考:https://help.aliyun.com/document_detail/298219.htm

混合整数线性规划

我个人认为混合整数线性规划与线性规划的区别在于,线性规划在求解目标函数最优值的时候,决策变量是连续的,即可以是整数也可以是小数,但混合整数线性规划可能会有一个或者多个变量必须为整数。

比如经典的背包问题:

桌子上有一组物品,每个物品有自己的价值和重量,但是包的承重是有限的;我们要装什么物品,在包的重量承受范围内,包里总物品的价值最高?这个里面选择那个物品就是个整数,并不能是小数切开,比如一个吹风机不能切开只带一半走。

数学形式下的混合整数线性规划问题:


其中:

混合整数线性规划很多时候会更难求解。在求解的时候,可以用分支定界法、割平面法等,会切分成子问题调用线性规划(LP)求解模块。MindOpt在今年也发布了混合整数线性规划(MILP)的求解能力。接下来我会举个例子如何使用。

混合整数线性规划问题示例:

python代码示例:

   # 引入python包
from mindoptpy import *if __name__ == "__main__":MDO_INFINITY = MdoModel.get_infinity()# Step 1.创建模型并更改参数。model = MdoModel()try:# Step 2. 输入模型。model.set_int_attr(MDO_INT_ATTR.MIN_SENSE, 1)# 添加变量。x = []x.append(model.add_var(0.0,         10.0, 1.0, None, "x0", True))x.append(model.add_var(0.0, MDO_INFINITY, 1.0, None, "x1", True))x.append(model.add_var(0.0, MDO_INFINITY, 1.0, None, "x2", True))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.  解决问题并填充结果。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. 释放模型。model.free_mdl()

详细代码解释如下:

第一步:创建模型

首先,我们必须建立一个空的模型

model = MdoModel()

第二步:MILP模型输入

  • 接着我们利用Python API set_int_attr()将目标函数改为最小化
model.set_int_attr(MDO_INT_ATTR.MIN_SENSE, 1)
# 也可以选择这个模型属性model.set_int_attr("MinSense", 1) 数字1代表最小化,0代表最大化
  • 再调用 add_var() 来添加四个优化变量,定义其下界、上界、名称和类型
    (0.0是新增变量的下界,10和MDO_INFINITY是上界,1.0为新变量的目标系数,
    None是包含非零元素的列对象,默认为None。""中是变量的名字,False代表不可指定是否为整数变量的布尔标志,因为第一个第二个第三个参数必须为整数所以他们的布尔标志为True)
x = []x.append(model.add_var(0.0,         10.0, 1.0, None, "x0", True))x.append(model.add_var(0.0, MDO_INFINITY, 1.0, None, "x1", True))x.append(model.add_var(0.0, MDO_INFINITY, 1.0, None, "x2", True))x.append(model.add_var(0.0, MDO_INFINITY, 1.0, None, "x3", False))
  • 然后调用add_cons()来添加约束
    (1.0为新约束的左侧值,或临时线性对象。MDO_INFINITY和10为新约束的右侧值,或者一个约束名称的字符串。"c0、c1"为这条约束的名字。)
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")

第三步:求解MILP模型

模型输入后,我们接着用solve_prob()来求解问题。
并用display_results()呈现求解结果。

model.solve_prob()
model.display_results()

如果您觉得阅读数学公式案例很抽象,可以去我们云上建模求解平台的案例广场查看更多的案例哦
云上建模求解平台:https://opt.aliyun.com/

联系我们

钉钉群号:32451444
邮箱地址:solver.damo@list.alibaba-inc.com
更多更新通知:https://solver.damo.alibaba.com

MindOpt对于混合整数线性规划问题如何建模优化(python语言)相关推荐

  1. yalmip + lpsolve + matlab 求解混合整数线性规划问题(MIP/MILP)

    转自,原文: https://www.cnblogs.com/kane1990/p/3428129.html 最近建立了一个网络流模型,是一个混合整数线性规划问题(模型中既有连续变量,又有整型变量). ...

  2. 混合整数线性规划——切割平面

    我们可以使用Gomory切割来完全求解一个整数线性规划问题.思路是 1. 求解线性松弛 2. 根据这个线性松弛的单纯性表产生并添加Gomort切割,切割约束条件空间, 直到线性松弛的最优解为整. 针对 ...

  3. 如何用matlab编写混合整数规划,MATLAB中的混合整数线性规划

    我试图用MATLAB解决这个混合整数线性规划问题 . 但是,我在matlab中对线性目标函数和决策变量求和的定义存在问题 . 我在MATLAB中使用intlinprog函数 . 请在下面找到图片链接 ...

  4. 混合整数线性规划(MILP)

    混合整数线性规划(MILP) 线性规划模型(Linear Programming, LP):LP的定义比较简单,它指的就是目标函数是线性的,所有约束也是线性的,最后,决策变量可以取任何的实数.如果在线 ...

  5. 混合整数线性规划问题 Matlab

    问题介绍 一般来说可以使用simplex算法计算正实数范围内的线性规划问题,但是在实际生活中我们常常会遇到带有相关整数要求的线性规划问题,我们称之为整数线性规划问题,而更复杂的情况下,问题中既有实数又 ...

  6. 混合整数线性规划——分支限界法

    当上一节讲到的线性规划问题中,要求某些变量是整数的时候,就变成了混合整数线性规划问题. 其实对于某些问题来说,线性规划问题的最优解刚好是整数,那么它对应的混合整数线性规划问题的解就刚好是这个最优解了. ...

  7. 使用COPT求解混合整数线性规划

    一.使用Copt求解模型步骤 1.模型的引入 使用 from copt import * 引入模型 import coptpy as cp 2.创建求解环境 env = Envr() 创建优化模型,返 ...

  8. 基于混合整数线性规划的电力系统机组组合优化研究

    基于混合整数线性规划的电力系统机组组合优化研究 *一.简介 电力系统机组组合问题属于单目标.多约束优化问题,是电力系统优化调度.系统规划的学习的第一步.通过对机组组合优化的掌握,并进一步引入新的运行场 ...

  9. 利用CVX和gurobi这个求解器复现一篇混合整数线性规划问题时遇到的问题

    利用CVX和gurobi这个求解器复现一篇混合整数线性规划问题时遇到的问题 1.当出现从cvx 转换为double 时出现错误: ![](https://img-blog.csdnimg.cn/202 ...

最新文章

  1. 如何创建从ArcIMS到ArcSDE/Oracle的直接连接?
  2. SpringBoot+AntV实现一次前后端交互渲染多个饼状图
  3. springboot整合shiro和session的详细过程和自定义登录拦截器
  4. 找出连续最长数字串python_字符串中找出连续最长的数字字符串的实例代码
  5. java 课后习题 找零钱
  6. MATLAB中的三维图形等值线
  7. [转载] Python导出Excel图表
  8. 阿里消息中间件ONS消息乱序问题(二)
  9. 《python深度学习》总结与感想
  10. 计算机多媒体技术英文,计算机多媒体技术在英语听力测试中的应用
  11. MySQL的金科玉律:“不要使用SELECT *”
  12. php if相关标签,dedecms模板中运用dede标签时使用php和if判断语句的方法
  13. nrf52840烧录提示错误原因和解决办法
  14. 笔记01-如何创建一个vue3的项目
  15. orign绘制双排Stack Column
  16. 中国为什么要买美国国债
  17. jenkins api java封装_Jenkins api java 调用
  18. linux定时发信息到微信群聊,Wechat-Timed-Message
  19. 博客系统前端页面代码实现及页面展示(代码版)
  20. python弹窗_python弹窗运用

热门文章

  1. 通俗理解faster-rcnn的rpn网络
  2. UWPWP8.1 中文网页字符乱码 字符乱码 UTF-8转GBK 解决方法
  3. 适合晚上静静听!5首优美略带伤感的纯音乐
  4. Scrapy Engine
  5. 1-1 云南省2020年普通高校专升本院校招生计划
  6. MySQL监控:MySQL监控指标、MySQL监控界面实现、Python监控MySQL
  7. jQuery(五)Ajax、跨域
  8. android studio 连接真机测试 小米8
  9. 2018年UCB61A--hog Fall
  10. 利用angr进行二进制静态分析