MindOpt有关于Python的建模与优化

简介: MindOpt有关于Python的建模与优化

前言


周四,天气渐渐凉快了下来。


一、安装


优化求解器之手把手教你申请试用与运行MindOpt求解器.

个人建议:先使用在线版的看一下效果,毕竟本机装环境超麻烦的好吗。

MindOpt 优化求解器-线上版.


二、Python 的建模与优化


例子:这里我们使用官方案例【LP专题-2】营养调配:如何吃少花钱又营养.


2-1、MdoModel类


MdoModel:用以创建优化模型类对象

类对象所调用的函数介绍

1、model.add_var(): 向模型引入新变量(列)的函数。参数介绍如下,返回值是创建的变量对象。


  • lb(浮点数) – 新变量的下限值。默认值为 。0.0
  • ub(浮点数) – 新变量的上限值。默认值为 。1.E+20
  • obj(浮点数) – 新变量的目标系数。默认值为 。0.0
  • col (MdoCol) – 保存非零元素的列对象。默认值为 。None
  • name (str) – 用于保存列名的字符串对象。默认值为 。“”
  • is_integer (bint) – 一个布尔标志,指定这是否为整数变量。默认值为 。False


2、model.add_cons():向模型引入新约束(行)的函数。

  • lhs(浮点型或 MdoTempLinear) – 新约束或临时线性对象的左侧值。下限!
  • rhs(浮点型或 str 型)– 新约束的右侧值,或约束名称的字符串。上限!
  • expr (MdoExprLinear) – 持有新线性约束的表达式。默认值为 。None
  • name (str) – 用于保存列名的字符串对象。默认值为 。“”

3、 model.solve_prob():


4、 model.get_infinity(): 用于检索无穷大值的函数,返回无穷大的值,返回类型是浮点数。


5、 model.set_int_attr(): 用于更改整数值模型属性的值的函数。


6、 model.set_str_param(): 用于更改字符串值参数的值的函数。

  • par (str) – 要访问的字符串值参数。
  • value (int) – 字符串值参数的新值。

7、model.submit_task(): 此函数将优化模型任务提交到远程服务器进行优化。模型任务文件以二进制格式包含问题数据、参数设置和解决方案。


返回:一个字符串,指定已提交作业的 ID。用户可以使用此作业 ID 查询优化结果。(str)


8、model.retrieve_task(): 该函数检查已提交任务的状态,然后检索相应的优化结果(如果可用)。所有可能的状态值为:“Submitted” “Solving” “Canceled” “Finished” “Failed”


  • 参数:
  • job_id (str) – 指定已提交作业的 ID 的字符串。
  • 返回值(四个值):
  • 已提交任务的状态(str)
  • 模型状态(int)
  • 相应代码,优化状态(int)
  • 标志,指定方案的可用性(bool)

9、model.explain_result():此函数解释求解器结果代码的详细信息。


  • 参数:
  • 优化状态,model.retrieve_task()得到的返回值。(第三个)
  • 返回:
  • 一个字符串,保存给定求解器状态代码的详细信息。


10、model.explain_status(): 此函数解释求解器状态代码的详细信息。


  • 参数:
  • 模型状态,model.retrieve_task()得到的返回值。(第二个)
  • 返回:
  • 一个字符串,保存给定求解器状态代码的详细信息。


11、model.display_results(): 显示当前求解器结果的函数。


12、model.get_status(): 用于检索求解器状态的函数。


  • 返回值:
  • 状态码(int)
  • 状态信息(str)


13、model.get_real_attr():用于检索实值模型属性的值的函数。


  • 参数
  • 要访问的属性(str)
  • 返回
  • 实值模型属性的当前值。


2-2、MdoExprLinear类


MdoExprLinear: 此对象实现数据结构以保存线性约束表达式对象,该对象由一组系数-变量对组成。使用该类的步骤如下:


1、通过使用 model.add_var() 创建一系列变量对象。

2、使用MdoExprLinear()类创建一个空的对象。

3、使用重载运算符(+、-、×、/),或者是使用成员函数MdoExprLinear.add_terms()


官方例子

MdoVar x1 = model.add_var()
MdoVar x3 = model.add_var()
expr1 = 1 * x1
expr1 = expr1 + x2
MdoVar x3 = model.add_var()
expr2 = expr1 + x3

2-3、官方案例——营养调配

