練習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輛:
- \(y\) 變數的約束:
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$$ -
約束條件:
金屬板約束:
勞動力約束:
機器裝置約束:
- 若生產某種型別的容器,則至少支付固定費用:
其中\(M\)是一個足夠大的常數。
- \(y\)變數的約束:
- 非負性約束:
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期 | 整數規劃經典例題講解