利用【Python】【線性規劃】優化工廠生產:實現智能資源配置與利潤最大化的現代解決方案

目錄

1. 問題背景和描述

1.1 問題背景

1.2 問題描述

2. 數學模型的建立

2.1決策變量

2.2 目標函數

2.3 約束條件

2.4 數學模型總結

3. 使用Python解決線性規劃問題

3.1 導入必要的庫

3.2 定義目標函數系數

3.3 定義不等式約束矩陣和向量

3.4 定義變量的邊界

非負約束

變量邊界在SciPy中的表示

3.5 求解線性規劃問題

調用linprog函數

3.6 輸出結果

獲取和解釋最優解

4. 結果解釋和應用

4.1 結果解釋

4.2 應用

4.3 驗證結果

5. 擴展閱讀

5.1 擴展閱讀

5.2 線性規劃的其他類型

?編輯

代碼

結果

總結


?

ce6fbd68767d465bbe94b775b8b811db.png

731bd47804784fa2897220a90a387b28.gif

專欄:數學建模學習筆記

1. 問題背景和描述

1.1 問題背景

在現代制造業和商業運作中,資源的有效利用和利潤的最大化是企業追求的重要目標。企業面臨的常見問題是如何在有限的資源條件下,通過合理分配和優化使用資源,來實現利潤的最大化。線性規劃(Linear Programming,LP)是一種數學優化技術,能夠在這些情況下發揮重要作用。它通過建立數學模型,幫助企業在眾多可能的選擇中找到最優解,進而指導實際操作。

假設有一家工廠,生產兩種產品:產品A和產品B。每種產品的生產都需要消耗特定的資源。每天,每種資源的使用時間是有限的,這使得資源分配問題變得復雜。工廠的目標是通過合理分配資源,確定每天應該生產多少單位的產品A和產品B,以實現總利潤的最大化。

具體數據如下:

  • 資源1:每天最多可用60個小時
  • 資源2:每天最多可用40個小時
  • 產品A:每單位需要資源1的2個小時和資源2的1個小時
  • 產品B:每單位需要資源1的1個小時和資源2的2個小時
  • 產品A:每單位的利潤為30美元
  • 產品B:每單位的利潤為20美元

通過對這些數據進行分析和建模,我們可以利用線性規劃技術來制定一個優化的生產計劃,確保在資源限制條件下實現利潤的最大化。

1.2 問題描述

我們需要建立一個線性規劃模型來描述上述問題,并使用該模型找到每天應該生產的產品A和產品B的最優數量,從而實現總利潤的最大化。同時,生產過程中必須滿足資源的限制條件,即不能超過每天可用的資源時間。

在這個問題中,我們的目標是構建一個數學模型,通過這個模型可以:

  1. 確定每天生產的產品A和產品B的數量。
  2. 滿足資源的限制條件。
  3. 實現總利潤的最大化。

2. 數學模型的建立

建立數學模型是解決線性規劃問題的基礎。我們將根據問題背景中的具體數據,定義決策變量,構建目標函數和約束條件。

2.1決策變量

決策變量是我們希望通過優化確定的數量。在這個問題中,決策變量是每天生產的產品A和產品B的數量。我們定義兩個決策變量:

  • x1?:每天生產的產品A的單位數量
  • x2?:每天生產的產品B的單位數量

這些決策變量將用于構建目標函數和約束條件。

2.2 目標函數

目標函數是我們希望優化的表達式。在這個問題中,目標是最大化總利潤。總利潤可以表示為生產的產品A和產品B的利潤之和。具體來說:

  • 產品A每單位的利潤為30美元
  • 產品B每單位的利潤為20美元

因此,總利潤可以表示為: 利潤=30x1?+20x2?

我們的目標是最大化總利潤,因此目標函數可以表示為: 最大化?z=30x1?+20x2?

2.3 約束條件

約束條件是模型中必須滿足的限制。在這個問題中,約束條件包括資源的限制和生產數量的非負性。

  1. 資源1的限制: 2*x1?+x2?≤60

  2. 資源2的限制:x1?+2*x2?≤40

  3. 非負約束:x1≥0 ,x2?≥0

這些約束條件確保生產計劃不會超過可用的資源,并且生產的數量是非負的,即實際可行的。

2.4 數學模型總結

綜合以上信息,我們可以建立一個完整的線性規劃模型來描述這個問題。模型的形式如下:

3. 使用Python解決線性規劃問題

在建立了數學模型之后,我們可以使用Python中的SciPy庫來求解這個線性規劃問題。SciPy庫提供了許多優化算法,其中linprog函數可以用于求解線性規劃問題。

3.1 導入必要的庫

首先,我們需要導入必要的庫:

import numpy as np
from scipy.optimize import linprog

3.2 定義目標函數系數

在求解問題時,SciPy的linprog函數默認是用于最小化問題的。因此,我們需要將最大化問題轉換為最小化問題。具體來說,我們可以將目標函數的系數取負。

目標函數的系數為:c=[?30,?20]

在Python中定義目標函數系數:

c = [-30, -20]

3.3 定義不等式約束矩陣和向量

在Python中,我們可以定義約束矩陣和向量如下:

A = [[2, 1], [1, 2]]
b = [60, 40]

這里,A 是一個二維數組,表示約束條件的系數矩陣,每一行對應一個不等式約束條件,每一列對應一個決策變量。b 是一個一維數組,表示每個約束條件的右端常數項。

  • 矩陣 A:每一行代表一個約束條件,每一列代表一個決策變量。在我們的例子中,第一行 [2, 1] 表示第一個約束條件 2x1?+x2?≤60,第二行 [1, 2] 表示第二個約束條件x1?+2x2?≤40。
  • 向量 b:每個元素表示一個約束條件的右端常數項。對于我們的例子,向量 b 中的元素分別是 60 和 40,對應兩個約束條件的右端值。

3.4 定義變量的邊界

在實際的生產問題中,變量的取值范圍通常是有限制的。對于我們的例子,每天生產的產品數量不能為負,因此我們需要設置變量的邊界條件。

非負約束

線性規劃問題中的非負約束是指決策變量必須是非負數,即:

x1?≥0? ? ? ?x2?≥0

這些非負約束條件確保了我們的生產數量是合理的(即,不能生產負數的產品)。

變量邊界在SciPy中的表示

在SciPy的linprog函數中,變量的邊界可以通過bounds參數來指定。每個決策變量的邊界條件可以用一個元組表示,元組的第一個元素是變量的下界,第二個元素是變量的上界。如果變量沒有上界,可以用None表示。

x_bounds = [(0, None), (0, None)]

這里,(0, None) 表示變量的下界是0,上界沒有限制,即變量必須是非負的。

  • 變量邊界定義:我們用一個列表來表示每個變量的邊界。列表中的每個元素是一個元組,元組的第一個元素表示變量的下界,第二個元素表示變量的上界。在我們的例子中,我們定義了兩個變量 x1? 和 x2?,它們的邊界條件都是非負的,因此我們用(0, None)來表示它們的邊界。
  • 意義和應用:非負約束條件確保了我們的生產計劃是現實可行的,因為生產的數量不能為負數。這在實際應用中是非常重要的,可以防止在優化過程中出現不合理的解。

3.5 求解線性規劃問題

在定義了目標函數的系數、約束條件和變量的邊界之后,我們可以使用SciPy的linprog函數來求解這個線性規劃問題。linprog函數是SciPy庫中用于求解線性規劃問題的主要函數。

調用linprog函數

linprog函數的基本調用方式如下:

res = linprog(c, A_ub=A, b_ub=b, bounds=x_bounds, method='highs')

其中:

  • c:目標函數的系數向量
  • A_ub:不等式約束條件的系數矩陣
  • b_ub:不等式約束條件的右端常數項向量
  • bounds:變量的邊界條件
  • method:求解方法,這里我們使用highs方法,這是SciPy推薦的高效求解方法之一
  • 目標函數的系數向量 c:之前定義的目標函數的系數向量[-30, -20]。注意這里我們將最大化問題轉換為最小化問題,因此系數取負。
  • 不等式約束條件的系數矩陣 A_ub:定義了每個約束條件的系數矩陣[[2, 1], [1, 2]]
  • 不等式約束條件的右端常數項向量 b_ub:對應于不等式約束的右端常數項向量[60, 40]
  • 變量的邊界條件 bounds:定義了變量的取值范圍,確保變量是非負的。
  • 求解方法 method:指定使用highs方法,這是SciPy中一個高效的線性規劃求解器。

3.6 輸出結果

在求解完成之后,我們需要輸出結果。結果對象res包含了優化的詳細信息,包括最優解和最優目標函數值。

獲取和解釋最優解

最優解是指在滿足所有約束條件的情況下,使目標函數達到最優值的決策變量值。在我們的例子中,最優解是每天應該生產的產品A和產品B的數量。

print('Optimal value:', round(res.fun * -1, ndigits=2))  # 恢復最大化問題的目標函數值
print('x:', res.x)

