線性規劃模型複習總結

郝hai發表於2024-07-15

線性規劃(Linear Programming, LP)是一種數學最佳化方法,用於在給定約束條件下最大化或最小化目標函式。線性規劃廣泛應用於經濟、工程、管理等領域,透過建立數學模型,幫助決策者找到最優解決方案。

一、線性規劃數學模型

1.1 模型三要素

  • 目標函式(Objective Function)
    目標函式是線性規劃中需要最佳化的函式,通常表示為線性形式。目標函式可以是需最大化的利潤或最小化的成本。例如,在一個生產問題中,目標函式可以是某種商品的總利潤,需要透過調整生產量來最大化這個值。目標函式的一般形式為:

\[Z = c_1 x_1 + c_2 x_2 + \cdots + c_n x_n \]

其中:\(Z\)是目標值;\(c_1, c_2, \ldots, c_n\)是目標函式的係數;\(x_1, x_2, \ldots, x_n\) 是決策變數。

  • 約束條件(Constraints)
    約束條件是限制決策變數取值範圍的線性不等式或等式。這些條件通常反映了資源的有限性、技術限制等。例如,在生產問題中,約束條件可能包括生產時間、原材料、資金等的限制。約束條件的一般形式為:

\[\begin{align*} a_{11} x_1 + a_{12} x_2 + \cdots + a_{1n} x_n &\leq b_1 \\ a_{21} x_1 + a_{22} x_2 + \cdots + a_{2n} x_n &\leq b_2 \\ \vdots \quad \quad &\ddots \\ a_{m1} x_1 + a_{m2} x_2 + \cdots + a_{mn} x_n &\leq b_m \\ \end{align*} \]

其中:\(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的生產數量。
  • 目標函式
    需要最大化利潤,目標函式為:

\[\text{Maximize } Z = 3x_1 + 5x_2 \]

  • 約束條件

    • \(2x_1 + x_2 \leq 100\)(工作時間約束)
    • \(x_1 + 2x_2 \leq 80\) (原材料約束)
  • 可行性約束

    • \(x_1 \geq 0, x_2 \geq 0\)

透過上述步驟,建立了一個完整的線性規劃數學模型。該模型可以透過圖解法、單純形法或其他最佳化演算法求解,從而找到最優生產方案。線性規劃不僅為決策者提供了一種系統化的決策工具,而且在資源最佳化配置方面具有重要意義。

1.3 圖解法

\[\begin{align*} \max \quad & z = 2x_1 + 2x_2 \\ \text{s.t.} \quad & 5x_1 + 2x_2 \leq 15 \\ & 6x_1 + 2x_2 \leq 24 \\ & x_1 + x_2 \leq 5 \\ & x_1, x_2 \geq 0 \end{align*}\]

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的生產數量
  • 目標函式
    最大化利潤,目標函式為:

\[\text{Maximize } Z = 70x_1 + 120x_2 \]

  • 約束條件
    • 勞動力約束:\(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\)

將上述內容整合,線性規劃的數學模型為:

\[ \text{Maximize } Z = 70x_1 + 120x_2 \] \[ \text{subject to} \] \[ 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)。

  • 目標函式

\[\text{Minimize } Z = 5x_1 + 5x_2 + 8x_3 + 2x_4 + 6x_5 + 3x_6 \]

  • 約束條件
    滿足營養需求,每種蔬菜的供應量上限,以及總供應量。
    • 鐵的約束:

\[0.45x_1 + 0.45x_2 + 1.05x_3 + 0.40x_4 + 0.50x_5 + 0.50x_6 \geq 6.00 \]

  • 磷的約束:

\[10x_1 + 28x_2 + 59x_3 + 25x_4 + 22x_5 + 75x_6 \geq 25 \]

  • 維生素A的約束:

\[415x_1 + 9065x_2 + 2550x_3 + 75x_4 + 15x_5 + 235x_6 \geq 17500 \]

  • 維生素C的約束:

\[8x_1 + 3x_2 + 53x_3 + 27x_4 + 5x_5 + 8x_6 \geq 245 \]

  • 煙酸的約束:

\[0.30x_1 + 0.35x_2 + 0.60x_3 + 0.15x_4 + 0.25x_5 + 0.80x_6 \geq 5 \]

  • 蔬菜供應量上限:

\[x_4 \leq 20 \quad x_1, x_2, x_3, x_5, x_6 \leq 40 \]

  • 總供應量:

\[x_1 + x_2 + x_3 + x_4 + x_5 + x_6 = 140 \]

  • 非負性約束:

\[x_1, x_2, x_3, x_4, x_5, x_6 \geq 0 \]

  • 數學模型

\[\begin{align*} \text{Minimize } Z = & 5x_1 + 5x_2 + 8x_3 + 2x_4 + 6x_5 + 3x_6 \\ \text{subject to } & \\ & 0.45x_1 + 0.45x_2 + 1.05x_3 + 0.40x_4 + 0.50x_5 + 0.50x_6 \geq 6.00 \\ & 10x_1 + 28x_2 + 59x_3 + 25x_4 + 22x_5 + 75x_6 \geq 25 \\ & 415x_1 + 9065x_2 + 2550x_3 + 75x_4 + 15x_5 + 235x_6 \geq 17500 \\ & 8x_1 + 3x_2 + 53x_3 + 27x_4 + 5x_5 + 8x_6 \geq 245 \\ & 0.30x_1 + 0.35x_2 + 0.60x_3 + 0.15x_4 + 0.25x_5 + 0.80x_6 \geq 5 \\ & x_4 \leq 20 \\ & x_1, x_2, x_3, x_5, x_6 \leq 40 \\ & x_1 + x_2 + x_3 + x_4 + x_5 + x_6 = 140 \\ & x_1, x_2, x_3, x_4, x_5, x_6 \geq 0 \end{align*}\]

這個模型可以透過線性規劃求解器(如 linprog)來求解,從而找到最小費用的蔬菜供應方案。

參考資料

  1. 《運籌學》考研考點講義
  2. 《運籌學》知識點全總結

相關文章