"""
/**
 *  example_2_py1.py
 *  Description 
 *  -----------
 *
 *  Linear optimization (diet problem).
 * 
 *  The goal is to select foods that satisfy daily nutritional requirements while minimizing the total cost. 
 *  The constraints in this problem limit the number of calories, the volume of good consumed, and the amount of 
 *  vitamins, protein, carbohydrates, calcium, and iron in the diet.
 *
 *  Note
 *  ----
 * 
 *  The model below will be inputted in a row-wise order.
 *
 *  Formulation
 *  -----------
 *
 * Minimize
 * Obj:        1.840000000 Cheeseburger + 2.190000000 HamSandwich + 1.840000000 Hamburger + 1.440000000 FishSandwich +
 *             2.290000000 ChickenSandwich + 0.770000000 Fries + 1.290000000 SausageBiscuit + 0.600000000 LowfatMilk + 
 *             0.720000000 OrangeJuice
 * Subject To
 * Cal:        510 Cheeseburger + 370 HamSandwich + 500 Hamburger + 370 FishSandwich +
 *             400 ChickenSandwich + 220 Fries + 345 SausageBiscuit + 110 LowfatMilk + 80 OrangeJuice >= 2000
 * Carbo:      34 Cheeseburger + 35 HamSandwich + 42 Hamburger + 38 FishSandwich + 42 ChickenSandwich + 
 *             26 Fries + 27 SausageBiscuit + 12 LowfatMilk + 20 OrangeJuice <= 375
 * Carbo_low:  34 Cheeseburger + 35 HamSandwich + 42 Hamburger + 38 FishSandwich + 42 ChickenSandwich + 
 *             26 Fries + 27 SausageBiscuit + 12 LowfatMilk + 20 OrangeJuice >= 350
 * Protein:    28 Cheeseburger + 24 HamSandwich + 25 Hamburger + 14 FishSandwich + 31 ChickenSandwich + 
 *             3 Fries + 15 SausageBiscuit + 9 LowfatMilk + OrangeJuice >= 55
 * VitA:       15 Cheeseburger + 15 HamSandwich + 6 Hamburger + 2 FishSandwich + 8 ChickenSandwich + 
 *             4 SausageBiscuit + 10 LowfatMilk + 2 OrangeJuice >= 100
 * VitC:       6 Cheeseburger + 10 HamSandwich + 2 Hamburger + 15 ChickenSandwich + 
 *             15 Fries + 4 LowfatMilk + 120 OrangeJuice >= 100
 * Calc:       30 Cheeseburger + 20 HamSandwich + 25 Hamburger + 15 FishSandwich + 
 *             15 ChickenSandwich + 20 SausageBiscuit + 30 LowfatMilk + 2 OrangeJuice >= 100
 * Iron:       20 Cheeseburger + 20 HamSandwich + 20 Hamburger + 10 FishSandwich + 
 *             8 ChickenSandwich + 2 Fries + 15 SausageBiscuit + 2 OrangeJuice >= 100
 * Volume:     4 Cheeseburger + 7.500000000 HamSandwich + 3.500000000 Hamburger + 5 FishSandwich + 
 *             7.300000000 ChickenSandwich + 2.600000000 Fries + 4.100000000 SausageBiscuit + 8 LowfatMilk + 12 OrangeJuice <= 75
 * Bounds
 * End
 */
"""
from mindoptpy import *
if __name__ == "__main__":
    MDO_INFINITY = MdoModel.get_infinity()
    token = "**********"
    server = "mindopt.tianchi.aliyun.com"
    desc = "tianchi example2 MdoRemotLdDiet PY1"
    filepath = "./tmp/"
    req = \
    {   
        # requirement: ( lower bound,   upper bound)
        "Cal"        : (         2000, MDO_INFINITY), 
        "Carbo"      : (          350,          375),
        "Protein"    : (           55, MDO_INFINITY), 
        "VitA"       : (          100, MDO_INFINITY),
        "VitC"       : (          100, MDO_INFINITY),
        "Calc"       : (          100, MDO_INFINITY), 
        "Iron"       : (          100, MDO_INFINITY), 
        "Volume"     : (-MDO_INFINITY,           75)
    }
    food = \
    {
        # food            : ( lower bound,  upper bound, cost)
        "Cheeseburger"    : (           0, MDO_INFINITY, 1.84),
        "HamSandwich"     : (           0, MDO_INFINITY, 2.19),
        "Hamburger"       : (           0, MDO_INFINITY, 1.84),
        "FishSandwich"    : (           0, MDO_INFINITY, 1.44),
        "ChickenSandwich" : (           0, MDO_INFINITY, 2.29),
        "Fries"           : (           0, MDO_INFINITY, 0.77),
        "SausageBiscuit"  : (           0, MDO_INFINITY, 1.29),
        "LowfatMilk"      : (           0, MDO_INFINITY, 0.60),
        "OrangeJuice"     : (           0, MDO_INFINITY, 0.72)
    }
    req_value = \
    {  
        # (requirement, food              ) : value
        ( "Cal",        "Cheeseburger"    ) : 510,
        ( "Cal",        "HamSandwich"     ) : 370,
        ( "Cal",        "Hamburger"       ) : 500,
        ( "Cal",        "FishSandwich"    ) : 370,
        ( "Cal",        "ChickenSandwich" ) : 400,
        ( "Cal",        "Fries"           ) : 220,
        ( "Cal",        "SausageBiscuit"  ) : 345,
        ( "Cal",        "LowfatMilk"      ) : 110,
        ( "Cal",        "OrangeJuice"     ) : 80,
        ( "Carbo",      "Cheeseburger"    ) : 34,
        ( "Carbo",      "HamSandwich"     ) : 35,
        ( "Carbo",      "Hamburger"       ) : 42,
        ( "Carbo",      "FishSandwich"    ) : 38,
        ( "Carbo",      "ChickenSandwich" ) : 42,
        ( "Carbo",      "Fries"           ) : 26,
        ( "Carbo",      "SausageBiscuit"  ) : 27,
        ( "Carbo",      "LowfatMilk"      ) : 12,
        ( "Carbo",      "OrangeJuice"     ) : 20,
        ( "Protein",    "Cheeseburger"    ) : 28,
        ( "Protein",    "HamSandwich"     ) : 24,
        ( "Protein",    "Hamburger"       ) : 25,
        ( "Protein",    "FishSandwich"    ) : 14,
        ( "Protein",    "ChickenSandwich" ) : 31,
        ( "Protein",    "Fries"           ) : 3,
        ( "Protein",    "SausageBiscuit"  ) : 15,
        ( "Protein",    "LowfatMilk"      ) : 9,
        ( "Protein",    "OrangeJuice"     ) : 1,
        ( "VitA",       "Cheeseburger"    ) : 15,
        ( "VitA",       "HamSandwich"     ) : 15,
        ( "VitA",       "Hamburger"       ) : 6,
        ( "VitA",       "FishSandwich"    ) : 2,
        ( "VitA",       "ChickenSandwich" ) : 8,
        ( "VitA",       "Fries"           ) : 0,
        ( "VitA",       "SausageBiscuit"  ) : 4,
        ( "VitA",       "LowfatMilk"      ) : 10,
        ( "VitA",       "OrangeJuice"     ) : 2,
        ( "VitC",       "Cheeseburger"    ) : 6,
        ( "VitC",       "HamSandwich"     ) : 10,
        ( "VitC",       "Hamburger"       ) : 2,
        ( "VitC",       "FishSandwich"    ) : 0,
        ( "VitC",       "ChickenSandwich" ) : 15,
        ( "VitC",       "Fries"           ) : 15,
        ( "VitC",       "SausageBiscuit"  ) : 0,
        ( "VitC",       "OrangeJuice"     ) : 4,
        ( "VitC",       "LowfatMilk"      ) : 120,
        ( "Calc",       "Cheeseburger"    ) : 30,
        ( "Calc",       "HamSandwich"     ) : 20,
        ( "Calc",       "Hamburger"       ) : 25,
        ( "Calc",       "FishSandwich"    ) : 15,
        ( "Calc",       "ChickenSandwich" ) : 15,
        ( "Calc",       "Fries"           ) : 0,
        ( "Calc",       "SausageBiscuit"  ) : 20,
        ( "Calc",       "LowfatMilk"      ) : 30,
        ( "Calc",       "OrangeJuice"     ) : 2,
        ( "Iron",       "Cheeseburger"    ) : 20,
        ( "Iron",       "HamSandwich"     ) : 20,
        ( "Iron",       "Hamburger"       ) : 20,
        ( "Iron",       "FishSandwich"    ) : 10,
        ( "Iron",       "ChickenSandwich" ) : 8,
        ( "Iron",       "Fries"           ) : 2,
        ( "Iron",       "SausageBiscuit"  ) : 15,
        ( "Iron",       "LowfatMilk"      ) : 0,
        ( "Iron",       "OrangeJuice"     ) : 2,
        ( "Volume",     "Cheeseburger"    ) : 4,
        ( "Volume",     "HamSandwich"     ) : 7.5,
        ( "Volume",     "Hamburger"       ) : 3.5,
        ( "Volume",     "FishSandwich"    ) : 5,
        ( "Volume",     "ChickenSandwich" ) : 7.3,
        ( "Volume",     "Fries"           ) : 2.6,
        ( "Volume",     "SausageBiscuit"  ) : 4.1,
        ( "Volume",     "LowfatMilk"      ) : 8,
        ( "Volume",     "OrangeJuice"     ) : 12
    }
    # Step 1. Create a model and change the parameters.
    model = MdoModel()
    try:
        # Step 2. Input model.
        # Change to minimization problem.
        model.set_int_attr("MinSense", 1)
        # Add variables.
        var = {}
        for food_name, food_data in food.items():
            var[food_name] = model.add_var(food_data[0], food_data[1], food_data[2], None, food_name, False)
        # Add constraints.
        for req_name, req_data in req.items():
            expr = MdoExprLinear()
            for food_name in food.keys():
                expr += req_value[req_name, food_name] * var[food_name]
            model.add_cons(req_data[0], req_data[1], expr, req_name)
        # Step 3. Input parameters related to the remote computing server.
        model.set_str_param("Remote/Token", token)
        model.set_str_param("Remote/Desc", desc)
        model.set_str_param("Remote/Server", server)
        model.set_str_param("Remote/File/Path", filepath)
        # Step 4. Upload the serialized model and parameters to server, and then optimize the model.   
        job_id = model.submit_task()
        if job_id == "":
            print("ERROR: Empty job ID.")
            raise MdoError(-1)
        else:
            print("Job was submitted to server successfully.")
            print("User may query the optimization result with the following job ID: {}".format(job_id))
        # Step 5. Check the solution status periodically, and             
        #         download the its upon availability.       
        status = "Submitted"
        while status == 'Submitted' or status == 'Solving': 
            status, model_status, result, has_soln = model.retrieve_task(job_id)
            # Sleep for 10 seconds.
            time.sleep(10)
        model_status_details = model.explain_status(model_status)
        result_details = model.explain_result(result)
        print(" - Job status             : {}".format(status)) 
        print(" - Model status           : {0} ({1})".format(model_status_details, model_status))
        print(" - Optimization status    : {0} ({1})".format(result_details, result))
        print(" - Solution availability  : {0}".format("available" if has_soln else "not available"))
        if has_soln:
            print("\nPopulating solution.")
            model.display_results()
            status_code, status_msg = model.get_status()
            if status_msg == "OPTIMAL":
                print("Optimizer terminated with an OPTIMAL status (code {0}).".format(status_code))
                print("Daily cost           : ${0}".format(round(model.get_real_attr("PrimalObjVal"), 2)))
                for food_name, food_var in var.items():
                    val = round(food_var.get_real_attr("PrimalSoln"), 2)
                    if val > 0.01:
                        print(f" - {food_name: <17} : {val}")
            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:
        pass



