วันเสาร์ที่ 28 พฤศจิกายน พ.ศ. 2558

การใช้ R วิเคราะห์ Linear Programming (How to do Linear Programming in R)

     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


1 ความคิดเห็น: