1. 程式人生 > 其它 >Julia求解混合整數規劃(Either/or 約束條件)

Julia求解混合整數規劃(Either/or 約束條件)

技術標籤:運籌學建模方法數學建模線性規劃程式語言

文章目錄

問題描述

某公司的研發部門一直在開發四條可能的新產品線。管理層現在必須做出決定,確定這四種產品中的哪一種將實際生產,以及生產的水平。因此,一個運籌學研究已經被要求找到最有利可圖的產品組合。
如下表第一行所示,開始生產任何產品時,都會產生大量成本。管理層的目標是找到使總利潤(總淨收入減去啟動成本)最大化的產品組合。
在這裡插入圖片描述
設連續決策變數 x 1 x_{1} x1, x 2 x_{2} x2, x 3 x_{3}

x3, x 4 x_{4} x4 分別為產品1、2、3、4的生產水平。管理層對這些變數施加了以下政策限制:

  1. 最多隻能生產兩種產品。
  2. 只有生產產品1或2,才能生產產品3或4。
  3. 要麼 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+4x46000,要麼 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+5x46000

建模過程

引數設定

y 1 y_{1}

y1, y 2 y_{2} y2, y 3 y_{3} y3, y 4 y_{4} y4 分別為是否開發該產品線; x 1 x_{1} x1, x 2 x_{2} x2, x 3 x_{3} x3, x 4 x_{4} x4 分別為產品1、2、3、4的生產水平; M M M為非常大的整數。
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.
yi={10ifxi>0ifxi=0(i=1,2,3,4)z={10if5x1++4x4>6000if4x1++5x4>6000

優化問題

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} Maximizesubjectto70x150000y1+60x240000y2+90x370000y3+80x460000y4y1+y2+y3+y42y3y1+y2y4y1+y25x1+3x2+6x3+4x46000+M×z4x1+6x2+3x3+5x46000+M×(1z)0xiM×yi,i=1,2,3,4z,yibinary,i=1,2,3,4Misbigenough

Julia程式碼求解MILP

Julia安裝

  1. 從Julia官網https://julialang.org/
  2. 配置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》,授課教授為李曉蹊教授。