温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何理解Python数学建模PuLP库线性规划进阶基于字典

发布时间:2021-10-19 09:10:31 来源:亿速云 阅读:144 作者:iii 栏目:开发技术

本篇内容主要讲解“如何理解Python数学建模PuLP库线性规划进阶基于字典”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解Python数学建模PuLP库线性规划进阶基于字典”吧!

目录
  • 1、基于字典的创建规划问题

  • 2、线性规划问题案例

  • 3、建立模型

    • (1)决策变量

    • (2)目标函数

    • (3)约束条件

    • (4)变量取值范围

  • 4、PuLP 程序1:使用 LpVariable 逐一定义变量

    • 5、PuLP 程序2:使用 dict 定义决策变量和约束条件

      • 6、Python程序和运行结果

        1、基于字典的创建规划问题

        上篇中介绍了使用 LpVariable 对逐一定义每个决策变量,设定名称、类型和上下界,类似地对约束条件也需要逐一设置模型参数。在大规模的规划问题中,这样逐个定义变量和设置模型参数非常繁琐,效率很低。Pulp 库提供了一种快捷方式,可以结合 Python语言的循环和容器,使用字典来创建问题。

        -(1)使用快捷方法建立一个规划问题,可以用字典类型(dict) 建立多个变量,例如:

        name = [‘废料1', ‘废料2', ‘废料3', ‘废料4', ‘镍', ‘铬', ‘钼']
          # A dictionary of the costs of each of the Ingredients is created
          mass = pulp.LpVariable.dicts(“原料”, material, lowBound=0, cat=‘Continuous')

        -(2)使用字典类型(dict) 设置目标函数和约束条件的参数,例如:

        cost = {
              ‘废料1': 16,
              ‘废料2': 10,
              ‘废料3': 8,
              ‘废料4': 9,
              ‘镍': 48,
              ‘铬': 60,
              ‘钼': 53}

        -(3)使用 遍历循环结构 设置目标函数和约束条件,例如:

        AlloyModel += pulp.lpSum([cost[item] * mass[item] for item in material]), “总生产成本”
          AlloyModel += pulp.lpSum([mass[item] for item in material]) == 1000, “质量约束”

        2、线性规划问题案例

        本篇以合金钢材生产投料问题为例,分析基于列表和字典创建问题的快捷方法。

        问题描述:
          某钢铁厂通过熔炼回收的金属废料并添加一定新料的方法生产满足化学成分要求的合金,计划生产1000千克的合金。
          所有金属废料的主要成分是铁,不同金属废料还含有各种微量元素。
          金属废料、新料的各组分含量占比、可用数量和单位成本如下表所示。生成合金中各组分的含量要求,也如表中所示。
          问如何安排投料比例,在满足合金组分含量要求的条件下的材料成本最小?

        材料可用量成本
        废料10.8018.012.00.07516
        废料20.703.21.10.125010
        废料30.85000不限8
        废料40.40000不限9
        010000不限48
        001000不限60
        000100不限53
        合金下限0.653.01.01.1//
        合金上限0.753.51.21.3//

        3、建立模型

        (1)决策变量

        x1:废料 1 用量(千克)
        x2:废料 2 用量(千克)
        x3:废料 3 用量(千克)
        x4:废料 4 用量(千克)
        x5:原料镍 用量(千克)
        x6:原料铬 用量(千克)
        x7:原料钼 用量(千克)

        (2)目标函数

        min cost = 16*x1 + 10*x2 + 8*x3 + 9*x4 + 48*x5 + 60*x6 + 53*x7

        (3)约束条件

        0.8*x1 + 0.7*x2 + 0.85*x3 + 0.40*x4 >= 0.65*1000
        0.8*x1 + 0.7*x2 + 0.85*x3 + 0.40*x4 <= 0.75*1000
        18.0*x1 + 3.2*x2 + 100.0*x5 >= 3.0*1000
        18.0*x1 + 3.2*x2 + 100.0*x5 <= 3.5*1000
        12.0*x1 + 1.1*x2 + 100.0*x6 >= 1.0*1000
        12.0*x1 + 1.1*x2 + 100.0*x6 >= 1.2*1000
        0.1*x2 + 100.0*x7 >= 1.1*1000
        0.1*x2 + 100.0*x7 >= 1.3*1000

        (4)变量取值范围

        xi >= 0, i=1,2,…7
        x1 <= 75, x2 <= 250

        4、PuLP 程序1:使用 LpVariable 逐一定义变量

        本程序与上篇的方法相同,使用 LpVariable 逐一定义变量。完整的程序代码如下:

        import pulp      # 导入 pulp库
            # 1.建立优化问题 AlloyLP: 求最小值(LpMinimize)
            AlloyLP = pulp.LpProblem("合金生产材料优化", sense=pulp.LpMinimize)    # 定义问题,求最小值
            # 2.定义决策变量 x1~x7
            x1 = pulp.LpVariable('废料1#', lowBound=0, upBound=75.0, cat='Continuous')  # 定义 x1
            x2 = pulp.LpVariable('废料2#', lowBound=0, upBound=250., cat='Continuous')  # 定义 x2
            x3 = pulp.LpVariable('废料3#', lowBound=0, cat='Continuous')  # 定义 x3
            x4 = pulp.LpVariable('废料4#', lowBound=0, cat='Continuous')  # 定义 x4
            x5 = pulp.LpVariable('原料镍', lowBound=0, cat='Continuous')  # 定义 x5
            x6 = pulp.LpVariable('原料铬', lowBound=0, cat='Continuous')  # 定义 x6
            x7 = pulp.LpVariable('原料钼', lowBound=0, cat='Continuous')  # 定义 x7
            # 3.定义目标函数 cost
            AlloyLP += (16*x1 + 10*x2 + 8*x3 + 9*x4 + 48*x5 + 60*x6 + 53*x7)  # 投料成本
            # 4.设置约束条件
            AlloyLP += (x1 + x2 + x3 + x4 + x5 + x6 + x7 == 1000)  # 等式约束
            AlloyLP += (0.8*x1 + 0.7*x2 + 0.85*x3 + 0.4*x4 >= 0.65*1000)  # 不等式约束
            AlloyLP += (0.8*x1 + 0.7*x2 + 0.85*x3 + 0.4*x4 <= 0.75*1000)  # 不等式约束
            AlloyLP += (18.0*x1 + 3.2*x2 + 100.0*x5 >= 3.0*1000)  # 不等式约束
            AlloyLP += (18.0*x1 + 3.2*x2 + 100.0*x5 <= 3.5*1000)  # 不等式约束
            AlloyLP += (12.0*x1 + 1.1*x2 + 100.0*x6 >= 1.0*1000)  # 不等式约束
            AlloyLP += (12.0*x1 + 1.1*x2 + 100.0*x6 <= 1.2*1000)  # 不等式约束
            AlloyLP += (0.1*x2 + 100.0*x7 >= 1.1*1000)  # 不等式约束
            AlloyLP += (0.1*x2 + 100.0*x7 <= 1.3*1000)  # 不等式约束
            AlloyLP += (x1 + x2 + x3 + x4 + x5 + x6 + x7 == 1000)  # 等式约束
            # 5.求解线性规划问题
            AlloyLP.solve()
            # 6.输出优化结果
            print(AlloyLP)  # 输出问题设定参数和条件
            # print("求解状态:", pulp.LpStatus[AlloyLP.status])  # 输出求解状态
            for v in AlloyLP.variables():
                print(v.name, " = ", v.varValue)  # 输出每个变量的最优值
            print("最小材料成本 = ", pulp.value(AlloyLP.objective))  # 输出最优解的目标函数值
            # = 关注 Youcans,分享原创系列 https://blog.csdn.net/youcans =

        5、PuLP 程序2:使用 dict 定义决策变量和约束条件

        本程序使用 dict 定义变量、目标函数和约束条件参数,便于复杂问题的参数设定。

        import pulp      # 导入 pulp库
            # 1.建立优化问题 AlloyLP: 求最小值(LpMinimize)
            AlloyLP = pulp.LpProblem("合金生产材料优化", sense=pulp.LpMinimize)    # 定义问题,求最小值
            # 2.定义决策变量 x1~x7
            x1 = pulp.LpVariable('废料1#', lowBound=0, upBound=75.0, cat='Continuous')  # 定义 x1
            x2 = pulp.LpVariable('废料2#', lowBound=0, upBound=250., cat='Continuous')  # 定义 x2
            x3 = pulp.LpVariable('废料3#', lowBound=0, cat='Continuous')  # 定义 x3
            x4 = pulp.LpVariable('废料4#', lowBound=0, cat='Continuous')  # 定义 x4
            x5 = pulp.LpVariable('原料镍', lowBound=0, cat='Continuous')  # 定义 x5
            x6 = pulp.LpVariable('原料铬', lowBound=0, cat='Continuous')  # 定义 x6
            x7 = pulp.LpVariable('原料钼', lowBound=0, cat='Continuous')  # 定义 x7
            # 3.定义目标函数 cost
            AlloyLP += (16*x1 + 10*x2 + 8*x3 + 9*x4 + 48*x5 + 60*x6 + 53*x7)  # 投料成本
            # 4.设置约束条件
            AlloyLP += (x1 + x2 + x3 + x4 + x5 + x6 + x7 == 1000)  # 等式约束
            AlloyLP += (0.8*x1 + 0.7*x2 + 0.85*x3 + 0.4*x4 >= 0.65*1000)  # 不等式约束
            AlloyLP += (0.8*x1 + 0.7*x2 + 0.85*x3 + 0.4*x4 <= 0.75*1000)  # 不等式约束
            AlloyLP += (18.0*x1 + 3.2*x2 + 100.0*x5 >= 3.0*1000)  # 不等式约束
            AlloyLP += (18.0*x1 + 3.2*x2 + 100.0*x5 <= 3.5*1000)  # 不等式约束
            AlloyLP += (12.0*x1 + 1.1*x2 + 100.0*x6 >= 1.0*1000)  # 不等式约束
            AlloyLP += (12.0*x1 + 1.1*x2 + 100.0*x6 <= 1.2*1000)  # 不等式约束
            AlloyLP += (0.1*x2 + 100.0*x7 >= 1.1*1000)  # 不等式约束
            AlloyLP += (0.1*x2 + 100.0*x7 <= 1.3*1000)  # 不等式约束
            AlloyLP += (x1 + x2 + x3 + x4 + x5 + x6 + x7 == 1000)  # 等式约束
            # 5.求解线性规划问题
            AlloyLP.solve()
            # 6.输出优化结果
            print(AlloyLP)  # 输出问题设定参数和条件
            # print("求解状态:", pulp.LpStatus[AlloyLP.status])  # 输出求解状态
            for v in AlloyLP.variables():
                print(v.name, " = ", v.varValue)  # 输出每个变量的最优值
            print("最小材料成本 = ", pulp.value(AlloyLP.objective))  # 输出最优解的目标函数值
            # = 关注 Youcans,分享原创系列 https://blog.csdn.net/youcans =

        6、Python程序和运行结果

        程序 1 和程序 2 的运行结果完全相同,结果如下:

        Welcome to the CBC MILP Solver 
        Version: 2.9.0 
        Build Date: Feb 12 2015 
        钢材生产问题:
        MINIMIZE
        16*原料_废料1 + 10*原料_废料2 + 8*原料_废料3 + 9*原料_废料4 + 53*原料_钼 + 60*原料_铬 + 48*原料_镍 + 0
        SUBJECT TO
        质量约束: 原料_废料1 + 原料_废料2 + 原料_废料3 + 原料_废料4 + 原料_钼 + 原料_铬 + 原料_镍 = 1000
        碳最小占比: 0.8 原料_废料1 + 0.7 原料_废料2 + 0.85 原料_废料3 + 0.4 原料_废料4 >= 650
        碳最大占比: 0.8 原料_废料1 + 0.7 原料_废料2 + 0.85 原料_废料3 + 0.4 原料_废料4 <= 750
        镍最小占比: 18 原料_废料1 + 3.2 原料_废料2 + 100 原料_镍 >= 3000
        镍最大占比: 18 原料_废料1 + 3.2 原料_废料2 + 100 原料_镍 <= 3500
        铬最小占比: 12 原料_废料1 + 1.1 原料_废料2 + 100 原料_铬 >= 1000
        铬最大占比: 12 原料_废料1 + 1.1 原料_废料2 + 100 原料_铬 <= 1200
        钼最小占比: 0.1 原料_废料2 + 100 原料_钼 >= 1100
        钼最大占比: 0.1 原料_废料2 + 100 原料_钼 <= 1300
        废料1可用量: 原料_废料1 <= 75
        废料2可用量: 原料_废料2 <= 250
        VARIABLES
        原料_废料1 Continuous
        原料_废料2 Continuous
        原料_废料3 Continuous
        原料_废料4 Continuous
        原料_钼 Continuous
        原料_铬 Continuous
        原料_镍 Continuous
        优化状态: Optimal
        原料_废料1 = 75.0
        原料_废料2 = 90.909091
        原料_废料3 = 672.28283
        原料_废料4 = 137.30808
        原料_钼 = 10.909091
        原料_铬 = 0.0
        原料_镍 = 13.590909
        最优总成本 =  9953.671725000002

        到此,相信大家对“如何理解Python数学建模PuLP库线性规划进阶基于字典”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

        向AI问一下细节

        免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

        AI