install.packages("lpSolve")
6 การโปรแกรมเชิงเส้น (Linear Programming (LP))
ในบทนี้จะเป็นการคำนวณเชิงตัวเลข 100% และเป็นปัญหาที่นักเศรษฐศาสตร์ทุกคนจะต้องทำความเข้าใจและเขียนการแก้ปัญหาเชิงเส้นเหล่านี้โดย ผู้เขียนจะใช้ชุดคำสั่งของภาษาอาร์ ในการหาคำตอบ
LP คือเทคนิคทางคณิตศาสตร์ สำหรับการหา “ค่าที่ดีที่สุด” (เช่น กำไรสูงสุด, ต้นทุนต่ำสุด)
โดยมีเงื่อนไขข้อจำกัด (constraints) ที่เป็น สมการเชิงเส้น หรือ อสมการเชิงเส้น
6.1 องค์ประกอบของ Linear Programming
6.2 รูปเมทริกซ์ของ Linear Programming (Matrix Form)
อธิบายสัญลักษณ์:
สัญลักษณ์ | ความหมาย |
---|---|
เวกเตอร์สัมประสิทธิ์ในฟังก์ชันวัตถุประสงค์ (ขนาด |
|
เวกเตอร์ตัวแปรตัดสินใจ (ขนาด |
|
เมทริกซ์สัมประสิทธิ์ข้อจำกัด (ขนาด |
|
เวกเตอร์ค่าข้อจำกัดฝั่งขวา (RHS) (ขนาด |
เราจะเขียนรูปของเมตริกซ์เสมอ เพื่อให้ง่ายต่อนำไปเขียนโปรแกรมเพื่อหาคำตอบด้วยชุดคำสั่ง
6.3 การหาคำตอบด้วยชุดคำสั่ง lpSolve
6.3.1 การติดตั้งและการเรียกใช้งานชุดคำสั่ง lpSolve
การติดตั้ง
การเรียกใช้งาน
library(lpSolve)
วิธีทำ แปลงเป็นเมทริกซ์
เวกเตอร์
เวกเตอร์ฝั่งขวา
การหาคำตอบด้วย lpSolve
:
# 0 เลือกใช้ชุดคำสั่ง loSolve
library(lpSolve)
# 1 กำหนดเวกเตอร์สัมประสิทธิ์ Coef
<- c(3, 5)
Coef # 2 เมตริกซ์ข้อจำกัด A
<- matrix(c(2, 1, 1, 3), nrow = 2, byrow = TRUE)
A # 3 เวคเตอร์ทิศทางข้อจำกัด
<- c("<=", "<=")
directions # 4 เมตริกซ์ b (ใช้เวคเตอร์ได้เลย)
<- c(100, 90)
b # 5 หาคำตอบ
<- lp( direction = "max", # min หรือ max
result objective.in = Coef, # เวกเตอร์สัมประสิทธิ์ Coef
const.mat = A, # เมตริกซ์ข้อจำกัด A
const.dir = directions, # เวคเตอร์ทิศทางข้อจำกัด
const.rhs = b) # เมตริกซ์ b
# ุ6 แสดงผลลัพธ์
$solution # ค่าตัวแปร x1 และ x2 ตามลำดับ result
[1] 42 16
$objval # ค่าสูงสุดของ Z result
[1] 206
6.4 ตัวอย่างประเภทปัญหาเศรษฐศาสตร์ที่ใช้ LP
Linear Programming ในเศรษฐศาสตร์ = ใช้ แก้ปัญหาการตัดสินใจอย่างมีข้อจำกัด
โดยมุ่งหา “การจัดสรรทรัพยากรอย่างเหมาะสมที่สุด” ภายใต้เงื่อนไขต่าง ๆ เช่น
เพิ่มกำไรสูงสุด
ลดต้นทุนต่ำสุด
ใช้ทรัพยากรจำกัดให้ได้ผลลัพธ์ดีที่สุด
6.4.1 การผลิต (Production)
วิธีทำ เขียนเป็นตารางสรุปได้ดังนี้
รายการ | สินค้า A | สินค้า B | สินค้า C |
---|---|---|---|
กำไรต่อหน่วย (บาท) | 6 | 8 | 5 |
การใช้วัตถุดิบ (หน่วย) | 2 | 1 | 1 |
การใช้แรงงาน (ชั่วโมง) | 1 | 3 | 2 |
การใช้เครื่องจักร (ชั่วโมง) | 2 | 2 | 1 |
ข้อจำกัดรวม |
ฟังก์ชันเชิงคณิตศาสตร์
ต้องเปลี่ยนเปลี่ยนชื่อเมตริกซ์ A เป็น
การหาคำตอบด้วย lpSolve
:
# 0 เลือกใช้ชุดคำสั่ง loSolve
library(lpSolve)
# 1 กำหนดเวกเตอร์สัมประสิทธิ์ Coef
<- c(6, 8, 5)
Coef # 2 เมตริกซ์ข้อจำกัด Pi
<- matrix(c(2, 1, 1,
Pi 1, 3, 2,
2, 2, 1), nrow = 3, byrow = TRUE)
# 3 เวคเตอร์ทิศทางข้อจำกัด
<- c("<=", "<=", "<=")
directions # 4 เมตริกซ์ b (ใช้เวคเตอร์ได้เลย)
<- c(100, 120, 150)
b # 5 หาคำตอบ
<- lp( direction = "max", # min หรือ max
result objective.in = Coef, # เวกเตอร์สัมประสิทธิ์ Coef
const.mat = Pi, # เมตริกซ์ข้อจำกัด A
const.dir = directions, # เวคเตอร์ทิศทางข้อจำกัด
const.rhs = b) # เมตริกซ์ b
# ุ6 แสดงผลลัพธ์
$solution # สินค้า A B และ C ตามลำดับ result
[1] 36 28 0
$objval # ค่าสูงสุดของ Z result
[1] 440
6.4.2 การลงทุน (Investment)
วิธีทำ ตารางสรุปข้อมูลการลงทุน
รายการ | โครงการ A | โครงการ B | โครงการ C |
---|---|---|---|
ผลตอบแทนต่อหน่วยลงทุน (%) | 12% | 10% | 15% |
ความเสี่ยงต่อหน่วย | 0.5 หน่วย | 0.8 หน่วย | 0.3 หน่วย |
ตารางสรุปเงื่อนไขข้อจำกัด
เงื่อนไข | ข้อมูล |
---|---|
เงินลงทุนรวม | ไม่เกิน 1,000 บาท |
ความเสี่ยงรวม | ไม่เกิน 500 หน่วย |
เงินลงทุนในโครงการ A | อย่างน้อย 100 บาท |
ฟังก์ชันเชิงคณิตศาสตร์
ต้องเปลี่ยนเปลี่ยนชื่อเมตริกซ์ A เป็น
การหาคำตอบด้วย lpSolve
:
# 0 เลือกใช้ชุดคำสั่ง loSolve
library(lpSolve)
# 1 กำหนดเวกเตอร์สัมประสิทธิ์ Coef
<- c(0.12, 0.10, 0.15)
Coef # 2 เมตริกซ์ข้อจำกัด Pi
<- matrix(c(1, 1, 1,
Pi 0.5, 0.8, 0.3,
-1, 0, 0), nrow = 3, byrow = TRUE)
# 3 เวคเตอร์ทิศทางข้อจำกัด
<- c("<=", "<=", "<=")
directions # 4 เมตริกซ์ b (ใช้เวคเตอร์ได้เลย)
<- c(1000, 500, -100)
b # 5 หาคำตอบ
<- lp( direction = "max", # min หรือ max
result objective.in = Coef, # เวกเตอร์สัมประสิทธิ์ Coef
const.mat = Pi, # เมตริกซ์ข้อจำกัด A
const.dir = directions, # เวคเตอร์ทิศทางข้อจำกัด
const.rhs = b) # เมตริกซ์ b
# ุ6 แสดงผลลัพธ์
$solution # โครงการ A B และ C ตามลำดับ result
[1] 100 0 900
$objval # ค่าสูงสุดของ Z result
[1] 147
6.4.3 การขนส่ง (Transportation)
วิธีทำ ส่งสินค้าจากคลัง A (300 หน่วย) และ B (400 หน่วย) ไปยังตลาด 1, 2, 3 ค่าขนส่งต่อหน่วย:
ตลาด 1 | ตลาด 2 | ตลาด 3 | |
---|---|---|---|
คลัง A | 2 | 4 | 5 |
คลัง B | 3 | 1 | 7 |
ความต้องการ:
ตลาด 1 ต้องการ 250
ตลาด 2 ต้องการ 200
ตลาด 3 ต้องการ 250
กำหนดให้
ฟังก์ชันเชิงคณิตศาสตร์
รูปแบบเมตริกซ์
เวกเตอร์
การหาคำตอบด้วย lpSolve
:
# 0 เลือกใช้ชุดคำสั่ง loSolve
library(lpSolve)
# 1 กำหนดเวกเตอร์สัมประสิทธิ์ Coef
<- c(2, 4, 5, 3, 1, 7)
Coef # 2 เมตริกซ์ข้อจำกัด Pi
<- matrix(c(1, 1, 1, 0, 0, 0,
Pi 0, 0, 0, 1, 1, 1,
1, 0, 0, 1, 0, 0,
0, 1, 0, 0, 1, 0,
0, 0, 1, 0, 0, 1), nrow = 5, byrow = TRUE)
# 3 เวคเตอร์ทิศทางข้อจำกัด
<- c("<=", "<=", "=", "=", "=")
directions # 4 เมตริกซ์ b (ใช้เวคเตอร์ได้เลย)
<- c(300, 400, 250, 200, 250)
b # 5 หาคำตอบ
<- lp( direction = "min", # min หรือ max
result objective.in = Coef, # เวกเตอร์สัมประสิทธิ์ Coef
const.mat = Pi, # เมตริกซ์ข้อจำกัด A
const.dir = directions, # เวคเตอร์ทิศทางข้อจำกัด
const.rhs = b) # เมตริกซ์ b
# ุ6 แสดงผลลัพธ์
$solution # x_A1, x_A2, x_A3, x_B1, x_B2, x_B3 result
[1] 50 0 250 200 200 0
$objval # ค่าต่ำสุดของ Z result
[1] 2150
6.4.4 การใช้ทรัพยากร (Resource Allocation) แรงงาน
วิธีทำ โรงงานมีแรงงาน 80 คน ต้องกระจายไปยังงาน A, B, และ C
รายได้ต่อหน่วยแรงงาน:
งาน A: 100 บาท
งาน B: 120 บาท
งาน C: 90 บาท
เงื่อนไข:
งาน A ต้องใช้ไม่น้อยกว่า 10 คน
งาน B ต้องใช้อย่างน้อย 20 คน
งาน C ต้องใช้คนไม่น้อยกว่างาน A
ฟังก์ชันเชิงคณิตศาสตร์
รูปแบบเมตริกซ์
การหาคำตอบด้วย lpSolve
:
# 0 เลือกใช้ชุดคำสั่ง loSolve
library(lpSolve)
# 1 กำหนดเวกเตอร์สัมประสิทธิ์ Coef
<- c(100, 120, 90)
Coef # 2 เมตริกซ์ข้อจำกัด A
<- matrix(c(1, 1, 1,
A -1, 0, 0,
0, -1, 0,
-1, 0, 1), nrow = 4, byrow = TRUE)
# 3 เวคเตอร์ทิศทางข้อจำกัด
<- c("=", "<=", "<=", "<=")
directions # 4 เมตริกซ์ b (ใช้เวคเตอร์ได้เลย)
<- c(80, -10, -20, 0)
b # 5 หาคำตอบ
<- lp( direction = "max", # min หรือ max
result objective.in = Coef, # เวกเตอร์สัมประสิทธิ์ Coef
const.mat = A, # เมตริกซ์ข้อจำกัด A
const.dir = directions, # เวคเตอร์ทิศทางข้อจำกัด
const.rhs = b) # เมตริกซ์ b
# ุ6 แสดงผลลัพธ์
$solution # x1, x2 x3 ตามลำดับ result
[1] 10 70 0
$objval # ค่าสูงสุดของ Z result
[1] 9400
6.4.5 การใช้ทรัพยากร (Resource Allocation) งบประมาณ
วิธีทำ บริษัทมีงบการตลาด 500,000 บาท ต้องแจกจ่ายให้กิจกรรมโฆษณา 3 ช่องทาง:
ทีวี (
ผลตอบแทน (ROI ต่อหน่วย): 0.15, 0.20, 0.10
ข้อจำกัด:
ทีวีลงทุนไม่เกิน 200,000
ออนไลน์อย่างน้อย 100,000
อีเวนต์ไม่เกิน 150,000
สามารถเขียนฟังก์ชันเชิงคณิตศาสตร์
การหาคำตอบด้วย lpSolve
:
# กำหนดให้แสดงผลลัพธ์เป็นตัวเลขไม่เกิน 999 ตำแหน่ง
options(scipen = 999)
# 0 เลือกใช้ชุดคำสั่ง loSolve
library(lpSolve)
# 1 กำหนดเวกเตอร์สัมประสิทธิ์ Coef
<- c(0.15, 0.20, 0.10)
Coef # 2 เมตริกซ์ข้อจำกัด A
<- matrix(c(1, 1, 1,
A 1, 0, 0,
0, -1, 0,
0, 0, 1), nrow = 4, byrow = TRUE)
# 3 เวคเตอร์ทิศทางข้อจำกัด
<- c("=","<=" ,"<=","<=")
directions # 4 เมตริกซ์ b (ใช้เวคเตอร์ได้เลย)
<- c(500000, 200000, -100000, 150000)
b # 5 หาคำตอบ
<- lp( direction = "max", # min หรือ max
result objective.in = Coef, # เวกเตอร์สัมประสิทธิ์ Coef
const.mat = A, # เมตริกซ์ข้อจำกัด A
const.dir = directions, # เวคเตอร์ทิศทางข้อจำกัด
const.rhs = b) # เมตริกซ์ b
# ุ6 แสดงผลลัพธ์
$solution # ค่าตัวแปร x1 x2 และ x3 ตามลำดับ result
[1] 0 500000 0
$objval # ค่าสูงสุดของ Z result
[1] 100000
6.5 แบบฝึกหัด Linear Programming
ข้อ 1: การผลิตสินค้า A และ B
A ใช้วัตถุดิบ 2 หน่วย, แรงงาน 3 ชม.
B ใช้วัตถุดิบ 3 หน่วย, แรงงาน 2 ชม.
จำกัด: วัตถุดิบไม่เกิน 60 หน่วย, แรงงานไม่เกิน 80 ชม.
กำไร: A = 40, B = 50
ข้อ 2: ร้านอาหารปรุงอาหาร X และ Y
X ใช้เวลา 4 ชม./หน่วย, Y = 3 ชม./หน่วย
เวลาทั้งหมดไม่เกิน 90 ชม.
รายได้: X = 200, Y = 150
ข้อ 3: การจัดงบโครงการ A และ B
A ใช้งบ 5,000 บาท, คะแนน 60
B ใช้งบ 8,000 บาท, คะแนน 100
งบทั้งหมดไม่เกิน 100,000 บาท
ข้อ 4: กิจกรรมโรงเรียน
A ใช้เวลาครู 2 ชม., B = 3 ชม.
ครูให้เวลากับนักเรียนไม่เกิน 50 ชม.
กิจกรรมรวมไม่เกิน 30 ครั้ง
ข้อ 5: การใช้พื้นที่คลังสินค้า
P ใช้ 5 ตร.ม., Q = 8 ตร.ม.
ใช้พื้นที่ไม่เกิน 100 ตร.ม.
กำไร: P = 30, Q = 40
ข้อ 6: โรงงานน้ำดื่มบรรจุขวด
ขวดเล็ก: น้ำ 0.6 ลิตร, เวลา 2 นาที
ขวดใหญ่: น้ำ 1.5 ลิตร, เวลา 3 นาที
มีน้ำ 300 ลิตร, เวลา 600 นาที
กำไร: เล็ก = 8 บาท, ใหญ่ = 15 บาท
ข้อ 7: การจัดโฆษณาสื่อ
สื่อ A ใช้ 2 ชม./สัปดาห์, สื่อ B = 3 ชม.
เวลาทั้งหมดไม่เกิน 40 ชม.
สื่อ A เข้าถึงคน 500 คน, B = 700 คน
ข้อ 8: การจัดคนในงานนิทรรศการ
แผนก A ใช้พื้นที่ 10 ตร.ม., B = 15 ตร.ม.
พื้นที่ไม่เกิน 200 ตร.ม.
A ได้ความพึงพอใจ 40, B = 60
ข้อ 9: การจัดคาบเรียน
คาบบรรยาย: 2 ชม./คาบ
คาบปฏิบัติ: 3 ชม./คาบ
มีเวลาเรียนรวมไม่เกิน 60 ชม.
คาบบรรยายได้ประโยชน์ 5 หน่วย, ปฏิบัติ = 8 หน่วย
ข้อ 10: การผลิตเก้าอี้และโต๊ะ
เก้าอี้ใช้ไม้ 3 หน่วย, โต๊ะ = 5 หน่วย
ไม้มีรวม 150 หน่วย
กำไร: เก้าอี้ = 30, โต๊ะ = 50
ข้อ 11: โรงงานผลิตขนม
ขนม A ใช้เวลา 2 ชม., B = 3 ชม.
เวลาไม่เกิน 120 ชม.
รายได้: A = 10, B = 15
ข้อ 12: บริษัทให้บริการ A และ B
A ใช้พนักงาน 1 คน, B = 2 คน
มีพนักงาน 100 คน
รายได้ต่อบริการ: A = 400, B = 700
ข้อ 13: การวางแผนคลังสินค้า
A ใช้ที่เก็บ 4 หน่วย, B = 6 หน่วย
พื้นที่ไม่เกิน 180 หน่วย
กำไร: A = 20, B = 25
ข้อ 14: กิจกรรมสันทนาการ
กีฬา: ใช้ 3 ชม./กิจกรรม
ศิลปะ: ใช้ 2 ชม./กิจกรรม
เวลาไม่เกิน 90 ชม.
คะแนน: กีฬา = 10, ศิลปะ = 8
ข้อ 15: การผลิตหมวกและเสื้อ
หมวก: ผ้า 1 หน่วย, เสื้อ = 3 หน่วย
ผ้ามี 90 หน่วย
กำไร: หมวก = 25, เสื้อ = 40
ข้อ 16: การจัดพนักงานเข้าเวร
เวรกลางวัน: ใช้ 5 คน, กลางคืน = 3 คน
มีพนักงาน 60 คน
กลางวันให้ productivity 100, กลางคืน = 80
ข้อ 17: การเลือกลงทุน A และ B
A ต้องลงทุน 10,000, B = 15,000
ทุนรวมไม่เกิน 200,000
ผลตอบแทน: A = 1.2x, B = 1.5x
ข้อ 18: การใช้เวลาฝึกอบรม
หลักสูตร A = 4 ชม., B = 6 ชม.
เวลาไม่เกิน 240 ชม.
คะแนนทักษะ: A = 60, B = 90
ข้อ 19: โรงงานผลิตปูนซีเมนต์
A ใช้หิน 3 หน่วย, B = 2 หน่วย
หินไม่เกิน 300 หน่วย
รายได้: A = 50, B = 35
ข้อ 20: การจัดกิจกรรมอบรมครู
ครูสอนเนื้อหาใช้เวลา 2 ชม., สอนเทคนิค = 4 ชม.
เวลาครูรวมไม่เกิน 100 ชม.
คะแนน: เนื้อหา = 30, เทคนิค = 50