?這里,res.fun 是最優目標函數值,因為我們最初將目標函數系數取了負,所以需要乘以-1來恢復最大化問題的目標函數值。res.x 是最優解,即最優的 x1? 和 x2? 的值。

4. 結果解釋和應用

在得到線性規劃問題的求解結果之后,我們需要對結果進行解釋和應用。最優解和最優目標函數值對于實際的生產計劃具有重要的指導意義。

4.1 結果解釋

  1. 最優目標函數值:1400。這個值表示在滿足所有資源約束的情況下,最大化的總利潤為1400美元。
  2. 最優解:每天生產20個單位的產品A和10個單位的產品B。這是指在所有約束條件下能夠使總利潤最大化的最優生產計劃。

4.2 應用

最優解對于工廠的生產計劃具有重要的指導意義。通過按照最優解安排生產,工廠可以確保資源的有效利用,最大化利潤。

具體來說,工廠應該每天生產20個單位的產品A和10個單位的產品B。這將使得總利潤最大化,同時不超過每天可用的資源限制。通過這種方式,工廠可以實現資源的最佳配置,提高生產效率和經濟效益。

4.3 驗證結果

為了驗證結果的正確性,我們可以檢查最優解是否滿足所有約束條件:

  1. 資源1的使用情況: 2×20+1×10=40+10=50≤60? ?

  2. 資源2的使用情況: 1×20+2×10=20+20=40≤40? ?

可以看到,最優解不僅最大化了總利潤,而且滿足所有約束條件。這表明我們的線性規劃模型和求解過程是正確的,求解結果是合理的。

5. 擴展閱讀

5.1 擴展閱讀

線性規劃問題在實際中有很多應用,如物流運輸、生產計劃、資源分配等。除了SciPy,其他常用的優化庫還包括PuLP和Gurobi。

  • PuLP:PuLP是一個開源的線性規劃工具,可以與各種求解器結合使用。它提供了簡單易用的接口,適合用于教學和簡單的優化問題。
  • Gurobi:Gurobi是一款高效的商業優化軟件,支持求解線性規劃、整數規劃和其他優化問題。它具有強大的求解能力,適用于大規模和復雜的優化問題。

5.2 線性規劃的其他類型

  1. 多目標優化:多目標優化考慮多個目標函數同時進行優化。例如,一個工廠可能希望在最大化利潤的同時最小化污染物排放。多目標優化可以通過加權求和法或Pareto最優解來解決。

  2. 帶有等式約束的線性規劃:在約束條件中包含等式約束。例如,某些資源的使用量必須精確等于特定值。等式約束可以用于表示這些嚴格的資源限制或平衡條件。

  3. 混合整數線性規劃:決策變量不僅包括連續變量,還包括整數變量。例如,在生產計劃中,某些產品的生產數量必須為整數。混合整數線性規劃可以通過將部分決策變量定義為整數來解決這些問題。

代碼

import numpy as np
from scipy.optimize import linprog# 定義目標函數系數
# 我們希望最大化 30x1 + 20x2
# 在使用 linprog 時,我們需要將這個目標函數轉化為最小化問題
# 因此我們取負,變為最小化 -30x1 - 20x2
c = [-30, -20]# 定義不等式約束矩陣和向量
# 不等式約束如下:
# 2x1 + x2 <= 60
# x1 + 2x2 <= 40
# 轉化為矩陣形式 A @ x <= b
A = [[2, 1], [1, 2]]
b = [60, 40]# 定義變量的邊界
# x1 >= 0
# x2 >= 0
x_bounds = [(0, None), (0, None)]# 使用 linprog 函數求解線性規劃問題
res = linprog(c, A_ub=A, b_ub=b, bounds=x_bounds, method='highs')# 輸出結果
print('Optimal value:', round(res.fun * -1, ndigits=2))  # 恢復最大化問題的目標函數值
print('x:', res.x)# 結果解釋
# 最優目標函數值
optimal_value = round(res.fun * -1, ndigits=2)
# 最優解
optimal_solution = res.xprint(f"在滿足資源約束的情況下,最大化的總利潤為:{optimal_value} 美元")
print(f"每天生產 {optimal_solution[0]} 個單位的產品A 和 {optimal_solution[1]} 個單位的產品B")# 驗證結果是否滿足所有約束條件
# 資源1的使用情況
resource1_usage = 2 * optimal_solution[0] + optimal_solution[1]
# 資源2的使用情況
resource2_usage = optimal_solution[0] + 2 * optimal_solution[1]print(f"資源1的使用情況:{resource1_usage} 小時(<= 60 小時)")
print(f"資源2的使用情況:{resource2_usage} 小時(<= 40 小時)")# 驗證是否滿足所有約束條件
if resource1_usage <= 60 and resource2_usage <= 40:print("最優解滿足所有約束條件。")
else:print("最優解不滿足所有約束條件。")