参考文章:

MindOpt 优化求解器-线上版.

MindOpt 官方文档.


总结

yeah,快下班了!

相关文章
|
20天前
|
机器学习/深度学习 数据采集 TensorFlow
使用Python实现智能食品加工优化的深度学习模型
使用Python实现智能食品加工优化的深度学习模型
123 59
|
2月前
|
Web App开发 前端开发 JavaScript
探索Python科学计算的边界:利用Selenium进行Web应用性能测试与优化
【10月更文挑战第6天】随着互联网技术的发展,Web应用程序已经成为人们日常生活和工作中不可或缺的一部分。这些应用不仅需要提供丰富的功能,还必须具备良好的性能表现以保证用户体验。性能测试是确保Web应用能够快速响应用户请求并处理大量并发访问的关键步骤之一。本文将探讨如何使用Python结合Selenium来进行Web应用的性能测试,并通过实际代码示例展示如何识别瓶颈及优化应用。
125 5
|
2月前
|
机器学习/深度学习 数据采集 TensorFlow
智能市场营销策略优化:使用Python实现深度学习模型
【10月更文挑战第1天】 智能市场营销策略优化:使用Python实现深度学习模型
169 63
|
17天前
|
机器学习/深度学习 算法 数据可视化
使用Python实现深度学习模型:智能食品配送优化
使用Python实现深度学习模型:智能食品配送优化
36 2
|
21天前
|
搜索推荐 Python
快速排序的 Python 实践:从原理到优化,打造你的排序利器!
本文介绍了 Python 中的快速排序算法,从基本原理、实现代码到优化方法进行了详细探讨。快速排序采用分治策略,通过选择基准元素将数组分为两部分,递归排序。文章还对比了快速排序与冒泡排序的性能,展示了优化前后快速排序的差异。通过这些分析,帮助读者理解快速排序的优势及优化的重要性,从而在实际应用中选择合适的排序算法和优化策略,提升程序性能。
32 1
|
25天前
|
运维 监控 Linux
自动化运维:如何利用Python脚本优化日常任务##
【10月更文挑战第29天】在现代IT运维中,自动化已成为提升效率、减少人为错误的关键技术。本文将介绍如何通过Python脚本来简化和自动化日常的运维任务,从而让运维人员能够专注于更高层次的工作。从备份管理到系统监控,再到日志分析,我们将一步步展示如何编写实用的Python脚本来处理这些任务。 ##
|
3月前
|
机器学习/深度学习 数据采集 算法
【BetterBench博士】2024华为杯C题:数据驱动下磁性元件的磁芯损耗建模 Python代码实现
本文介绍了2024年中国研究生数学建模竞赛C题的详细分析,涵盖数据预处理、特征提取、模型训练及评估等多个方面。通过对磁通密度数据的处理,提取关键特征并应用多种分类算法进行波形分类。此外,还探讨了斯坦麦茨方程及其温度修正模型的应用,分析了温度、励磁波形和磁芯材料对磁芯损耗的影响,并提出了优化磁芯损耗与传输磁能的方法。最后,提供了B站视频教程链接,供进一步学习参考。
161 6
【BetterBench博士】2024华为杯C题:数据驱动下磁性元件的磁芯损耗建模 Python代码实现
|
2月前
|
SQL 关系型数据库 数据库
优化Web开发流程:Python ORM的优势与实现细节
【10月更文挑战第4天】在Web开发中,数据库操作至关重要,但直接编写SQL语句既繁琐又易错。对象关系映射(ORM)技术应运而生,让开发者以面向对象的方式操作数据库,显著提升了开发效率和代码可维护性。本文探讨Python ORM的优势及其实现细节,并通过Django ORM的示例展示其应用。ORM提供高级抽象层,简化数据库操作,提高代码可读性,并支持多种数据库后端,防止SQL注入。Django内置强大的ORM系统,通过定义模型、生成数据库表、插入和查询数据等步骤,展示了如何利用ORM简化复杂的数据库操作。
61 6
|
2月前
|
机器学习/深度学习 算法 数据可视化
如果你的PyTorch优化器效果欠佳,试试这4种深度学习中的高级优化技术吧
在深度学习领域,优化器的选择对模型性能至关重要。尽管PyTorch中的标准优化器如SGD、Adam和AdamW被广泛应用,但在某些复杂优化问题中,这些方法未必是最优选择。本文介绍了四种高级优化技术:序列最小二乘规划(SLSQP)、粒子群优化(PSO)、协方差矩阵自适应进化策略(CMA-ES)和模拟退火(SA)。这些方法具备无梯度优化、仅需前向传播及全局优化能力等优点,尤其适合非可微操作和参数数量较少的情况。通过实验对比发现,对于特定问题,非传统优化方法可能比标准梯度下降算法表现更好。文章详细描述了这些优化技术的实现过程及结果分析,并提出了未来的研究方向。
28 1
|
2月前
|
机器学习/深度学习 供应链 Python
使用Python实现深度学习模型:智能供应链管理与优化
使用Python实现深度学习模型:智能供应链管理与优化 【10月更文挑战第4天】
144 0
使用Python实现深度学习模型:智能供应链管理与优化