運籌學練習Python精解——整數規劃

郝hai發表於2024-06-21

練習1

一汽車廠生產小、中、大三種型別的汽車,已知各型別每輛車對鋼材、勞動時間的需求,利潤以及每月工廠鋼材、勞動時間的現有量如下表所示,試製定月生產計劃,使工廠的利潤最大。進一步討論:由於各種條件限制,如果生產某一型別汽車,則至少要生產80輛,那麼最優的生產計劃應作何改變。

資源/利潤 小型汽車 中型汽車 大型汽車 現有量
鋼材 (噸) 1.5 3 5 600
勞動時間(小時) 280 250 400 60000
利潤 (萬元) 2 3 4

目標是最大化利潤,在滿足鋼材和勞動時間的約束條件下,決定每個月生產的小、中、大型汽車的數量。

1.1 不考慮如果生產某一型別汽車,則至少要生產80輛

  • 定義決策變數:
    \(x_1\) 表示生產小型車的數量;\(x_2\)表示生產中型車的數量;\(x_3\) 表示生產大型車的數量

  • 目標函式:
    最大化利潤 $Z = 2x_1 + 3x_2 + 4x_3 $

  • 約束條件:
    鋼材約束:$1.5x_1 + 3x_2 + 5x_3 \leq 600 $
    勞動時間約束:$280x_1 + 250x_2 + 400x_3 \leq 60000 $

  • 非負性約束:
    $x_1, x_2, x_3 \geq 0 $


from pulp import LpMaximize, LpProblem, LpVariable, lpSum, value, LpInteger

# 定義問題
problem = LpProblem("Maximize Profit", LpMaximize)

# 定義變數
x1 = LpVariable("x1", lowBound=0, cat=LpInteger)
x2 = LpVariable("x2", lowBound=0, cat=LpInteger)
x3 = LpVariable("x3", lowBound=0, cat=LpInteger)

# 目標函式
problem += 2 * x1 + 3 * x2 + 4 * x3

# 約束條件
problem += 1.5 * x1 + 3 * x2 + 5 * x3 <= 600
problem += 280 * x1 + 250 * x2 + 400 * x3 <= 60000

# 求解問題
problem.solve()

# 列印結果
print('Optimal production plan:')
print(f'Small cars: {value(x1):.0f}')
print(f'Medium cars: {value(x2):.0f}')
print(f'Large cars: {value(x3):.0f}')
print(f'Maximum Profit: {value(problem.objective):.2f} 萬元')
Optimal production plan:
Small cars: 64
Medium cars: 168
Large cars: 0
Maximum Profit: 632.00 萬元

1.2 考慮如果生產某一型別汽車,則至少要生產80輛

  • 定義決策變數:需要新增3個0-1變數表示某一型別汽車是否生產
    \(y_1\) 表示是否生產小型車(0 或 1);$ y_2$ 表示是否生產中型車(0 或 1);\(y_3\) 表示是否生產大型車(0 或 1)

  • 若生產某種型別的汽車,則至少生產80輛:

\[x_1 \geq 80y_1$;$x_2 \geq 80y_2$;$x_3 \geq 80y_3 \]

  • \(y\) 變數的約束:

\[y_1, y_2, y_3 \in \{0, 1\} \]

from pulp import LpMaximize, LpProblem, LpVariable, lpSum, value

# 定義問題
problem = LpProblem("Maximize Profit", LpMaximize)

# 定義變數
x1 = LpVariable("x1", lowBound=0, cat='Integer')
x2 = LpVariable("x2", lowBound=0, cat='Integer')
x3 = LpVariable("x3", lowBound=0, cat='Integer')
y1 = LpVariable("y1", cat='Binary')
y2 = LpVariable("y2", cat='Binary')
y3 = LpVariable("y3", cat='Binary')

# 目標函式
problem += 2 * x1 + 3 * x2 + 4 * x3

# 約束條件
problem += 1.5 * x1 + 3 * x2 + 5 * x3 <= 600
problem += 280 * x1 + 250 * x2 + 400 * x3 <= 60000
problem += x1 >= 80 * y1
problem += x2 >= 80 * y2
problem += x3 >= 80 * y3

