Linear programming เป็นเทคนิคในการคำนวณที่ใช้กันในหลากหลายสาขา ในโพสต์นี้ผมจะนำเสนอการใช้โปรแกรม R ในการวิเคราะห์ Linear Programming
จากตัวอย่างโจทย์ ซึ่งให้ค่าคุณค่าทางโภชนาการ (g/unit) และต้นทุนของส่วนประกอบอาหาร 6 ชนิด และต้องการหาสูตรอาหารที่มีต้นทุนต่ำสุดที่ให้พลังงานอย่างน้อย 300 kcal โปรตีนไม่เกิน 10 กรัม คาร์โบไฮเดรตไม่ต่ำกว่า 10 กรัม ไขมันไม่ต่ำกว่า 8 กรัม นอกจากนี้อาหารที่ได้จะต้องมีปลาอย่างน้อย 0.5 หน่วย และมีนมไม่เกิน 1 หน่วย
นั่นคือ
minimize
C = 2.0(bread) + 3.5(milk) + 8.0(cheese) + 1.5(potato) + 11.0(fish) + 1.0(yogurt)
subject to:
90(bread) + 120(milk) + 106(cheese) + 97(potato) + 130(fish) + 180(yogurt) >= 300
4.0(bread) + 8.0(milk) + 7.0(cheese) + 1.3(potato) + 8.0(fish) + 9.2(yogurt) <= 10
15.0(bread) + 11.7(milk) + 0.4(cheese) + 22.6(potato) + 0.0(fish) + 17.0(yogurt) >= 10
1.0(bread) + 5.0(milk) + 9.0(cheese) + 0.1(potato) + 7.0(fish) + 1.0(yogurt) >=8
fish >= 0.5
milk <= 1
bread >= 0
cheese >=0
potato >=0
yogurt >= 0
เราจะใช้แพกเกจที่ชื่อ lpSolveAPI ในการแก้โจทย์นี้
บน R console
> install.packages("lpSolveAPI") #ติดตั้งแพกเกจ
> library(lpSolveAPI) # เรียกแพกเกจ
> lprec <- make.lp(0,6) # สร้าง object สำหรับ lp model
> lprec # ลองดู object
Model name:
C1 C2 C3 C4 C5 C6
Minimize 0 0 0 0 0 0
Kind Std Std Std Std Std Std
Type Real Real Real Real Real Real
Upper Inf Inf Inf Inf Inf Inf
Lower 0 0 0 0 0 0
# กำหนด objective function
> set.objfn(lprec,c(2.0,3.5,8.0,1.5,11.0,1.0))
# กำหนด constraint function
> add.constraint(lprec,c(90,120,106,97,130,180),">=",300)
> add.constraint(lprec,c(4,8,7,1.3,8,9.2),"<=",10)
> add.constraint(lprec,c(15,11.7,0.4,22.6,0,17),">=",10)
> add.constraint(lprec,c(1,5,9,0.1,7,1),">=",8)
# ดู object
> lprec
Model name:
C1 C2 C3 C4 C5 C6
Minimize 2 3.5 8 1.5 11 1
R1 90 120 106 97 130 180 >= 300
R2 4 8 7 1.3 8 9.2 <= 10
R3 15 11.7 0.4 22.6 0 17 >= 10
R4 1 5 9 0.1 7 1 >= 8
Kind Std Std Std Std Std Std
Type Real Real Real Real Real Real
Upper Inf Inf Inf Inf Inf Inf
Lower 0 0 0 0 0 0
# กำหนดขอบเขตของแต่ละตัวแปร (ปริมาณสูงสุด ต่ำสุด)
> set.bounds(lprec,lower=c(0.5),columns=c(5))
> set.bounds(lprec,upper=c(1),columns=c(2))
# ดู object
> lprec
Model name:
C1 C2 C3 C4 C5 C6
Minimize 2 3.5 8 1.5 11 1
R1 90 120 106 97 130 180 >= 300
R2 4 8 7 1.3 8 9.2 <= 10
R3 15 11.7 0.4 22.6 0 17 >= 10
R4 1 5 9 0.1 7 1 >= 8
Kind Std Std Std Std Std Std
Type Real Real Real Real Real Real
Upper Inf 1 Inf Inf Inf Inf
Lower 0 0 0 0 0.5 0
#ใส่ชื่อแถวและคอลัมน์ (ไม่จำเป็น แต่เพื่อให้อ่านเข้าใจ)
> RowNames <-c("Cal","Protein","Carb","Fat")
> ColNames <-c("Bread","Milk","Cheese","Potato","Fish","Yogurt")
> dimnames(lprec)<-list(RowNames,ColNames)
> lprec
Model name:
Bread Milk Cheese Potato Fish Yogurt
Minimize 2 3.5 8 1.5 11 1
Cal 90 120 106 97 130 180 >= 300
Protein 4 8 7 1.3 8 9.2 <= 10
Carb 15 11.7 0.4 22.6 0 17 >= 10
Fat 1 5 9 0.1 7 1 >= 8
Kind Std Std Std Std Std Std
Type Real Real Real Real Real Real
Upper Inf 1 Inf Inf Inf Inf
Lower 0 0 0 0 0.5 0
# solve ฟังก์ชั่น
> solve(lprec)
[1] 0
> get.objective(lprec) #ค่าเป้าหมายที่ได้ (ต้นทุน)
[1] 12.08134
> get.variables(lprec) #ค่าของตัวแปร (น้ำหนักของแต่ละส่วนผสม)
[1] 0.00000000 0.05359877 0.44949882 1.86516776 0.50000000 0.00000000
> get.constraints(lprec) # ค่าเป้าหมายของแต่ละ constraint
[1] 300.0000 10.0000 42.9597 8.0000
จะเห็นได้ว่าได้ค่าตรงกันกับค่าที่คำนวณด้วย SAS
It's a good idea to share knowledge to society.
ตอบลบCheer!