線性規劃(Linear Programming, LP)是一種數學最佳化方法,用於在給定約束條件下最大化或最小化目標函式。線性規劃廣泛應用於經濟、工程、管理等領域,透過建立數學模型,幫助決策者找到最優解決方案。
一、線性規劃數學模型
1.1 模型三要素
- 目標函式(Objective Function)
目標函式是線性規劃中需要最佳化的函式,通常表示為線性形式。目標函式可以是需最大化的利潤或最小化的成本。例如,在一個生產問題中,目標函式可以是某種商品的總利潤,需要透過調整生產量來最大化這個值。目標函式的一般形式為:
其中:\(Z\)是目標值;\(c_1, c_2, \ldots, c_n\)是目標函式的係數;\(x_1, x_2, \ldots, x_n\) 是決策變數。
- 約束條件(Constraints)
約束條件是限制決策變數取值範圍的線性不等式或等式。這些條件通常反映了資源的有限性、技術限制等。例如,在生產問題中,約束條件可能包括生產時間、原材料、資金等的限制。約束條件的一般形式為:
其中:\(a_{ij}\)是約束條件的係數;\(b_i\)是約束條件的右端常數;\(m\)是約束條件的數量。
- 非負性約束(Non-negativity Constraints)
在大多數實際問題中,決策變數通常需要非負,即每個變數必須大於或等於零。這反映了實際情況中物理量(如生產量、時間等)不能為負值。非負性約束的一般形式為:$$x_1 \geq 0, x_2 \geq 0, \ldots, x_n \geq 0$$
1.2 建模過程
問題描述:某公司生產兩種產品A和B,每生產一單位A可獲利3元,每生產一單位B可獲利5元。生產A需要2小時工作時間和1單位原材料,生產B需要1小時工作時間和2單位原材料。現公司有100小時工作時間和80單位原材料。問公司應如何安排生產才能使利潤最大化?
-
決策變數
- 設\(x_1\)為產品A的生產數量,
- 設\(x_2\)為產品B的生產數量。
-
目標函式
需要最大化利潤,目標函式為:
-
約束條件
- \(2x_1 + x_2 \leq 100\)(工作時間約束)
- \(x_1 + 2x_2 \leq 80\) (原材料約束)
-
可行性約束
- \(x_1 \geq 0, x_2 \geq 0\)
透過上述步驟,建立了一個完整的線性規劃數學模型。該模型可以透過圖解法、單純形法或其他最佳化演算法求解,從而找到最優生產方案。線性規劃不僅為決策者提供了一種系統化的決策工具,而且在資源最佳化配置方面具有重要意義。
1.3 圖解法
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import linprog
# 定義繪圖的範圍
x1 = np.linspace(0, 10, 400)
# 定義約束條件
y1 = 15 / 5
y2 = (24 - 6 * x1) / 2
y3 = 5 - x1
# 繪製可行域
plt.figure(figsize=(10, 8))
plt.plot(x1, y2, label=r'$6x_1 + 2x_2 \leq 24$')
plt.plot(x1, y3, label=r'$x_1 + x_2 \leq 5$')
plt.axhline(y=y1, color='r', linestyle='-', label=r'$5x_2 \leq 15$')
plt.xlim((0, 10))
plt.ylim((0, 10))
plt.xlabel(r'$x_1$')
plt.ylabel(r'$x_2$')
# 填充可行域
plt.fill_between(x1, 0, np.minimum(np.minimum(y1, y2), y3), where=(x1<=10), color='grey', alpha=0.5)
# 標記可行域
plt.legend()
# 求解線性規劃問題
c = [-2, -1] # 因為linprog求解的是最小化問題,所以目標函式取反
A = [[6, 2], [1, 1], [0, 5]]
b = [24, 5, 15]
# 使用linprog求解
res = linprog(c, A_ub=A, b_ub=b, bounds=(0, None), method='highs')
if res.success:
# 繪製目標函式的最優解點
plt.plot(res.x[0], res.x[1], 'ro', label='Optimal Solution')
plt.legend()
plt.show()
print(f"Optimal value: {res.fun * -1:.2f}") # 最大化目標函式的最優值
print(f"Optimal solution: x1 = {res.x[0]:.2f}, x2 = {res.x[1]:.2f}")
else:
print("No solution found")
二、建模示例
1.1 例1
某公司在計劃期內要安排生產A、B兩種產品(假設市場銷路很好)。生產單位產品的利潤以及所需的勞動力、裝置臺時以及原材料的消耗資料如下表所示。
產品 | A | B | |
---|---|---|---|
勞動力(工時) | 9 | 4 | 360 |
裝置(臺時) | 4 | 5 | 200 |
原材料(千克) | 3 | 10 | 300 |
單位產品利潤 | 70 | 120 |
-
決策變數
- 設\(x_1\)為產品A的生產數量
- 設\(x_2\)為產品B的生產數量
-
目標函式
最大化利潤,目標函式為:
- 約束條件
- 勞動力約束:\(9x_1 + 4x_2 \leq 360\)
- 裝置臺時約束:\(4x_1 + 5x_2 \leq 200\)
- 原材料約束:\(3x_1 + 10x_2 \leq 300\)
- 非負性約束:\(x_1 \geq 0, x_2 \geq 0\)
將上述內容整合,線性規劃的數學模型為:
這個數學模型可以透過圖解法或使用線性規劃求解器(如linprog)求解,從而找到最優的生產數量\(x_1\)和\(x_2\)以使得公司利潤最大化。
1.2 例2
每種蓅菜含有的營養素成份是不同的, 從醫學上知道每人每週對每種營養成分的最低需求量。某醫院營養室在制定下一週選單時, 需要確定表中所列六種荒菜的供應量, 以便使費用最小而又能滿足營養素等其它方面的要求。規定白菜的供應一週內不多於 20 kg , 其它蔬菜的供應在一週內不多於 40 kg , 每週共需供應 140 kg 蔬菜, 為了使費用最小又滿足營養素等其它方面的要求,問在下一週內應當供應每種疏菜各多少 kg ?
序號 | 蔬菜 | 鐵 | 磷 | 維生素A | 維生素C | 煙酸 | 每千克費用 |
---|---|---|---|---|---|---|---|
1 | 青豆 | 0.45 | 10 | 415 | 8 | 0.30 | 5 |
2 | 胡蘿蔔 | 0.45 | 28 | 9065 | 3 | 0.35 | 5 |
3 | 菜花 | 1.05 | 59 | 2550 | 53 | 0.60 | 8 |
4 | 白菜 | 0.40 | 25 | 75 | 27 | 0.15 | 2 |
5 | 甜菜 | 0.50 | 22 | 15 | 5 | 0.25 | 6 |
6 | 土豆 | 0.50 | 75 | 235 | 8 | 0.80 | 3 |
要求蔬菜提供的營養 | 鐵 | 磷 | 維生素A | 維生素C | 煙酸 | 備註 |
---|---|---|---|---|---|---|
要求值 | 6.00 | 25 | 17500 | 245 | 5.00 |
-
決策變數
設\(x_1, x_2, x_3, x_4, x_5, x_6\)分別為青豆、胡蘿蔔、菜花、白菜、甜菜、土豆的供應量(kg)。 -
目標函式
- 約束條件
滿足營養需求,每種蔬菜的供應量上限,以及總供應量。- 鐵的約束:
- 磷的約束:
- 維生素A的約束:
- 維生素C的約束:
- 煙酸的約束:
- 蔬菜供應量上限:
- 總供應量:
- 非負性約束:
- 數學模型
這個模型可以透過線性規劃求解器(如 linprog)來求解,從而找到最小費用的蔬菜供應方案。
參考資料
- 《運籌學》考研考點講義
- 《運籌學》知識點全總結