# 求解問題
problem.solve()

# 列印結果
print('Optimal production plan:')
print(f'Small cars: {value(x1):.0f}')
print(f'Medium cars: {value(x2):.0f}')
print(f'Large cars: {value(x3):.0f}')
print(f'Maximum Profit: {value(problem.objective):.2f} 萬元')
Optimal production plan:
Small cars: 64
Medium cars: 168
Large cars: 0
Maximum Profit: 632.00 萬元

練習2

固定成本問題:高壓容器公司製造小、中、大三種尺寸的金屬容器,所用資源為金屬板、勞動力和機器裝置,製造一個容器所需的各種資源數量如下表。不考慮固定費用,每種容器單位利潤分別為4萬元、5萬元、6萬元,可使用的金屬板500噸,勞動力300人/月,機器100臺/月,此外只要生產,需支付固定費用:小號是100萬元,中號為150萬元,大號為200萬元。試製定一個生產計劃,使獲利最大。

資源 小號容器 中號容器 大號容器
金屬板 (t) 2 4 8
勞動力 (人/月) 3 4 2
機器裝置 (臺/月) 1 0 1
  • 定義決策變數:
    \(x_1\)表示生產小號容器的數量;\(x_2\)表示生產中號容器的數量;\(x_3\) 表示生產大號容器的數量
    \(y_1\)表示是否生產小號容器(0 或 1);\(y_2\)表示是否生產中號容器(0 或 1);\(y_3\)表示是否生產大號容器(0 或 1)

  • 目標函式:
    最大化利潤$$Z = 4x_1 + 5x_2 + 6x_3 - 100y_1 - 150y_2 - 200y_3$$

  • 約束條件:
    金屬板約束:

\[2x_1 + 4x_2 + 8x_3 \leq 500 \]

勞動力約束:

\[3x_1 + 4x_2 + 2x_3 \leq 300 \]

機器裝置約束:

\[x_1 + x_3 \leq 100 \]

  • 若生產某種型別的容器,則至少支付固定費用:

\[x_1 \leq My_1;x_2 \leq My_2;x_3 \leq My_3 \]

其中\(M\)是一個足夠大的常數。

  • \(y\)變數的約束:

\[y_1, y_2, y_3 \in \{0, 1\} \]

  • 非負性約束:

\[x_1, x_2, x_3 \geq 0 \]

from pulp import LpMaximize, LpProblem, LpVariable, lpSum, value, LpInteger, LpBinary

# 定義問題
problem = LpProblem("Maximize Profit", LpMaximize)

# 定義變數
x1 = LpVariable("x1", lowBound=0, cat=LpInteger)
x2 = LpVariable("x2", lowBound=0, cat=LpInteger)
x3 = LpVariable("x3", lowBound=0, cat=LpInteger)
y1 = LpVariable("y1", cat=LpBinary)
y2 = LpVariable("y2", cat=LpBinary)
y3 = LpVariable("y3", cat=LpBinary)

# 目標函式
problem += 4 * x1 + 5 * x2 + 6 * x3 - 100 * y1 - 150 * y2 - 200 * y3

# 約束條件
problem += 2 * x1 + 4 * x2 + 8 * x3 <= 500
problem += 3 * x1 + 4 * x2 + 2 * x3 <= 300
problem += x1 + x3 <= 100

# 固定費用約束
M = 10000  # 這裡 M 取一個足夠大的常數
problem += x1 <= M * y1
problem += x2 <= M * y2
problem += x3 <= M * y3

# 求解問題
problem.solve()

# 列印結果
print('Optimal production plan:')
print(f'Small containers: {value(x1):.0f}')
print(f'Medium containers: {value(x2):.0f}')
print(f'Large containers: {value(x3):.0f}')
print(f'Maximum Profit: {value(problem.objective):.2f} 萬元')
Optimal production plan:
Small containers: 100
Medium containers: 0
Large containers: 0
Maximum Profit: 300.00 萬元

運籌說 第61期 | 整數規劃經典例題講解

相關文章