結果

總結

? ? ?建立線性規劃模型,以解決生產優化問題。通過定義決策變量、目標函數和約束條件,使用Python的SciPy庫中的linprog函數求解模型,并驗證結果的合理性。最終,確定了在資源限制條件下最大化利潤的最優生產方案.

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/44705.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/44705.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/44705.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

淺談 Webpack5 模塊聯邦

概念 Webpack 模塊聯邦是一種先進的代碼共享技術&#xff0c;它允許在多個獨立構建的 Web 應用程序之間共享代碼&#xff0c;而無需將這些代碼提前發布到 npm 倉庫或其他中央存儲。 這項技術特別適用于微前端架構&#xff0c;因為它能讓各個前端團隊獨立開發、部署自己的應用…

政安晨:【Keras機器學習示例演繹】(五十二)—— 使用門控殘差和變量選擇網絡進行分類

目錄 簡介 數據集 安裝準備 數據準備 定義數據集元數據 創建用于訓練和評估的 tf.data.Dataset 創建模型輸入 對輸入特征進行編碼 實施門控線性單元 實施門控余留網絡 實施變量選擇網絡 創建門控殘差和變量選擇網絡模型 編譯、訓練和評估模型 政安晨的個人主頁&am…

OpenCV和PIL進行前景提取

摘要 在圖像處理和分析中&#xff0c;前景提取是一項關鍵技術&#xff0c;尤其是在計算機視覺和模式識別領域。本文介紹了一種結合OpenCV和PIL庫的方法&#xff0c;實現在批量處理圖像時有效提取前景并保留原始圖像的EXIF數據。具體步驟包括從指定文件夾中讀取圖像&#xff0c…

【鏈表】- 環形鏈表 II

1. 對應力扣題目連接 環形鏈表 II 2. 實現思路 a. 鏈表圖示&#xff1a; b. 檢測鏈表中是否存在環&#xff0c;即&#xff1a;會相交 思路&#xff1a; 使用 Floyd 的龜兔賽跑算法&#xff08;Floyd’s Tortoise and Hare algorithm&#xff09;&#xff0c;即快慢指針法&…

二分法求函數的零點 信友隊

題目ID&#xff1a;15713 必做題 100分 時間限制: 1000ms 空間限制: 65536kB 題目描述 有函數&#xff1a;f(x) 已知f(1.5) > 0&#xff0c;f(2.4) < 0 且方程 f(x) 0 在區間 [1.5,2.4] 有且只有一個根&#xff0c;請用二分法求出該根。 輸入格式 &#xff08;無…

Mysql查詢近半年每個月有多少天

Mysql 查詢近6個月每個月有多少天&#xff1a; SELECT DATE_FORMAT(DATE_ADD(NOW(),INTERVAL-(CAST( help_topic_id AS SIGNED INTEGER )) MONTH ), %Y-%m) as months,DAY(LAST_DAY(CONCAT(DATE_FORMAT(DATE_ADD(NOW(),INTERVAL-(CAST( help_topic_id AS SIGNED INTEGER )) MO…

【區塊鏈+跨境服務】跨境出口電商溯源 | FISCO BCOS應用案例

當前跨境出口電商已成為帶動我國外貿發展的中堅力量&#xff0c;尤其疫情特殊時期&#xff0c;成為推動經濟增長的一個重要組成 部分。但是跨境出口電商流程長、環節多&#xff0c;且需輾轉于不同的服務商以及國家之間&#xff0c;監管與定位也相對困難&#xff0c;容 易出現諸…

兩段序列幀動畫播放,在ios機型上出現閃屏

使用場景&#xff1a;兩段序列幀動畫連接播放&#xff0c;先播放第一段播一次&#xff0c;再播放第二段&#xff0c;第二段循環播放&#xff0c;在ios機型上出現動畫閃動&#xff0c;播放不正常。 錯誤的寫法&#xff1a;把每一段序列幀動畫單獨寫在了定義的動畫里 .gacha-bg…

開源軟件項目的發展趨勢與參與經驗

目錄 前言1. 開源項目的發展現狀1.1 開源項目的快速增長1.2 企業對開源項目的重視 2. 開源社區的活躍度2.1 開源社區的多樣性2.2 社區活動的豐富性 3. 開源項目在技術創新中的作用3.1 促進技術的快速迭代3.2 提供靈活的解決方案 4. 參與開源項目的經驗和收獲4.1 如何選擇開源項…

