溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何理解Python數(shù)學(xué)建模PuLP庫(kù)線性規(guī)劃進(jìn)階基于字典

發(fā)布時(shí)間:2021-10-19 09:10:31 來(lái)源:億速云 閱讀:159 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本篇內(nèi)容主要講解“如何理解Python數(shù)學(xué)建模PuLP庫(kù)線性規(guī)劃進(jìn)階基于字典”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“如何理解Python數(shù)學(xué)建模PuLP庫(kù)線性規(guī)劃進(jìn)階基于字典”吧!

目錄
  • 1、基于字典的創(chuàng)建規(guī)劃問(wèn)題

  • 2、線性規(guī)劃問(wèn)題案例

  • 3、建立模型

    • (1)決策變量

    • (2)目標(biāo)函數(shù)

    • (3)約束條件

    • (4)變量取值范圍

  • 4、PuLP 程序1:使用 LpVariable 逐一定義變量

    • 5、PuLP 程序2:使用 dict 定義決策變量和約束條件

      • 6、Python程序和運(yùn)行結(jié)果

        1、基于字典的創(chuàng)建規(guī)劃問(wèn)題

        上篇中介紹了使用 LpVariable 對(duì)逐一定義每個(gè)決策變量,設(shè)定名稱、類(lèi)型和上下界,類(lèi)似地對(duì)約束條件也需要逐一設(shè)置模型參數(shù)。在大規(guī)模的規(guī)劃問(wèn)題中,這樣逐個(gè)定義變量和設(shè)置模型參數(shù)非常繁瑣,效率很低。Pulp 庫(kù)提供了一種快捷方式,可以結(jié)合 Python語(yǔ)言的循環(huán)和容器,使用字典來(lái)創(chuàng)建問(wèn)題。

        -(1)使用快捷方法建立一個(gè)規(guī)劃問(wèn)題,可以用字典類(lèi)型(dict) 建立多個(gè)變量,例如:

        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)使用字典類(lèi)型(dict) 設(shè)置目標(biāo)函數(shù)和約束條件的參數(shù),例如:

        cost = {
              ‘廢料1': 16,
              ‘廢料2': 10,
              ‘廢料3': 8,
              ‘廢料4': 9,
              ‘鎳': 48,
              ‘鉻': 60,
              ‘鉬': 53}

        -(3)使用 遍歷循環(huán)結(jié)構(gòu) 設(shè)置目標(biāo)函數(shù)和約束條件,例如:

        AlloyModel += pulp.lpSum([cost[item] * mass[item] for item in material]), “總生產(chǎn)成本”
          AlloyModel += pulp.lpSum([mass[item] for item in material]) == 1000, “質(zhì)量約束”

        2、線性規(guī)劃問(wèn)題案例

        本篇以合金鋼材生產(chǎn)投料問(wèn)題為例,分析基于列表和字典創(chuàng)建問(wèn)題的快捷方法。

        問(wèn)題描述:
          某鋼鐵廠通過(guò)熔煉回收的金屬?gòu)U料并添加一定新料的方法生產(chǎn)滿足化學(xué)成分要求的合金,計(jì)劃生產(chǎn)1000千克的合金。
          所有金屬?gòu)U料的主要成分是鐵,不同金屬?gòu)U料還含有各種微量元素。
          金屬?gòu)U料、新料的各組分含量占比、可用數(shù)量和單位成本如下表所示。生成合金中各組分的含量要求,也如表中所示。
          問(wèn)如何安排投料比例,在滿足合金組分含量要求的條件下的材料成本最???

        材料可用量成本
        廢料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)目標(biāo)函數(shù)

        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      # 導(dǎo)入 pulp庫(kù)
            # 1.建立優(yōu)化問(wèn)題 AlloyLP: 求最小值(LpMinimize)
            AlloyLP = pulp.LpProblem("合金生產(chǎn)材料優(yōu)化", sense=pulp.LpMinimize)    # 定義問(wèn)題,求最小值
            # 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.定義目標(biāo)函數(shù) cost
            AlloyLP += (16*x1 + 10*x2 + 8*x3 + 9*x4 + 48*x5 + 60*x6 + 53*x7)  # 投料成本
            # 4.設(shè)置約束條件
            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.求解線性規(guī)劃問(wèn)題
            AlloyLP.solve()
            # 6.輸出優(yōu)化結(jié)果
            print(AlloyLP)  # 輸出問(wèn)題設(shè)定參數(shù)和條件
            # print("求解狀態(tài):", pulp.LpStatus[AlloyLP.status])  # 輸出求解狀態(tài)
            for v in AlloyLP.variables():
                print(v.name, " = ", v.varValue)  # 輸出每個(gè)變量的最優(yōu)值
            print("最小材料成本 = ", pulp.value(AlloyLP.objective))  # 輸出最優(yōu)解的目標(biāo)函數(shù)值
            # = 關(guān)注 Youcans,分享原創(chuàng)系列 https://blog.csdn.net/youcans =

        5、PuLP 程序2:使用 dict 定義決策變量和約束條件

        本程序使用 dict 定義變量、目標(biāo)函數(shù)和約束條件參數(shù),便于復(fù)雜問(wèn)題的參數(shù)設(shè)定。

        import pulp      # 導(dǎo)入 pulp庫(kù)
            # 1.建立優(yōu)化問(wèn)題 AlloyLP: 求最小值(LpMinimize)
            AlloyLP = pulp.LpProblem("合金生產(chǎn)材料優(yōu)化", sense=pulp.LpMinimize)    # 定義問(wèn)題,求最小值
            # 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.定義目標(biāo)函數(shù) cost
            AlloyLP += (16*x1 + 10*x2 + 8*x3 + 9*x4 + 48*x5 + 60*x6 + 53*x7)  # 投料成本
            # 4.設(shè)置約束條件
            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.求解線性規(guī)劃問(wèn)題
            AlloyLP.solve()
            # 6.輸出優(yōu)化結(jié)果
            print(AlloyLP)  # 輸出問(wèn)題設(shè)定參數(shù)和條件
            # print("求解狀態(tài):", pulp.LpStatus[AlloyLP.status])  # 輸出求解狀態(tài)
            for v in AlloyLP.variables():
                print(v.name, " = ", v.varValue)  # 輸出每個(gè)變量的最優(yōu)值
            print("最小材料成本 = ", pulp.value(AlloyLP.objective))  # 輸出最優(yōu)解的目標(biāo)函數(shù)值
            # = 關(guān)注 Youcans,分享原創(chuàng)系列 https://blog.csdn.net/youcans =

        6、Python程序和運(yùn)行結(jié)果

        程序 1 和程序 2 的運(yùn)行結(jié)果完全相同,結(jié)果如下:

        Welcome to the CBC MILP Solver 
        Version: 2.9.0 
        Build Date: Feb 12 2015 
        鋼材生產(chǎn)問(wèn)題:
        MINIMIZE
        16*原料_廢料1 + 10*原料_廢料2 + 8*原料_廢料3 + 9*原料_廢料4 + 53*原料_鉬 + 60*原料_鉻 + 48*原料_鎳 + 0
        SUBJECT TO
        質(zhì)量約束: 原料_廢料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
        優(yōu)化狀態(tài): Optimal
        原料_廢料1 = 75.0
        原料_廢料2 = 90.909091
        原料_廢料3 = 672.28283
        原料_廢料4 = 137.30808
        原料_鉬 = 10.909091
        原料_鉻 = 0.0
        原料_鎳 = 13.590909
        最優(yōu)總成本 =  9953.671725000002

        到此,相信大家對(duì)“如何理解Python數(shù)學(xué)建模PuLP庫(kù)線性規(guī)劃進(jìn)階基于字典”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

        向AI問(wèn)一下細(xì)節(jié)

        免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

        AI