Julia求解混合整數規劃(Either/or 約束條件)
文章目錄
問題描述
某公司的研發部門一直在開發四條可能的新產品線。管理層現在必須做出決定,確定這四種產品中的哪一種將實際生產,以及生產的水平。因此,一個運籌學研究已經被要求找到最有利可圖的產品組合。
如下表第一行所示,開始生產任何產品時,都會產生大量成本。管理層的目標是找到使總利潤(總淨收入減去啟動成本)最大化的產品組合。
設連續決策變數
x
1
x_{1}
x1,
x
2
x_{2}
x2,
x
3
x_{3}
- 最多隻能生產兩種產品。
- 只有生產產品1或2,才能生產產品3或4。
- 要麼 5 x 1 + 3 x 2 + 6 x 3 + 4 x 4 ≤ 6000 5 x_{1}+3 x_{2}+6 x_{3}+4 x_{4} \leq 6000 5x1+3x2+6x3+4x4≤6000,要麼 4 x 1 + 6 x 2 + 3 x 3 + 5 x 4 ≤ 6000 4 x_{1}+6 x_{2}+3 x_{3}+5 x_{4} \leq 6000 4x1+6x2+3x3+5x4≤6000。
建模過程
引數設定
y
1
y_{1}
y
i
=
{
1
if
x
i
>
0
0
if
x
i
=
0
(
i
=
1
,
2
,
3
,
4
)
z
=
{
1
if
5
x
1
+
⋯
+
4
x
4
>
6000
0
if
4
x
1
+
⋯
+
5
x
4
>
6000
y_{i}=\left\{\begin{array}{ll} 1 & \text { if } x_{i}>0 \\ 0 & \text { if } x_{i}=0 \end{array}(i=1,2,3,4)\right. z=\left\{\begin{array}{ll} 1 & \text { if } 5 x_{1}+\cdots+4 x_{4}>6000 \\ 0 & \text { if } 4 x_{1}+\cdots+5 x_{4}>6000 \end{array}\right.
優化問題
Maximize 70 x 1 − 50000 y 1 + 60 x 2 − 40000 y 2 + 90 x 3 − 70000 y 3 + 80 x 4 − 60000 y 4 subjectto y 1 + y 2 + y 3 + y 4 ≤ 2 y 3 ≤ y 1 + y 2 y 4 ≤ y 1 + y 2 5 x 1 + 3 x 2 + 6 x 3 + 4 x 4 ≤ 6000 + M × z 4 x 1 + 6 x 2 + 3 x 3 + 5 x 4 ≤ 6000 + M × ( 1 − z ) 0 ≤ x i ≤ M × y i , i = 1 , 2 , 3 , 4 z , y i binary, i = 1 , 2 , 3 , 4 M isbigenough \begin{aligned} &\begin{array}{ll} \text { Maximize } & 70 x_{1}-50000 y_{1}+60 x_{2}-40000 y_{2}+90 x_{3}-70000 y_{3}+80 x_{4}-60000 y_{4} \\ \text { subject to } & y_{1}+y_{2}+y_{3}+y_{4} \leq 2 \\ & y_{3} \leq y_{1}+y_{2} \\ & y_{4} \leq y_{1}+y_{2} \\ & 5 x_{1}+3 x_{2}+6 x_{3}+4 x_{4} \leq 6000+M \times z \\ & 4 x_{1}+6 x_{2}+3 x_{3}+5 x_{4} \leq 6000+M \times(1-z) \\ & 0 \leq x_{i} \leq M \times y_{i}, i=1,2,3,4 \\ & z, y_{i} \text { binary, } i=1,2,3,4 \end{array}\\ &M \text { is big enough } \end{aligned} Maximizesubjectto70x1−50000y1+60x2−40000y2+90x3−70000y3+80x4−60000y4y1+y2+y3+y4≤2y3≤y1+y2y4≤y1+y25x1+3x2+6x3+4x4≤6000+M×z4x1+6x2+3x3+5x4≤6000+M×(1−z)0≤xi≤M×yi,i=1,2,3,4z,yibinary,i=1,2,3,4Misbigenough
Julia程式碼求解MILP
Julia安裝
- 從Julia官網https://julialang.org/
- 配置Jupyter notebook
- 在終端執行“jupyter noyebook”
- 在終端開啟julia,執行命令
import Pkg
Pkg.add("IJulia")
- 再次開啟Jupyter notebook即可使用Julia
Julia程式碼求解MILP
import Pkg
Pkg.add("JuMP")
using JuMP # Define your model
using Cbc # Solve MIP problems
m = Model(solver=CbcSolver())
M = 100000 # Large number M
@variable(m, x1>=0)
@variable(m, x2>=0)
@variable(m, x3>=0)
@variable(m, x4>=0)
@variable(m, y1, Bin)
@variable(m, y2, Bin)
@variable(m, y3, Bin)
@variable(m, y4, Bin)
@variable(m, z, Bin)
@constraint(m, y1+y2+y3+y4<=2)
@constraint(m, y3<=y1+y2)
@constraint(m, y4<=y1+y2)
@constraint(m, x1<=M*y1)
@constraint(m, x2<=M*y2)
@constraint(m, x3<=M*y3)
@constraint(m, x4<=M*y4)
@constraint(m, 5x1+3x2+6x3+4x4<=6000 + M*z)
@constraint(m, 4x1+6x2+3x3+5x4<=6000 + M*(1-z))
@objective(m, Max, 70x1-50000y1+60x2-40000y2+90x3-70000y3+80x4-60000y4)
print(m)
solve(m)
getValue(x1)
getValue(x2)
getValue(x3)
getValue(x4)
getObjectiveValue(m)
結果解釋
只新開第二條生產線,收益為 80 , 000 80,000 80,000美金
參考資料:
武漢大學經濟與管理學院數理經濟與數理金融系《運籌學》課程資料:《Solution Manual of Operations Research》,授課教授為李曉蹊教授。