install.packages("lpSolve")
6 การโปรแกรมเชิงเส้น (Linear Programming, LP)
4 พฤษภาคม 2568
ในบทนี้จะเป็นการคำนวณเชิงตัวเลข 100% และเป็นปัญหาที่นักเศรษฐศาสตร์ทุกคนจะต้องทำความเข้าใจและเขียนการแก้ปัญหาเชิงเส้นเหล่านี้โดย ผู้เขียนจะใช้ชุดคำสั่งของภาษาอาร์ ในการหาคำตอบ
LP คือเทคนิคทางคณิตศาสตร์ สำหรับการหา “ค่าที่ดีที่สุด” (เช่น กำไรสูงสุด, ต้นทุนต่ำสุด)
โดยมีเงื่อนไขข้อจำกัด (constraints) ที่เป็น สมการเชิงเส้น หรือ อสมการเชิงเส้น
6.1 องค์ประกอบของ Linear Programming
เป้าหมาย คือ minimize ฟังก์ชันเชิงเส้น
รูปทั่วไป: \[ \min { หรือ }\max\quad Z = c_1x_1 + c_2x_2 + \cdots + c_nx_n \] โดยที่
\(Z\) คือฟังก์ชันวัตถุประสงค์
\(c_1, c_2, \ldots, c_n\) คือสัมประสิทธิ์ (เช่น กำไรต่อหน่วย, ต้นทุนต่อหน่วย)
\(x_1, x_2, \ldots, x_n\) คือ ตัวแปรตัดสินใจ (Decision Variables)
เป็น สมการเชิงเส้น หรือ อสมการเชิงเส้น
โดยมีรูปทั่วไป: \[\begin{aligned}
a_{11}x_1 + a_{12}x_2 + \cdots + a_{1n}x_n &~(\leq,=,\geq)~ b_1\\
a_{21}x_1 + a_{22}x_2 + \cdots + a_{2n}x_n &~(\leq,=,\geq)~ b_2\\
\vdots\\
a_{m1}x_1 + a_{m2}x_2 + \cdots + a_{mn}x_n &~(\leq,=,\geq)~ b_m\\
\end{aligned}\] โดยที่
\(a_{ij}\) คือสัมประสิทธิ์ข้อจำกัด
\(b_i\) คือค่าคงที่ในข้อจำกัด
\(m\) คือจำนวนข้อจำกัด
สมการข้อจำกัด จะมีเครื่องหมาย \(\leq\) น้อยกว่าหรือเท่ากับ \(=\) เท่ากับ หรือ \(\geq\) มากกว่าเท่ากับก็ได้
ตัวแปรต้องเป็นค่าบวกหรือศูนย์:
\[ x_1 \geq 0, \quad x_2 \geq 0, \quad \ldots, \quad x_n \geq 0 \]
เพราะ ในความจริง เช่น จำนวนสินค้าผลิตได้ไม่เป็นลบ เป็นต้น
6.2 รูปเมทริกซ์ของ Linear Programming (Matrix Form)
รูปทั่วไปของ LP ใน Matrix Form \[\text{Maximize (or Minimize)} \quad Z = \mathbf{c}^T \mathbf{x}\]
อสมการข้อจำกัด: \[ \mathbf{A} \mathbf{x} \leq \mathbf{b} \] และ \(\mathbf{x} \geq 0\)
อธิบายสัญลักษณ์:
สัญลักษณ์ | ความหมาย |
---|---|
\(\mathbf{c}\) | เวกเตอร์สัมประสิทธิ์ในฟังก์ชันวัตถุประสงค์ (ขนาด \(n \times 1\)) |
\(\mathbf{x}\) | เวกเตอร์ตัวแปรตัดสินใจ (ขนาด \(n \times 1\)) |
\(\mathbf{A}\) | เมทริกซ์สัมประสิทธิ์ข้อจำกัด (ขนาด \(m \times n\)) |
\(\mathbf{b}\) | เวกเตอร์ค่าข้อจำกัดฝั่งขวา (RHS) (ขนาด \(m \times 1\)) |
เราจะเขียนรูปของเมตริกซ์เสมอ เพื่อให้ง่ายต่อนำไปเขียนโปรแกรมเพื่อหาคำตอบด้วยชุดคำสั่ง
6.3 การหาคำตอบด้วยชุดคำสั่ง lpSolve
lpSolve
คือ แพ็กเกจในภาษา R สำหรับการแก้ ปัญหา Linear Programming (LP) และ Integer Linear Programming (ILP)
ใช้สำหรับ หา “ค่าที่ดีที่สุด” (maximize หรือ minimize) ของฟังก์ชันวัตถุประสงค์
ภายใต้ข้อจำกัดที่เป็น สมการเชิงเส้น หรือ อสมการเชิงเส้น
สามารถใช้แก้:
LP ปกติ (ตัวแปรเป็นจำนวนจริง)
ILP (ตัวแปรเป็นจำนวนเต็ม)
Transportation problems
Assignment problems
6.3.1 การติดตั้งและการเรียกใช้งานชุดคำสั่ง lpSolve
การติดตั้ง
การเรียกใช้งาน
lpSolve
\[\max Z = 3x_1 + 5x_2 \] ข้อจำกัด: \[\begin{aligned} 2x_1 + x_2 &\leq 100\\ x_1 + 3x_2 &\leq 90\\ x_1, x_2 &\geq 0\end{aligned}\] แปลงเป็นเมทริกซ์
เวกเตอร์ \(\mathbf{c} = \begin{bmatrix}3\\5\end{bmatrix}\), ตัวแปร \(\mathbf{x} = \begin{bmatrix}x_1\\x_2\end{bmatrix}\), เมทริกซ์ข้อจำกัด \(\mathbf{A} = \begin{bmatrix}2 & 1\\1 & 3\end{bmatrix}\),
เวกเตอร์ฝั่งขวา \(\mathbf{b} = \begin{bmatrix}100\\90\end{bmatrix}\)
การหาคำตอบด้วย lpSolve
:
# 0 เลือกใช้ชุดคำสั่ง loSolve
library(lpSolve)
# 1 กำหนดเวกเตอร์สัมประสิทธิ์ Coef
Coef <- c(3, 5)
# 2 เมตริกซ์ข้อจำกัด A
A <- matrix(c(2, 1, 1, 3), nrow = 2, byrow = TRUE)
# 3 เวคเตอร์ทิศทางข้อจำกัด
directions <- c("<=", "<=")
# 4 เมตริกซ์ b (ใช้เวคเตอร์ได้เลย)
b <- c(100, 90)
# 5 หาคำตอบ
result <- lp( direction = "max", # min หรือ max
objective.in = Coef, # เวกเตอร์สัมประสิทธิ์ Coef
const.mat = A, # เมตริกซ์ข้อจำกัด A
const.dir = directions, # เวคเตอร์ทิศทางข้อจำกัด
const.rhs = b) # เมตริกซ์ b
# ุ6 แสดงผลลัพธ์
result$solution # ค่าตัวแปร x1 และ x2 ตามลำดับ
[1] 42 16
[1] 206
6.4 ตัวอย่างประเภทปัญหาเศรษฐศาสตร์ที่ใช้ LP
Linear Programming ในเศรษฐศาสตร์ = ใช้ แก้ปัญหาการตัดสินใจอย่างมีข้อจำกัด
โดยมุ่งหา “การจัดสรรทรัพยากรอย่างเหมาะสมที่สุด” ภายใต้เงื่อนไขต่าง ๆ เช่น
เพิ่มกำไรสูงสุด
ลดต้นทุนต่ำสุด
ใช้ทรัพยากรจำกัดให้ได้ผลลัพธ์ดีที่สุด
6.4.1 การผลิต (Production)
บริษัทแห่งหนึ่งผลิตสินค้า A, B และ C
สินค้า A ทำกำไร 6 บาทต่อหน่วย, สินค้า B ทำกำไร 8 บาทต่อหน่วย, และสินค้า C ทำกำไร 5 บาทต่อหน่วย แต่ละหน่วยของสินค้าใช้ทรัพยากรดังนี้:
วัตถุดิบ: สินค้า A ใช้ 2 หน่วย, B ใช้ 1 หน่วย, C ใช้ 1 หน่วย
แรงงาน: สินค้า A ใช้ 1 ชั่วโมง, B ใช้ 3 ชั่วโมง, C ใช้ 2 ชั่วโมง
เครื่องจักร: สินค้า A ใช้ 2 ชั่วโมง, B ใช้ 2 ชั่วโมง, C ใช้ 1 ชั่วโมง
โรงงานมีวัตถุดิบ 100 หน่วย, เวลาแรงงาน 120 ชั่วโมง และเครื่องจักร 150 ชั่วโมง บริษัทควรผลิตสินค้าแต่ละชนิดเท่าใดเพื่อให้กำไรสูงสุด?
วิธีทำ
เขียนเป็นตารางสรุปได้ดังนี้
รายการ | สินค้า A | สินค้า B | สินค้า C |
---|---|---|---|
กำไรต่อหน่วย (บาท) | 6 | 8 | 5 |
การใช้วัตถุดิบ (หน่วย) | 2 | 1 | 1 |
การใช้แรงงาน (ชั่วโมง) | 1 | 3 | 2 |
การใช้เครื่องจักร (ชั่วโมง) | 2 | 2 | 1 |
ข้อจำกัดรวม | \(\leq\) 100 (วัตถุดิบ) | \(\leq\) 120 (แรงงาน) | \(\leq\) 150 (เครื่องจักร) |
ฟังก์ชันเชิงคณิตศาสตร์ \[\max Z = 6A + 8B + 5C\] ข้อจำกัด: \[\begin{aligned} 2A + B + C &\leq 100\\ A + 3B + 2C &\leq 120\\ 2A + 2B + C &\leq 150\\ A, B, C &\geq 0 \end{aligned}\] เมตริกซ์รูปแบบ
\[ \mathbf{c} = \begin{bmatrix} 6 \\ 8 \\ 5 \end{bmatrix}, \quad \mathbf{x} = \begin{bmatrix} A \\ B \\ C \end{bmatrix},\quad \mathbf{\Pi} = \begin{bmatrix} 2 & 1 & 1\\ 1 & 3 & 2\\ 2 & 2 & 1 \end{bmatrix}, \quad \mathbf{b} = \begin{bmatrix} 100\\ 120\\ 150 \end{bmatrix} \]
ต้องเปลี่ยนเปลี่ยนชื่อเมตริกซ์ A เป็น \(\Pi\) เพื่อป้องกันการสับสนกับสินค้า A
การหาคำตอบด้วย lpSolve
:
# 0 เลือกใช้ชุดคำสั่ง loSolve
library(lpSolve)
# 1 กำหนดเวกเตอร์สัมประสิทธิ์ Coef
Coef <- c(6, 8, 5)
# 2 เมตริกซ์ข้อจำกัด Pi
Pi <- matrix(c(2, 1, 1,
1, 3, 2,
2, 2, 1), nrow = 3, byrow = TRUE)
# 3 เวคเตอร์ทิศทางข้อจำกัด
directions <- c("<=", "<=", "<=")
# 4 เมตริกซ์ b (ใช้เวคเตอร์ได้เลย)
b <- c(100, 120, 150)
# 5 หาคำตอบ
result <- lp( direction = "max", # min หรือ max
objective.in = Coef, # เวกเตอร์สัมประสิทธิ์ Coef
const.mat = Pi, # เมตริกซ์ข้อจำกัด A
const.dir = directions, # เวคเตอร์ทิศทางข้อจำกัด
const.rhs = b) # เมตริกซ์ b
# ุ6 แสดงผลลัพธ์
result$solution # สินค้า A B และ C ตามลำดับ
[1] 36 28 0
[1] 440
6.4.2 การลงทุน (Investment)
นักลงทุนมีงบลงทุน 1,000 บาท มี 3 โครงการ A, B และ C ให้เลือกลงทุน
ผลตอบแทนต่อหน่วยลงทุน:
- A: 12%, B: 10%, C: 15%
ความเสี่ยงต่อหน่วย:
- A: 0.5 หน่วย, B: 0.8 หน่วย, C: 0.3 หน่วย กำหนดให้:
เงินลงทุนรวมไม่เกิน 1,000 บาท
ความเสี่ยงรวมไม่เกิน 500 หน่วย
ต้องลงทุนในโครงการ A อย่างน้อย 100 บาท
ควรลงทุนในแต่ละโครงการอย่างไรเพื่อให้ผลตอบแทนสูงสุด?
วิธีทำ
ตารางสรุปข้อมูลการลงทุน
รายการ | โครงการ A | โครงการ B | โครงการ C |
---|---|---|---|
ผลตอบแทนต่อหน่วยลงทุน (%) | 12% | 10% | 15% |
ความเสี่ยงต่อหน่วย | 0.5 หน่วย | 0.8 หน่วย | 0.3 หน่วย |
ตารางสรุปเงื่อนไขข้อจำกัด
เงื่อนไข | ข้อมูล |
---|---|
เงินลงทุนรวม | ไม่เกิน 1,000 บาท |
ความเสี่ยงรวม | ไม่เกิน 500 หน่วย |
เงินลงทุนในโครงการ A | อย่างน้อย 100 บาท |
ฟังก์ชันเชิงคณิตศาสตร์ \[\max Z = 0.12A + 0.10B + 0.15C\] ข้อจำกัด: \[\begin{aligned} A + B + C &\leq 1000\\ 0.5A + 0.8B + 0.3C &\leq 500\\ A &\geq 100\\ A, B, C &\geq 0\end{aligned}\] เมตริกซ์รูปแบบ \[\mathbf{c} = \begin{bmatrix} 0.12 \\ 0.10 \\ 0.15 \end{bmatrix} \quad \mathbf{\Pi} = \begin{bmatrix} 1 & 1 & 1\\ 0.5 & 0.8 & 0.3\\ -1 & 0 & 0 \end{bmatrix} \quad,\mathbf{x} = \begin{bmatrix} A\\ B\\ C \end{bmatrix}\quad, \mathbf{b} = \begin{bmatrix} 1000\\ 500\\ -100 \end{bmatrix}\]
ต้องเปลี่ยนเปลี่ยนชื่อเมตริกซ์ A เป็น \(\Pi\) เพื่อป้องกันการสับสนกับโครงการ A
การหาคำตอบด้วย lpSolve
:
# 0 เลือกใช้ชุดคำสั่ง loSolve
library(lpSolve)
# 1 กำหนดเวกเตอร์สัมประสิทธิ์ Coef
Coef <- c(0.12, 0.10, 0.15)
# 2 เมตริกซ์ข้อจำกัด Pi
Pi <- matrix(c(1, 1, 1,
0.5, 0.8, 0.3,
-1, 0, 0), nrow = 3, byrow = TRUE)
# 3 เวคเตอร์ทิศทางข้อจำกัด
directions <- c("<=", "<=", "<=")
# 4 เมตริกซ์ b (ใช้เวคเตอร์ได้เลย)
b <- c(1000, 500, -100)
# 5 หาคำตอบ
result <- lp( direction = "max", # min หรือ max
objective.in = Coef, # เวกเตอร์สัมประสิทธิ์ Coef
const.mat = Pi, # เมตริกซ์ข้อจำกัด A
const.dir = directions, # เวคเตอร์ทิศทางข้อจำกัด
const.rhs = b) # เมตริกซ์ b
# ุ6 แสดงผลลัพธ์
result$solution # โครงการ A B และ C ตามลำดับ
[1] 100 0 900
[1] 147
6.4.3 การขนส่ง (Transportation)
โรงงานสองแห่ง A และ B มีสินค้าพร้อมส่งรวม 700 หน่วย
โรงงาน A มีสินค้า 300 หน่วย และโรงงาน B มีสินค้า 400 หน่วย
สินค้าจะถูกส่งไปยังตลาด 3 แห่งคือ ตลาด 1, ตลาด 2 และตลาด 3
ความต้องการสินค้า:
ตลาด 1 ต้องการ 250 หน่วย
ตลาด 2 ต้องการ 200 หน่วย
ตลาด 3 ต้องการ 250 หน่วย
ค่าขนส่งต่อหน่วย:
จาก A ไป ตลาด 1 = 2 บาท, ตลาด 2 = 4 บาท, ตลาด 3 = 5 บาท
จาก B ไป ตลาด 1 = 3 บาท, ตลาด 2 = 1 บาท, ตลาด 3 = 7 บาท
โรงงานควรจัดการขนส่งสินค้าอย่างไรเพื่อให้ต้นทุนการขนส่งต่ำที่สุด?
วิธีทำ ส่งสินค้าจากคลัง A (300 หน่วย) และ B (400 หน่วย) ไปยังตลาด 1, 2, 3
ค่าขนส่งต่อหน่วย:
ตลาด 1 | ตลาด 2 | ตลาด 3 | |
---|---|---|---|
คลัง A | 2 | 4 | 5 |
คลัง B | 3 | 1 | 7 |
ความต้องการ:
ตลาด 1 ต้องการ 250
ตลาด 2 ต้องการ 200
ตลาด 3 ต้องการ 250
กำหนดให้ \(x_{ij}\) คือจำนวนสินค้าจากคลัง \(i\) ไปยังตลาด \(j\) โดยที่ \(i=\{A,B\}\) และ \(j=1,2,3\)
ฟังก์ชันเชิงคณิตศาสตร์ \[\min Z = 2x_{A1} + 4x_{A2} + 5x_{A3} + 3x_{B1} + 1x_{B2} + 7x_{B3}\] ข้อจำกัด: \[\begin{aligned} x_{A1} + x_{A2} + x_{A3} &\leq 300\\ x_{B1} + x_{B2} + x_{B3} &\leq 400\\ x_{A1} + x_{B1} &= 250\\ x_{A2} + x_{B2} &= 200\\ x_{A3} + x_{B3} &= 250\\ x_{ij} &\geq 0\end{aligned}\]
รูปแบบเมตริกซ์
เวกเตอร์ \(\mathbf{x} = [x_{A1}, x_{A2}, x_{A3}, x_{B1}, x_{B2}, x_{B3}]^T\) \[\mathbf{c} = \begin{bmatrix} 2\\ 4\\ 5\\ 3\\ 1\\ 7 \end{bmatrix} ,\quad \mathbf{A} = \begin{bmatrix} 1 & 1 & 1 & 0 & 0 & 0\\ 0 & 0 & 0 & 1 & 1 & 1\\ 1 & 0 & 0 & 1 & 0 & 0\\ 0 & 1 & 0 & 0 & 1 & 0\\ 0 & 0 & 1 & 0 & 0 & 1 \end{bmatrix} ,\quad \mathbf{x} = \begin{bmatrix} x_{A1}\\ x_{A2}\\ x_{A3}\\ x_{B1}\\ x_{B2}\\ x_{B3} \end{bmatrix},\quad \mathbf{b} = \begin{bmatrix} 300\\ 400\\ 250\\ 200\\ 250 \end{bmatrix}\]
การหาคำตอบด้วย lpSolve
:
# 0 เลือกใช้ชุดคำสั่ง loSolve
library(lpSolve)
# 1 กำหนดเวกเตอร์สัมประสิทธิ์ Coef
Coef <- c(2, 4, 5, 3, 1, 7)
# 2 เมตริกซ์ข้อจำกัด Pi
Pi <- matrix(c(1, 1, 1, 0, 0, 0,
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 เวคเตอร์ทิศทางข้อจำกัด
directions <- c("<=", "<=", "=", "=", "=")
# 4 เมตริกซ์ b (ใช้เวคเตอร์ได้เลย)
b <- c(300, 400, 250, 200, 250)
# 5 หาคำตอบ
result <- lp( direction = "min", # min หรือ max
objective.in = Coef, # เวกเตอร์สัมประสิทธิ์ Coef
const.mat = Pi, # เมตริกซ์ข้อจำกัด A
const.dir = directions, # เวคเตอร์ทิศทางข้อจำกัด
const.rhs = b) # เมตริกซ์ b
# ุ6 แสดงผลลัพธ์
result$solution # x_A1, x_A2, x_A3, x_B1, x_B2, x_B3
[1] 50 0 250 200 200 0
[1] 2150
6.4.4 การใช้ทรัพยากร (Resource Allocation) แรงงาน
โรงงานมีแรงงาน 80 คน ต้องจัดสรรคนทำงาน 3 ประเภท ได้แก่ งาน A, งาน B และงาน C
รายได้ต่อคน:
งาน A = 100 บาท
งาน B = 120 บาท
งาน C = 90 บาท
กำหนดเงื่อนไข:
งาน A ต้องมีแรงงานไม่น้อยกว่า 10 คน
งาน B ต้องมีแรงงานไม่น้อยกว่า 20 คน
จำนวนแรงงานในงาน C ต้องไม่น้อยกว่าจำนวนแรงงานในงาน A
ควรจัดสรรแรงงานในแต่ละงานอย่างไรเพื่อให้รายได้รวมสูงสุด?
วิธีทำ
โรงงานมีแรงงาน 80 คน ต้องกระจายไปยังงาน A, B, และ C - รายได้ต่อหน่วยแรงงาน: - งาน A: 100 บาท - งาน B: 120 บาท - งาน C: 90 บาท - เงื่อนไข: - งาน A ต้องใช้ไม่น้อยกว่า 10 คน - งาน B ต้องใช้อย่างน้อย 20 คน - งาน C ต้องใช้คนไม่น้อยกว่างาน A
ฟังก์ชันเชิงคณิตศาสตร์ \[\max Z = 100x_1 + 120x_2 + 90x_3\] ข้อจำกัด: \[\begin{aligned} x_1 + x_2 + x_3 &= 80\rightarrow& x_1 + x_2 + x_3 = 80\\ x_1 &\geq 10 \rightarrow& -x_1\leq -10\\ x_2 &\geq 20 \rightarrow& -x_2\leq -20\\ x_3 &\geq x_1 \rightarrow& -x_1+x_3\leq 0\\ x_i &\geq 0&\end{aligned} \]
รูปแบบเมตริกซ์ \[ \mathbf{c} = \begin{bmatrix} 100\\120\\90 \end{bmatrix} ,\quad \mathbf{x} = \begin{bmatrix} x_1\\x_2\\x_3 \end{bmatrix},\quad \mathbf{A} = \begin{bmatrix} 1 & 1 & 1\\ -1 & 0 & 0\\ 0 & -1 & 0\\ -1 & 0 & 1 \end{bmatrix} ,\quad \mathbf{b} = \begin{bmatrix} 80\\ -10\\ -20\\ 0 \end{bmatrix} \]
การหาคำตอบด้วย lpSolve
:
# 0 เลือกใช้ชุดคำสั่ง loSolve
library(lpSolve)
# 1 กำหนดเวกเตอร์สัมประสิทธิ์ Coef
Coef <- c(100, 120, 90)
# 2 เมตริกซ์ข้อจำกัด A
A <- matrix(c(1, 1, 1,
-1, 0, 0,
0, -1, 0,
-1, 0, 1), nrow = 4, byrow = TRUE)
# 3 เวคเตอร์ทิศทางข้อจำกัด
directions <- c("=", "<=", "<=", "<=")
# 4 เมตริกซ์ b (ใช้เวคเตอร์ได้เลย)
b <- c(80, -10, -20, 0)
# 5 หาคำตอบ
result <- lp( direction = "max", # min หรือ max
objective.in = Coef, # เวกเตอร์สัมประสิทธิ์ Coef
const.mat = A, # เมตริกซ์ข้อจำกัด A
const.dir = directions, # เวคเตอร์ทิศทางข้อจำกัด
const.rhs = b) # เมตริกซ์ b
# ุ6 แสดงผลลัพธ์
result$solution # x1, x2 x3 ตามลำดับ
[1] 10 70 0
[1] 9400
6.4.5 การใช้ทรัพยากร (Resource Allocation) งบประมาณ
บริษัทควรจัดสรรงบประมาณอย่างไรในแต่ละช่องทางเพื่อให้ผลตอบแทนรวมสูงสุด? ถ้าบริษัทมีงบการตลาด 500,000 บาท ต้องกระจายงบประมาณไปยัง 3 ช่องทาง ได้แก่ โฆษณาทีวี, โฆษณาออนไลน์ และกิจกรรมอีเวนต์ โดยมีผลตอบแทนการลงทุน และเงื่อนไขงบประมาณดังนี้
ช่องทางโฆษณา | ผลตอบแทนการลงทุน (ROI) | เงื่อนไขงบประมาณ |
---|---|---|
โฆษณาทีวี | 15% ต่อบาท | ไม่เกิน 200,000 บาท |
โฆษณาออนไลน์ | 20% ต่อบาท | ไม่น้อยกว่า 100,000 บาท |
กิจกรรมอีเวนต์ | 10% ต่อบาท | ไม่เกิน 150,000 บาท |
วิธีทำ
บริษัทมีงบการตลาด 500,000 บาท ต้องแจกจ่ายให้กิจกรรมโฆษณา 3 ช่องทาง:
ทีวี (\(x_1\)), ออนไลน์ (\(x_2\)) และอีเวนต์ (\(x_3\))
ผลตอบแทน (ROI ต่อหน่วย): 0.15, 0.20, 0.10
ข้อจำกัด:
ทีวีลงทุนไม่เกิน 200,000
ออนไลน์อย่างน้อย 100,000
อีเวนต์ไม่เกิน 150,000
สามารถเขียนฟังก์ชันเชิงคณิตศาสตร์ \[\max Z = 0.15x_1 + 0.20x_2 + 0.10x_3\] ข้อจำกัด: \[\begin{aligned} x_1 + x_2 + x_3 &= 500000\\ x_1 &\leq 200000\\ x_2 &\geq 100000\\ x_3 &\leq 150000\\ x_i &\geq 0, i =1,2,3\end{aligned}\] รูปแบบเมตริกซ์ \[\mathbf{c} = \begin{bmatrix} 0.15\\ 0.20\\ 0.10 \end{bmatrix} \quad \mathbf{x} = \begin{bmatrix} x_1\\ x_2\\ x_3 \end{bmatrix} \quad \mathbf{A} = \begin{bmatrix} 1 & 1 & 1\\ 1 & 0 & 0\\ 0 & -1 & 0\\ 0 & 0 & 1 \end{bmatrix} \quad \mathbf{b} = \begin{bmatrix} 500000\\ 200000\\ -100000\\ 150000 \end{bmatrix}\]
การหาคำตอบด้วย lpSolve
:
# กำหนดให้แสดงผลลัพธ์เป็นตัวเลขไม่เกิน 999 ตำแหน่ง
options(scipen = 999)
# 0 เลือกใช้ชุดคำสั่ง loSolve
library(lpSolve)
# 1 กำหนดเวกเตอร์สัมประสิทธิ์ Coef
Coef <- c(0.15, 0.20, 0.10)
# 2 เมตริกซ์ข้อจำกัด A
A <- matrix(c(1, 1, 1,
1, 0, 0,
0, -1, 0,
0, 0, 1), nrow = 4, byrow = TRUE)
# 3 เวคเตอร์ทิศทางข้อจำกัด
directions <- c("=","<=" ,"<=","<=")
# 4 เมตริกซ์ b (ใช้เวคเตอร์ได้เลย)
b <- c(500000, 200000, -100000, 150000)
# 5 หาคำตอบ
result <- lp( direction = "max", # min หรือ max
objective.in = Coef, # เวกเตอร์สัมประสิทธิ์ Coef
const.mat = A, # เมตริกซ์ข้อจำกัด A
const.dir = directions, # เวคเตอร์ทิศทางข้อจำกัด
const.rhs = b) # เมตริกซ์ b
# ุ6 แสดงผลลัพธ์
result$solution # ค่าตัวแปร x1 x2 และ x3 ตามลำดับ
[1] 0 500000 0
[1] 100000