從0-1搭建一個web項目(頁面布局詳解)詳解

本章分析頁面布局詳解詳解 ObJack-Admin一款基于 Vue3.3、TypeScript、Vite3、Pinia、Element-Plus 開源的后臺管理框架。在一定程度上節省您的開發效率。另外本項目還封裝了一些常用組件、hooks、指令、動態路由、按鈕級別權限控制等功能。感興趣的小伙伴可以訪問源碼點個贊 地…

【系統架構設計師】九、軟件工程(軟件開發生命周期|McCabe度量法|系統轉換|系統維護|凈室軟件工程|基于構件的軟件工程)

目錄 九、軟件開發生命周期和工具 十、McCabe度量法 十一、系統轉換 11.1 遺留系統 11.2 系統轉換 11.3 系統維護 十二、凈室軟件工程 十三、基于構件的軟件工程 13.1 構件特征 13.2 構件模型要素 13.3 CBSE過程 13.4 構件組裝 相關推薦 歷年真題練習 九、軟件開…

DOM 基本操作 - 事件基礎

theme: smartblue 一、事件概述 JavaScript使我們有能力創建動態頁面&#xff0c;而事件是可以被JavaScript偵測到的行為。 簡單理解: 觸發---響應機制。 網頁中的每個元素都可以產生某些可以觸發JavaScript的事件&#xff0c;例如&#xff0c;我們可以在用戶點擊某按鈕時產生一…

libvirt qemu添加新類型磁盤格式

目錄 前言 1 qemu部分 1.1 磁盤格式驅動創建 1.2 json文件創建數據結構對象&#xff1a; 2 libvirt部分&#xff1a; 2.1 對應關系設置 2.2參設向指令格式轉換 前言 qemu中有很多虛擬機磁盤格式&#xff0c;比如較為熟悉的qcow2&#xff0c;luks&#xff0c;r…

C語言文件操作技術詳解

C語言提供了一套強大的文件操作API&#xff0c;允許開發者進行文件讀寫、訪問和管理。本文將深入探討C語言文件操作的背后的技術&#xff0c;包括基本文件操作、文件讀寫以及文件權限和屬性。我們將通過詳細的解釋和實用的代碼案例來展示如何有效地使用這些技術。 第一部分&am…

C++ //練習 14.52 在下面的加法表達式中分別選用了哪個operator+?列出候選函數、可行函數及為每個可行函數的實參執行的類型轉換:

C Primer&#xff08;第5版&#xff09; 練習 14.52 練習 14.52 在下面的加法表達式中分別選用了哪個operator&#xff1f;列出候選函數、可行函數及為每個可行函數的實參執行的類型轉換&#xff1a; struct LongDouble{//用于演示的成員opeartor&#xff1b;在通常情況下是個…

自動駕駛技術的原理

自動駕駛汽車利用視覺識別功能來感知周圍環境并做出駕駛決策。以下是自動駕駛汽車如何利用視覺識別功能及其原理的詳細說明&#xff1a; ### 視覺識別在自動駕駛中的應用 1. **目標檢測&#xff08;Object Detection&#xff09;**&#xff1a;識別并定位道路上的其他車輛、行人…

【安全設備】EDR

一、什么是EDR EDR即集檢測、防御、運維功能于一體的主機安全及管理系統。EDR是一款集成了豐富的系統加固與防護、網絡加固與防護等功能的主機安全產品。 二、EDR的部署模式 EDR&#xff08;Endpoint Detection and Response&#xff0c;端點檢測和響應&#xff09;的部署方…

開源項目編譯harbor arm架構的包 —— 筑夢之路

GitHub - amy5200/harbor-arm64 先做個記錄&#xff0c;空了再驗證

矩陣分解及其在機器學習中的應用

陣分解是一種廣泛應用于數據挖掘和機器學習領域的技術&#xff0c;它通過將一個高維數據集分解為多個低維的數據集&#xff0c;以降低數據的復雜性、提高計算效率&#xff0c;并發現數據中的隱含結構。本文將詳細介紹矩陣分解的基本概念、主要方法及其在機器學習中的應用。 一、…

JWT總結

JWT&#xff08;JSON Web Tokens&#xff09;是一種用于在雙方之間安全傳輸信息的簡潔的、URL安全的令牌標準。以下是關于JWT的結構、作用、優點以及可能出現的問題的詳細解答&#xff1a; 一、JWT的結構 JWT的結構由三個部分組成&#xff0c;它們通過.&#xff08;點&#x…