欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python數(shù)學(xué)建模PuLP庫線性規(guī)劃進階基于字典詳解

 更新時間:2021年10月18日 15:22:05   作者:youcans  
在大規(guī)模的規(guī)劃問題中,這樣逐個定義變量和設(shè)置模型參數(shù)非常繁瑣,效率很低。Pulp 庫提供了一種快捷方式,可以結(jié)合 Python語言的循環(huán)和容器,使用字典來創(chuàng)建問題

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

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

-(1)使用快捷方法建立一個規(guī)劃問題,可以用字典類型(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) 設(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ī)劃問題案例

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

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

材料 可用量 成本
廢料1 0.80 18.0 12.0 0.0 75 16
廢料2 0.70 3.2 1.1 0.1 250 10
廢料3 0.85 0 0 0 不限 8
廢料4 0.40 0 0 0 不限 9
0 100 0 0 不限 48
0 0 100 0 不限 60
0 0 0 100 不限 53
合金下限 0.65 3.0 1.0 1.1 / /
合金上限 0.75 3.5 1.2 1.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庫
    # 1.建立優(yōu)化問題 AlloyLP: 求最小值(LpMinimize)
    AlloyLP = pulp.LpProblem("合金生產(chǎn)材料優(yōu)化", 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.定義目標(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ī)劃問題
    AlloyLP.solve()
    # 6.輸出優(yōu)化結(jié)果
    print(AlloyLP)  # 輸出問題設(shè)定參數(shù)和條件
    # print("求解狀態(tài):", pulp.LpStatus[AlloyLP.status])  # 輸出求解狀態(tài)
    for v in AlloyLP.variables():
        print(v.name, " = ", v.varValue)  # 輸出每個變量的最優(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ù)雜問題的參數(shù)設(shè)定。

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

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

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

Welcome to the CBC MILP Solver 
Version: 2.9.0 
Build Date: Feb 12 2015 
鋼材生產(chǎ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

以上就是Python數(shù)學(xué)建模PuLP庫線性規(guī)劃進階基于字典詳解的詳細內(nèi)容,更多關(guān)于數(shù)學(xué)建模PuLP庫線性規(guī)劃的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 構(gòu)建Python包的五個簡單準(zhǔn)則簡介

    構(gòu)建Python包的五個簡單準(zhǔn)則簡介

    這篇文章主要介紹了構(gòu)建Python包的五個簡單準(zhǔn)則簡介,在Github開源合作日趨主流的今天,健壯的Python包的構(gòu)建成為開發(fā)者必須要考慮到的問題,本文提出了五項建議,需要的朋友可以參考下
    2015-06-06
  • python 批量修改/替換數(shù)據(jù)的實例

    python 批量修改/替換數(shù)據(jù)的實例

    今天小編就為大家分享一篇python 批量修改/替換數(shù)據(jù)的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Python?print函數(shù)使用由淺入深全面詳解

    Python?print函數(shù)使用由淺入深全面詳解

    這篇文章主要為大家介紹了Python?print函數(shù)使用由淺入深全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • python Xarray處理設(shè)置二維數(shù)組作為coordinates方式

    python Xarray處理設(shè)置二維數(shù)組作為coordinates方式

    這篇文章主要介紹了python Xarray處理設(shè)置二維數(shù)組作為coordinates方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • python 列表元素左右循環(huán)移動 的多種解決方案

    python 列表元素左右循環(huán)移動 的多種解決方案

    這篇文章主要介紹了python 列表元素左右循環(huán)移動 的多種解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • OpenCV半小時掌握基本操作之邊界填充

    OpenCV半小時掌握基本操作之邊界填充

    這篇文章主要介紹了OpenCV基本操作之邊界填充,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • 對Python3 序列解包詳解

    對Python3 序列解包詳解

    今天小編就為大家分享一篇對Python3 序列解包詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • Python log模塊logging記錄打印用法解析

    Python log模塊logging記錄打印用法解析

    這篇文章主要介紹了Python log模塊logging記錄打印用法解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • Django中STATIC_ROOT和STATIC_URL及STATICFILES_DIRS淺析

    Django中STATIC_ROOT和STATIC_URL及STATICFILES_DIRS淺析

    這篇文章主要給大家介紹了關(guān)于Django中STATIC_ROOT和STATIC_URL及STATICFILES_DIRS的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧
    2018-05-05
  • 使用Python點云生成3D網(wǎng)格

    使用Python點云生成3D網(wǎng)格

    本文主要介紹了使用Python點云生成3D網(wǎng)格,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03

最新評論